database.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 DELETED_NODES_TABLE_NAME = "deletednodes"
  10. const USERS_TABLE_NAME = "users"
  11. const DNS_TABLE_NAME = "dns"
  12. const EXT_CLIENT_TABLE_NAME = "extclients"
  13. const INT_CLIENTS_TABLE_NAME = "intclients"
  14. const PEERS_TABLE_NAME = "peers"
  15. const DATABASE_FILENAME = "netmaker.db"
  16. // == ERROR CONSTS ==
  17. const NO_RECORD = "no result found"
  18. const NO_RECORDS = "could not find any records"
  19. var Database gorqlite.Connection
  20. func InitializeDatabase() error {
  21. conn, err := gorqlite.Open("http://")
  22. if err != nil {
  23. return err
  24. }
  25. // sqliteDatabase, _ := sql.Open("sqlite3", "./database/"+dbFilename)
  26. Database = conn
  27. Database.SetConsistencyLevel("strong")
  28. createTables()
  29. return nil
  30. }
  31. func createTables() {
  32. createTable(NETWORKS_TABLE_NAME)
  33. createTable(NODES_TABLE_NAME)
  34. createTable(DELETED_NODES_TABLE_NAME)
  35. createTable(USERS_TABLE_NAME)
  36. createTable(DNS_TABLE_NAME)
  37. createTable(EXT_CLIENT_TABLE_NAME)
  38. createTable(INT_CLIENTS_TABLE_NAME)
  39. createTable(PEERS_TABLE_NAME)
  40. }
  41. func createTable(tableName string) error {
  42. _, err := Database.WriteOne("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. }
  48. func isJSONString(value string) bool {
  49. var jsonInt interface{}
  50. return json.Unmarshal([]byte(value), &jsonInt) == nil
  51. }
  52. func Insert(key string, value string, tableName string) error {
  53. if key != "" && value != "" && isJSONString(value) {
  54. _, err := Database.WriteOne("INSERT OR REPLACE INTO " + tableName + " (key, value) VALUES ('" + key + "', '" + value + "')")
  55. if err != nil {
  56. return err
  57. }
  58. return nil
  59. } else {
  60. return errors.New("invalid insert " + key + " : " + value)
  61. }
  62. }
  63. func InsertPeer(key string, value string) error {
  64. if key != "" && value != "" && isJSONString(value) {
  65. _, err := Database.WriteOne("INSERT OR REPLACE INTO " + PEERS_TABLE_NAME + " (key, value) VALUES ('" + key + "', '" + value + "')")
  66. if err != nil {
  67. return err
  68. }
  69. return nil
  70. } else {
  71. return errors.New("invalid peer insert " + key + " : " + value)
  72. }
  73. }
  74. func DeleteRecord(tableName string, key string) error {
  75. _, err := Database.WriteOne("DELETE FROM " + tableName + " WHERE key = \"" + key + "\"")
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. func DeleteAllRecords(tableName string) error {
  82. _, err := Database.WriteOne("DELETE TABLE " + tableName)
  83. if err != nil {
  84. return err
  85. }
  86. err = createTable(tableName)
  87. if err != nil {
  88. return err
  89. }
  90. return nil
  91. }
  92. func FetchRecord(tableName string, key string) (string, error) {
  93. results, err := FetchRecords(tableName)
  94. if err != nil {
  95. return "", err
  96. }
  97. if results[key] == "" {
  98. return "", errors.New(NO_RECORD)
  99. }
  100. return results[key], nil
  101. }
  102. func FetchRecords(tableName string) (map[string]string, error) {
  103. row, err := Database.QueryOne("SELECT * FROM " + tableName + " ORDER BY key")
  104. if err != nil {
  105. return nil, err
  106. }
  107. records := make(map[string]string)
  108. for row.Next() { // Iterate and fetch the records from result cursor
  109. var key string
  110. var value string
  111. row.Scan(&key, &value)
  112. records[key] = value
  113. }
  114. if len(records) == 0 {
  115. return nil, errors.New(NO_RECORDS)
  116. }
  117. // log.Println(records)
  118. return records, nil
  119. }