database.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package database
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/rqlite/gorqlite"
  6. )
  7. const NETWORKS_TABLE_NAME = "networks"
  8. const NODES_TABLE_NAME = "nodes"
  9. const USERS_TABLE_NAME = "users"
  10. const DNS_TABLE_NAME = "dns"
  11. const EXT_CLIENT_TABLE_NAME = "extclients"
  12. const INT_CLIENTS_TABLE_NAME = "intclients"
  13. const DATABASE_FILENAME = "netmaker.db"
  14. var Database gorqlite.Connection
  15. func InitializeDatabase() error {
  16. conn, err := gorqlite.Open("http://")
  17. if err != nil {
  18. return err
  19. }
  20. // sqliteDatabase, _ := sql.Open("sqlite3", "./database/"+dbFilename)
  21. Database = conn
  22. Database.SetConsistencyLevel("strong")
  23. createTables()
  24. return nil
  25. }
  26. func createTables() {
  27. createTable(NETWORKS_TABLE_NAME)
  28. createTable(NODES_TABLE_NAME)
  29. createTable(USERS_TABLE_NAME)
  30. createTable(DNS_TABLE_NAME)
  31. createTable(EXT_CLIENT_TABLE_NAME)
  32. createTable(INT_CLIENTS_TABLE_NAME)
  33. }
  34. func createTable(tableName string) error {
  35. _, err := Database.WriteOne("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")
  36. if err != nil {
  37. return err
  38. }
  39. return nil
  40. }
  41. func isJSONString(value string) bool {
  42. var jsonInt interface{}
  43. return json.Unmarshal([]byte(value), &jsonInt) == nil
  44. }
  45. func Insert(key string, value string, tableName string) error {
  46. if key != "" && value != "" && isJSONString(value) {
  47. _, err := Database.WriteOne("INSERT OR REPLACE INTO " + tableName + " (key, value) VALUES ('" + key + "', '" + value + "')")
  48. if err != nil {
  49. return err
  50. }
  51. return nil
  52. } else {
  53. return errors.New("invalid insert " + key + " : " + value)
  54. }
  55. }
  56. func DeleteRecord(tableName string, key string) error {
  57. _, err := Database.WriteOne("DELETE FROM " + tableName + " WHERE key = \"" + key + "\"")
  58. if err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. func DeleteAllRecords(tableName string) error {
  64. _, err := Database.WriteOne("DELETE TABLE " + tableName)
  65. if err != nil {
  66. return err
  67. }
  68. err = createTable(tableName)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. func FetchRecord(tableName string, key string) (string, error) {
  75. results, err := FetchRecords(tableName)
  76. if err != nil {
  77. return "", err
  78. }
  79. return results[key], nil
  80. }
  81. func FetchRecords(tableName string) (map[string]string, error) {
  82. row, err := Database.QueryOne("SELECT * FROM " + tableName + " ORDER BY key")
  83. if err != nil {
  84. return nil, err
  85. }
  86. records := make(map[string]string)
  87. for row.Next() { // Iterate and fetch the records from result cursor
  88. var key string
  89. var value string
  90. row.Scan(&key, &value)
  91. records[key] = value
  92. }
  93. // log.Println(records)
  94. return records, nil
  95. }