gitlab.nesad.fit.vutbr.cz/blended/libblended@v0.0.0-20221202124402-2bee159339df/catalog/database.go (about)

     1  package catalog
     2  
     3  import (
     4  	"github.com/jinzhu/gorm"
     5  	_ "github.com/jinzhu/gorm/dialects/postgres"
     6  	_ "github.com/jinzhu/gorm/dialects/sqlite"
     7  	"gitlab.nesad.fit.vutbr.cz/blended/libblended/catalog/models"
     8  	// _ "github.com/jinzhu/gorm/dialects/mysql"
     9  	// _ "github.com/jinzhu/gorm/dialects/mssql"
    10  )
    11  
    12  type Database struct {
    13  	dialect          string
    14  	connectionString string
    15  }
    16  
    17  func NewPostgresDatabaseClient(host string, port string, user string, dbName string, password string) (*Database, error) {
    18  	c := new(Database)
    19  	c.dialect = "postgres"
    20  	c.connectionString = "host=" + host + " port=" + port + " user=" + user + " dbname=" + dbName + " password=" + password + " sslmode=disable"
    21  
    22  	err := c.Init()
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	return c, nil
    28  }
    29  
    30  func NewSQLiteDatabaseClient(path string) (*Database, error) {
    31  	c := new(Database)
    32  	c.dialect = "sqlite3"
    33  	c.connectionString = path
    34  
    35  	err := c.Init()
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	return c, nil
    41  }
    42  
    43  func (c *Database) Connect() (*gorm.DB, error) {
    44  	db, err := gorm.Open(c.dialect, c.connectionString)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  
    49  	return db, nil
    50  }
    51  
    52  func (c *Database) Init() error {
    53  	db, err := c.Connect()
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	defer db.Close()
    59  
    60  	// Automatically migrate schema, to keep our schema update
    61  	return db.AutoMigrate(&models.Resource{}).Error
    62  }
    63  
    64  func (c *Database) Create(entity models.IDBEntity) error {
    65  	db, err := c.Connect()
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	defer db.Close()
    71  	return db.Create(entity).Error
    72  }
    73  
    74  func (c *Database) Update(entity models.IDBEntity) error {
    75  	db, err := c.Connect()
    76  	if err != nil {
    77  		return err
    78  	}
    79  
    80  	defer db.Close()
    81  	return db.Save(entity).Error
    82  }
    83  
    84  func (c *Database) Delete(entity models.IDBEntity) error {
    85  	db, err := c.Connect()
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	defer db.Close()
    91  	return db.Unscoped().Delete(entity).Error
    92  }
    93  
    94  func (c *Database) Query(queryFunction func(db *gorm.DB) *gorm.DB) (interface{}, error) {
    95  	db, err := c.Connect()
    96  
    97  	if err != nil {
    98  		return nil, err
    99  	}
   100  
   101  	defer db.Close()
   102  	results := queryFunction(db)
   103  	if db.Error != nil {
   104  		return nil, db.Error
   105  	}
   106  
   107  	return results.Value, results.Error
   108  }