postgres.go 3.0 KB

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