2
0

postgres.go 2.9 KB

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