/api/models/models.go

https://github.com/CovenantSQL/CovenantSQL · Go · 53 lines · 40 code · 10 blank · 3 comment · 6 complexity · e88241d0dbe1ec5af95b4c279935d34d MD5 · raw file

  1. package models
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/CovenantSQL/go-sqlite3-encrypt" // sqlite3 driver
  6. "github.com/go-gorp/gorp"
  7. "github.com/pkg/errors"
  8. )
  9. var (
  10. chaindb *gorp.DbMap
  11. )
  12. // InitModels setup the models package.
  13. func InitModels(dbFile string) error {
  14. return initChainDBConnection(dbFile)
  15. }
  16. // OpenSQLiteDBAsGorp opens a sqlite database an wrapped it in gorp.DbMap.
  17. func OpenSQLiteDBAsGorp(dbFile, mode string, maxOpen, maxIdle int) (db *gorp.DbMap, err error) {
  18. dsn := fmt.Sprintf("%s?_journal=WAL&mode=%s", dbFile, mode)
  19. underdb, err := sql.Open("sqlite3", dsn)
  20. if err != nil {
  21. return nil, errors.Wrapf(err, "unable to open database %q", dsn)
  22. }
  23. underdb.SetMaxOpenConns(maxOpen)
  24. underdb.SetMaxIdleConns(maxIdle)
  25. if err := underdb.Ping(); err != nil {
  26. return nil, errors.Wrapf(err, "ping to database %q failed", dsn)
  27. }
  28. db = &gorp.DbMap{
  29. Db: underdb,
  30. Dialect: gorp.SqliteDialect{},
  31. }
  32. return db, nil
  33. }
  34. func initChainDBConnection(dbFile string) (err error) {
  35. chaindb, err = OpenSQLiteDBAsGorp(dbFile, "ro", 100, 30)
  36. if err != nil {
  37. return err
  38. }
  39. // register tables
  40. chaindb.AddTableWithName(Block{}, "indexed_blocks").SetKeys(false, "Height")
  41. chaindb.AddTableWithName(Transaction{}, "indexed_transactions").SetKeys(false, "BlockHeight", "TxIndex")
  42. return nil
  43. }