rqlite.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. isConnected: rqliteConnected,
  20. }
  21. func initRqliteDatabase() error {
  22. conn, err := gorqlite.Open(servercfg.GetSQLConn())
  23. if err != nil {
  24. return err
  25. }
  26. RQliteDatabase = conn
  27. RQliteDatabase.SetConsistencyLevel("strong")
  28. return nil
  29. }
  30. func rqliteCreateTable(tableName string) error {
  31. _, err := RQliteDatabase.WriteOne("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")
  32. if err != nil {
  33. return err
  34. }
  35. return nil
  36. }
  37. func rqliteInsert(key string, value string, tableName string) error {
  38. if key != "" && value != "" && IsJSONString(value) {
  39. _, err := RQliteDatabase.WriteOne("INSERT OR REPLACE INTO " + tableName + " (key, value) VALUES ('" + key + "', '" + value + "')")
  40. if err != nil {
  41. return err
  42. }
  43. return nil
  44. }
  45. return errors.New("invalid insert " + key + " : " + value)
  46. }
  47. func rqliteInsertPeer(key string, value string) error {
  48. if key != "" && value != "" && IsJSONString(value) {
  49. _, err := RQliteDatabase.WriteOne("INSERT OR REPLACE INTO " + PEERS_TABLE_NAME + " (key, value) VALUES ('" + key + "', '" + value + "')")
  50. if err != nil {
  51. return err
  52. }
  53. return nil
  54. }
  55. return errors.New("invalid peer insert " + key + " : " + value)
  56. }
  57. func rqliteDeleteRecord(tableName string, key string) error {
  58. _, err := RQliteDatabase.WriteOne("DELETE FROM " + tableName + " WHERE key = \"" + key + "\"")
  59. if err != nil {
  60. return err
  61. }
  62. return nil
  63. }
  64. func rqliteDeleteAllRecords(tableName string) error {
  65. _, err := RQliteDatabase.WriteOne("DELETE TABLE " + tableName)
  66. if err != nil {
  67. return err
  68. }
  69. err = rqliteCreateTable(tableName)
  70. if err != nil {
  71. return err
  72. }
  73. return nil
  74. }
  75. func rqliteFetchRecords(tableName string) (map[string]string, error) {
  76. row, err := RQliteDatabase.QueryOne("SELECT * FROM " + tableName + " ORDER BY key")
  77. if err != nil {
  78. return nil, err
  79. }
  80. records := make(map[string]string)
  81. for row.Next() { // Iterate and fetch the records from result cursor
  82. var key string
  83. var value string
  84. row.Scan(&key, &value)
  85. records[key] = value
  86. }
  87. if len(records) == 0 {
  88. return nil, errors.New(NO_RECORDS)
  89. }
  90. return records, nil
  91. }
  92. func rqliteCloseDB() {
  93. RQliteDatabase.Close()
  94. }
  95. func rqliteConnected() bool {
  96. leader, err := RQliteDatabase.Leader()
  97. return err == nil && len(leader) > 0
  98. }