package Database import ( "database/sql" "os" "path/filepath" "time" _ "github.com/mattn/go-sqlite3" bolt "go.etcd.io/bbolt" "PackageManager/Variables" ) var ( DB *sql.DB FsDB *bolt.DB ) func InitConfigDir() error { var err error _, err = os.Stat(Variables.ConfigDir) if os.IsNotExist(err) { return os.MkdirAll(Variables.ConfigDir, 0644) } return err } func InitDatabaseFiles() error { var err error // Initialise sqlite3 database for package versioning DB, err = sql.Open( "sqlite3", filepath.Join(Variables.ConfigDir, Variables.DatabaseName), ) if err != nil { return err } // Initialise bolt db for filesystem hashing FsDB, err = bolt.Open( filepath.Join(Variables.ConfigDir, Variables.FsHashDatabaseName), 0600, &bolt.Options{ Timeout: 5 * time.Second, }, ) return err } func init() { var err error err = InitConfigDir() if err != nil { panic(err) } err = InitDatabaseFiles() if err != nil { panic(err) } } func InitBoltDB() error { var ( tx *bolt.Tx err error ) tx, err = FsDB.Begin(true) if err != nil { return err } defer tx.Rollback() _, err = tx.CreateBucketIfNotExists(Variables.FsHashIndexBucket) if err != nil { return err } _, err = tx.CreateBucketIfNotExists(Variables.FsHashPicksBucket) if err != nil { return err } return tx.Commit() } func InitSqlite3DB() error { var ( stmt *sql.Stmt err error ) stmt, err = DB.Prepare(` CREATE TABLE IF NOT EXISTS installed_packages ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(64) NOT NULL, version VARCHAR(64) NOT NULL, installed_at INTEGER NOT NULL ) `) if err != nil { return err } _, err = stmt.Exec() if err != nil { return err } stmt, err = DB.Prepare(` CREATE TABLE IF NOT EXISTS dependancy_linker ( id INTEGER PRIMARY KEY AUTOINCREMENT, package_id INTEGER, dependancy_id INTEGER, FOREIGN KEY(package_id) REFERENCES installed_packages(id), FOREIGN KEY(dependancy_id) REFERENCES installed_packages(id) ) `) if err != nil { return err } _, err = stmt.Exec() return err } func InitDB() error { var err error = InitBoltDB() if err != nil { return err } return InitSqlite3DB() }