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 ( e error ) _, e = os.Stat(Variables.ConfigDir) if os.IsNotExist(e) { return os.MkdirAll(Variables.ConfigDir, 0644) } return e } func InitDatabaseFiles() error { var e error // Initialise sqlite3 database for package versioning DB, e = sql.Open( "sqlite3", filepath.Join(Variables.ConfigDir, Variables.DatabaseName), ) if e != nil { return e } // Initialise bolt db for filesystem hashing FsDB, e = bolt.Open( filepath.Join(Variables.ConfigDir, Variables.FsHashDatabaseName), 0600, &bolt.Options{ Timeout: 5 * time.Second, }) return e } func init() { var e error e = InitConfigDir() if e != nil { panic(e) } e = InitDatabaseFiles() if e != nil { panic(e) } } func InitBoltDB() error { var ( tx *bolt.Tx e error ) tx, e = FsDB.Begin(true) if e != nil { return e } defer tx.Rollback() _, e = tx.CreateBucketIfNotExists(Variables.FsHashIndexBucket) if e != nil { return e } _, e = tx.CreateBucketIfNotExists(Variables.FsHashPicksBucket) if e != nil { return e } e = tx.Commit() return e } func InitSqlite3DB() error { var ( stmt *sql.Stmt e error ) stmt, e = 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 e != nil { return e } _, e = stmt.Exec() if e != nil { return e } stmt, e = 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 e != nil { return e } _, e = stmt.Exec() return e } func InitDB() error { var e error e = InitBoltDB() if e != nil { return e } return InitSqlite3DB() }