[TASK] add database
This commit is contained in:
		
							parent
							
								
									17890122cf
								
							
						
					
					
						commit
						0208dc30b5
					
				|  | @ -0,0 +1,79 @@ | |||
| // Package that provides the functionality to open, close and use a database
 | ||||
| package database | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/jinzhu/gorm" | ||||
| 	_ "github.com/jinzhu/gorm/dialects/postgres" | ||||
| 	_ "github.com/jinzhu/gorm/dialects/sqlite" | ||||
| 	_ "github.com/jinzhu/gorm/dialects/mysql" | ||||
| 
 | ||||
| 	"github.com/genofire/golang-lib/lib/log" | ||||
| ) | ||||
| 
 | ||||
| // Database connection for writing purposes
 | ||||
| var Write *gorm.DB | ||||
| 
 | ||||
| // Database connection for reading purposes
 | ||||
| var Read *gorm.DB | ||||
| 
 | ||||
| // Configuration files
 | ||||
| var ( | ||||
| 	config  *Config | ||||
| 	runtime []interface{} | ||||
| ) | ||||
| 
 | ||||
| // Configuration of the database connection
 | ||||
| type Config struct { | ||||
| 	// type of the database, currently supports sqlite and postgres
 | ||||
| 	Type string | ||||
| 	// connection configuration
 | ||||
| 	Connection string | ||||
| 	// create another connection for reading only
 | ||||
| 	ReadConnection string | ||||
| 	// enable logging of the generated sql string
 | ||||
| 	Logging bool | ||||
| } | ||||
| 
 | ||||
| // Function to open a database and set the given configuration
 | ||||
| func Open(c Config) (err error) { | ||||
| 	writeLog := log.Log.WithField("db", "write") | ||||
| 	config = &c | ||||
| 	Write, err = gorm.Open(config.Type, config.Connection) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	Write.SingularTable(true) | ||||
| 	Write.LogMode(c.Logging) | ||||
| 	Write.SetLogger(writeLog) | ||||
| 	Write.Callback().Create().Remove("gorm:update_time_stamp") | ||||
| 	Write.Callback().Update().Remove("gorm:update_time_stamp") | ||||
| 	if len(config.ReadConnection) > 0 { | ||||
| 		readLog := log.Log.WithField("db", "read") | ||||
| 		Read, err = gorm.Open(config.Type, config.ReadConnection) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		Read.SingularTable(true) | ||||
| 		Read.LogMode(c.Logging) | ||||
| 		Read.SetLogger(readLog) | ||||
| 		Read.Callback().Create().Remove("gorm:update_time_stamp") | ||||
| 		Read.Callback().Update().Remove("gorm:update_time_stamp") | ||||
| 	} else { | ||||
| 		Read = Write | ||||
| 	} | ||||
| 	Write.AutoMigrate(runtime...) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Function to safely close the database
 | ||||
| func Close() { | ||||
| 	Write.Close() | ||||
| 	if len(config.ReadConnection) > 0 { | ||||
| 		Read.Close() | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Function to add a model to the runtime
 | ||||
| func AddModel(m interface{}) { | ||||
| 	runtime = append(runtime, m) | ||||
| } | ||||
|  | @ -0,0 +1,84 @@ | |||
| // Package that provides the functionality to open, close and use a database
 | ||||
| package database | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
| 
 | ||||
| type TestModel struct { | ||||
| 	ID    int64 | ||||
| 	Value string `gorm:"type:varchar(255);column:value" json:"value"` | ||||
| } | ||||
| 
 | ||||
| // Function to test the error handling for the database opening
 | ||||
| func TestOpenNoDB(t *testing.T) { | ||||
| 	assert := assert.New(t) | ||||
| 
 | ||||
| 	c := Config{} | ||||
| 
 | ||||
| 	err := Open(c) | ||||
| 	assert.Error(err, "error") | ||||
| } | ||||
| 
 | ||||
| // Function to test the opening of one database
 | ||||
| func TestOpenOneDB(t *testing.T) { | ||||
| 	assert := assert.New(t) | ||||
| 	AddModel(&TestModel{}) | ||||
| 
 | ||||
| 	c := Config{ | ||||
| 		Type:       "sqlite3", | ||||
| 		Logging:    true, | ||||
| 		Connection: "file:database?mode=memory", | ||||
| 	} | ||||
| 	var count int64 | ||||
| 
 | ||||
| 	err := Open(c) | ||||
| 	assert.NoError(err, "no error") | ||||
| 
 | ||||
| 	Write.Create(&TestModel{Value: "first"}) | ||||
| 	Write.Create(&TestModel{Value: "secound"}) | ||||
| 
 | ||||
| 	var list []*TestModel | ||||
| 	Read.Find(&list).Count(&count) | ||||
| 	assert.Equal(int64(2), count, "not enought entries") | ||||
| 	Close() | ||||
| } | ||||
| 
 | ||||
| // Function to test the opening of a second database
 | ||||
| func TestOpenTwoDB(t *testing.T) { | ||||
| 	assert := assert.New(t) | ||||
| 	AddModel(&TestModel{}) | ||||
| 	c := Config{ | ||||
| 		Type:           "sqlite3", | ||||
| 		Logging:        true, | ||||
| 		Connection:     "file:database?mode=memory", | ||||
| 		ReadConnection: "file/", | ||||
| 	} | ||||
| 
 | ||||
| 	err := Open(c) | ||||
| 	assert.Error(err, "no error found") | ||||
| 
 | ||||
| 	c = Config{ | ||||
| 		Type:           "sqlite3", | ||||
| 		Logging:        true, | ||||
| 		Connection:     "file:database?mode=memory", | ||||
| 		ReadConnection: "file:database2?mode=memory", | ||||
| 	} | ||||
| 	var count int64 | ||||
| 
 | ||||
| 	err = Open(c) | ||||
| 	assert.NoError(err, "no error") | ||||
| 
 | ||||
| 	Write.Create(&TestModel{Value: "first"}) | ||||
| 	Write.Create(&TestModel{Value: "secound"}) | ||||
| 
 | ||||
| 	var list []*TestModel | ||||
| 	Write.Find(&list).Count(&count) | ||||
| 	assert.Equal(int64(2), count, "not enought entries") | ||||
| 
 | ||||
| 	result := Read.Find(&list) | ||||
| 	assert.Error(result.Error, "error, because it is the wrong database") | ||||
| 	Close() | ||||
| } | ||||
		Loading…
	
		Reference in New Issue