rqlite.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package database
  2. import (
  3. "errors"
  4. "github.com/gravitl/netmaker/servercfg"
  5. "github.com/rqlite/gorqlite"
  6. )
  7. // RQliteDatabase - the rqlite db connection
  8. var RQliteDatabase gorqlite.Connection
  9. // RQLITE_FUNCTIONS - all the functions to run with rqlite
  10. var RQLITE_FUNCTIONS = map[string]interface{}{
  11. INIT_DB: initRqliteDatabase,
  12. CREATE_TABLE: rqliteCreateTable,
  13. INSERT: rqliteInsert,
  14. INSERT_PEER: rqliteInsertPeer,
  15. DELETE: rqliteDeleteRecord,
  16. DELETE_ALL: rqliteDeleteAllRecords,
  17. FETCH_ALL: rqliteFetchRecords,
  18. CLOSE_DB: rqliteCloseDB,
  19. }
  20. func initRqliteDatabase() error {
  21. conn, err := gorqlite.Open(servercfg.GetSQLConn())
  22. if err != nil {
  23. return err
  24. }
  25. RQliteDatabase = conn
  26. RQliteDatabase.SetConsistencyLevel("strong")
  27. return nil
  28. }
  29. func rqliteCreateTable(tableName string) error {
  30. _, err := RQliteDatabase.WriteOne("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")
  31. if err != nil {
  32. return err
  33. }
  34. return nil
  35. }
  36. func rqliteInsert(key string, value string, tableName string) error {
  37. if key != "" && value != "" && IsJSONString(value) {
  38. _, err := RQliteDatabase.WriteOne("INSERT OR REPLACE INTO " + tableName + " (key, value) VALUES ('" + key + "', '" + value + "')")
  39. if err != nil {
  40. return err
  41. }
  42. return nil
  43. }
  44. return errors.New("invalid insert " + key + " : " + value)
  45. }
  46. func rqliteInsertPeer(key string, value string) error {
  47. if key != "" && value != "" && IsJSONString(value) {
  48. _, err := RQliteDatabase.WriteOne("INSERT OR REPLACE INTO " + PEERS_TABLE_NAME + " (key, value) VALUES ('" + key + "', '" + value + "')")
  49. if err != nil {
  50. return err
  51. }
  52. return nil
  53. }
  54. return errors.New("invalid peer insert " + key + " : " + value)
  55. }
  56. func rqliteDeleteRecord(tableName string, key string) error {
  57. _, err := RQliteDatabase.WriteOne("DELETE FROM " + tableName + " WHERE key = \"" + key + "\"")
  58. if err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. func rqliteDeleteAllRecords(tableName string) error {
  64. _, err := RQliteDatabase.WriteOne("DELETE TABLE " + tableName)
  65. if err != nil {
  66. return err
  67. }
  68. err = rqliteCreateTable(tableName)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. func rqliteFetchRecord(tableName string, key string) (string, error) {
  75. results, err := FetchRecords(tableName)
  76. if err != nil {
  77. return "", err
  78. }
  79. if results[key] == "" {
  80. return "", errors.New(NO_RECORD)
  81. }
  82. return results[key], nil
  83. }
  84. func rqliteFetchRecords(tableName string) (map[string]string, error) {
  85. row, err := RQliteDatabase.QueryOne("SELECT * FROM " + tableName + " ORDER BY key")
  86. if err != nil {
  87. return nil, err
  88. }
  89. records := make(map[string]string)
  90. for row.Next() { // Iterate and fetch the records from result cursor
  91. var key string
  92. var value string
  93. row.Scan(&key, &value)
  94. records[key] = value
  95. }
  96. if len(records) == 0 {
  97. return nil, errors.New(NO_RECORDS)
  98. }
  99. return records, nil
  100. }
  101. func rqliteCloseDB() {
  102. RQliteDatabase.Close()
  103. }