PageRenderTime 1362ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/vendor/github.com/restream/reindexer/benchmarks/repo/sqlite.go

https://bitbucket.org/asardak/atm-store
Go | 143 lines | 121 code | 22 blank | 0 comment | 35 complexity | a96167543e0f56b0fbbd754cd73179b7 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, MIT, Apache-2.0, MPL-2.0, BSD-3-Clause, BSD-2-Clause
  1. package repo
  2. import (
  3. "log"
  4. "math/rand"
  5. "sync"
  6. "github.com/jmoiron/sqlx"
  7. _ "github.com/mattn/go-sqlite3"
  8. )
  9. type SqliteRepo struct {
  10. db *sqlx.DB
  11. updateLock sync.Mutex
  12. }
  13. func (repo *SqliteRepo) Init() bool {
  14. var err error
  15. if repo.db, err = sqlx.Connect("sqlite3", "/tmp/foo.db?mode=memory&cache=shared"); err != nil {
  16. panic(err)
  17. }
  18. repo.db.SetMaxOpenConns(8)
  19. repo.db.SetMaxIdleConns(8)
  20. return true
  21. }
  22. func (repo *SqliteRepo) Seed(itemsInDataSet int) bool {
  23. if _, err := repo.db.Exec(`DROP TABLE IF EXISTS items`); err != nil {
  24. panic(err)
  25. }
  26. if _, err := repo.db.Exec(`DROP TABLE IF EXISTS items_fts`); err != nil {
  27. panic(err)
  28. }
  29. log.Printf("Seeding data to Sqlite")
  30. sqlStmt := `
  31. CREATE TABLE items (
  32. id INTEGER NOT NULL PRIMARY KEY,
  33. name TEXT,
  34. year INTEGER,
  35. description TEXT
  36. );
  37. CREATE INDEX index_name ON items(name);
  38. CREATE INDEX index_year ON items(year);
  39. CREATE VIRTUAL TABLE items_fts USING fts5 (
  40. id,name,year,description
  41. );
  42. `
  43. if _, err := repo.db.Exec(sqlStmt); err != nil {
  44. panic(err)
  45. }
  46. tx, err := repo.db.Begin()
  47. if err != nil {
  48. panic(err)
  49. }
  50. stmt, err := tx.Prepare("INSERT INTO items(id, name,year,description) VALUES (?,?,?,?)")
  51. stmt2, err := tx.Prepare("INSERT INTO items_fts(id, name,year,description) VALUES (?,?,?,?)")
  52. if err != nil {
  53. panic(err)
  54. }
  55. defer stmt.Close()
  56. for i := 0; i < itemsInDataSet; i++ {
  57. it := newItem(i)
  58. if _, err = stmt.Exec(i, it.Name, it.Year, it.Description); err != nil {
  59. panic(err)
  60. }
  61. if _, err = stmt2.Exec(i, it.Name, it.Year, it.Description); err != nil {
  62. panic(err)
  63. }
  64. }
  65. tx.Commit()
  66. return true
  67. }
  68. func (repo *SqliteRepo) QueryFullText(textQuery func() string, N int, limit int) (ret []*Item) {
  69. stmt, err := repo.db.Preparex("select * from items_fts where description match ? order by rank limit ?")
  70. if err != nil {
  71. log.Fatal(err)
  72. }
  73. defer stmt.Close()
  74. ret = make([]*Item, 0, limit*N)
  75. for i := 0; i < N; i++ {
  76. rows, err := stmt.Queryx(textQuery(), limit)
  77. if err != nil {
  78. panic(err)
  79. }
  80. for rows.Next() {
  81. it := &Item{}
  82. if err = rows.StructScan(it); err != nil {
  83. panic(err)
  84. }
  85. ret = append(ret, it)
  86. }
  87. rows.Close()
  88. }
  89. return ret
  90. }
  91. func (repo *SqliteRepo) QueryByID(N int, onlyQuery bool) (it *Item) {
  92. stmt, err := repo.db.Preparex("select id,name,year,description from items where id = ?")
  93. if err != nil {
  94. log.Fatal(err)
  95. }
  96. return sqlFetchOne(stmt, N, onlyQuery, rand.Int()%itemsInDataSet)
  97. }
  98. func (repo *SqliteRepo) Query2Cond(N int, onlyQuery bool, limit int) (ret []*Item) {
  99. stmt, err := repo.db.Preparex("select id,name,year,description from items where year > ? and name = ? limit ?")
  100. if err != nil {
  101. log.Fatal(err)
  102. }
  103. return sqlFetchAll(stmt, N, onlyQuery, limit, 2010, randString(), limit)
  104. }
  105. func (repo *SqliteRepo) Query1Cond(N int, onlyQuery bool, limit int) (ret []*Item) {
  106. stmt, err := repo.db.Preparex("select id,name,year,description from items where year > ? limit ?")
  107. if err != nil {
  108. log.Fatal(err)
  109. }
  110. return sqlFetchAll(stmt, N, onlyQuery, limit, 2010, limit)
  111. }
  112. func (repo *SqliteRepo) Update(N int) {
  113. stmt, err := repo.db.Preparex("UPDATE items SET name=?,year=?,description=? WHERE id=?")
  114. if err != nil {
  115. log.Fatal(err)
  116. }
  117. sqlUpdate(stmt, 1)
  118. }
  119. func init() {
  120. registerRepo("sqlite", &SqliteRepo{})
  121. }