postgres.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package database
  2. import (
  3. "github.com/gravitl/netmaker/servercfg"
  4. "database/sql"
  5. "errors"
  6. _ "github.com/lib/pq"
  7. "fmt"
  8. )
  9. var PGDB *sql.DB
  10. var PG_FUNCTIONS = map[string]interface{}{
  11. INIT_DB: initPGDB,
  12. CREATE_TABLE: pgCreateTable,
  13. INSERT: pgInsert,
  14. INSERT_PEER: pgInsertPeer,
  15. DELETE: pgDeleteRecord,
  16. DELETE_ALL: pgDeleteAllRecords,
  17. FETCH_ALL: pgFetchRecords,
  18. CLOSE_DB: pgCloseDB,
  19. }
  20. func getPGConnString() string{
  21. pgconf := servercfg.GetSQLConf()
  22. pgConn := fmt.Sprintf("host=%s port=%d user=%s "+
  23. "password=%s dbname=%s sslmode=%s",
  24. pgconf.Host, pgconf.Port, pgconf.Username, pgconf.Password, pgconf.DB, pgconf.SSLMode)
  25. return pgConn
  26. }
  27. func initPGDB() error {
  28. connString := getPGConnString()
  29. var dbOpenErr error
  30. PGDB, dbOpenErr = sql.Open("postgres", connString)
  31. if dbOpenErr != nil {
  32. return dbOpenErr
  33. }
  34. dbOpenErr = PGDB.Ping()
  35. return dbOpenErr
  36. }
  37. func pgCreateTable(tableName string) error {
  38. statement, err := PGDB.Prepare("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")
  39. if err != nil {
  40. return err
  41. }
  42. _, err = statement.Exec()
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. }
  48. func pgInsert(key string, value string, tableName string) error {
  49. if key != "" && value != "" && IsJSONString(value) {
  50. insertSQL := "INSERT INTO " + tableName + " (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = $3;"
  51. statement, err := PGDB.Prepare(insertSQL)
  52. if err != nil {
  53. return err
  54. }
  55. _, err = statement.Exec(key, value, value)
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. } else {
  61. return errors.New("invalid insert " + key + " : " + value)
  62. }
  63. }
  64. func pgInsertPeer(key string, value string) error {
  65. if key != "" && value != "" && IsJSONString(value) {
  66. err := pgInsert(key, value, PEERS_TABLE_NAME)
  67. if err != nil {
  68. return err
  69. }
  70. return nil
  71. } else {
  72. return errors.New("invalid peer insert " + key + " : " + value)
  73. }
  74. }
  75. func pgDeleteRecord(tableName string, key string) error {
  76. deleteSQL := "DELETE FROM " + tableName + " WHERE key = $1;"
  77. statement, err := PGDB.Prepare(deleteSQL)
  78. if err != nil {
  79. return err
  80. }
  81. if _, err = statement.Exec(key); err != nil {
  82. return err
  83. }
  84. return nil
  85. }
  86. func pgDeleteAllRecords(tableName string) error {
  87. deleteSQL := "DELETE FROM " + tableName
  88. statement, err := PGDB.Prepare(deleteSQL)
  89. if err != nil {
  90. return err
  91. }
  92. if _, err = statement.Exec(); err != nil {
  93. return err
  94. }
  95. return nil
  96. }
  97. func pgFetchRecords(tableName string) (map[string]string, error) {
  98. row, err := PGDB.Query("SELECT * FROM " + tableName + " ORDER BY key")
  99. if err != nil {
  100. return nil, err
  101. }
  102. records := make(map[string]string)
  103. defer row.Close()
  104. for row.Next() { // Iterate and fetch the records from result cursor
  105. var key string
  106. var value string
  107. row.Scan(&key, &value)
  108. records[key] = value
  109. }
  110. if len(records) == 0 {
  111. return nil, errors.New(NO_RECORDS)
  112. }
  113. return records, nil
  114. }
  115. func pgCloseDB() {
  116. PGDB.Close()
  117. }