| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | package databaseimport (	"database/sql"	"errors"	"fmt"	"github.com/gravitl/netmaker/servercfg"	_ "github.com/lib/pq")// PGDB - database object for PostGreSQLvar PGDB *sql.DB// PG_FUNCTIONS - map of db functions for PostGreSQLvar PG_FUNCTIONS = map[string]interface{}{	INIT_DB:      initPGDB,	CREATE_TABLE: pgCreateTable,	INSERT:       pgInsert,	INSERT_PEER:  pgInsertPeer,	DELETE:       pgDeleteRecord,	DELETE_ALL:   pgDeleteAllRecords,	FETCH_ALL:    pgFetchRecords,	CLOSE_DB:     pgCloseDB,}func getPGConnString() string {	pgconf := servercfg.GetSQLConf()	pgConn := fmt.Sprintf("host=%s port=%d user=%s "+		"password=%s dbname=%s sslmode=%s connect_timeout=5",		pgconf.Host, pgconf.Port, pgconf.Username, pgconf.Password, pgconf.DB, pgconf.SSLMode)	return pgConn}func initPGDB() error {	connString := getPGConnString()	var dbOpenErr error	PGDB, dbOpenErr = sql.Open("postgres", connString)	if dbOpenErr != nil {		return dbOpenErr	}	dbOpenErr = PGDB.Ping()	return dbOpenErr}func pgCreateTable(tableName string) error {	statement, err := PGDB.Prepare("CREATE TABLE IF NOT EXISTS " + tableName + " (key TEXT NOT NULL UNIQUE PRIMARY KEY, value TEXT)")	if err != nil {		return err	}	defer statement.Close()	_, err = statement.Exec()	if err != nil {		return err	}	return nil}func pgInsert(key string, value string, tableName string) error {	if key != "" && value != "" && IsJSONString(value) {		insertSQL := "INSERT INTO " + tableName + " (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = $3;"		statement, err := PGDB.Prepare(insertSQL)		if err != nil {			return err		}		defer statement.Close()		_, err = statement.Exec(key, value, value)		if err != nil {			return err		}		return nil	} else {		return errors.New("invalid insert " + key + " : " + value)	}}func pgInsertPeer(key string, value string) error {	if key != "" && value != "" && IsJSONString(value) {		err := pgInsert(key, value, PEERS_TABLE_NAME)		if err != nil {			return err		}		return nil	} else {		return errors.New("invalid peer insert " + key + " : " + value)	}}func pgDeleteRecord(tableName string, key string) error {	deleteSQL := "DELETE FROM " + tableName + " WHERE key = $1;"	statement, err := PGDB.Prepare(deleteSQL)	if err != nil {		return err	}	defer statement.Close()	if _, err = statement.Exec(key); err != nil {		return err	}	return nil}func pgDeleteAllRecords(tableName string) error {	deleteSQL := "DELETE FROM " + tableName	statement, err := PGDB.Prepare(deleteSQL)	if err != nil {		return err	}	defer statement.Close()	if _, err = statement.Exec(); err != nil {		return err	}	return nil}func pgFetchRecords(tableName string) (map[string]string, error) {	row, err := PGDB.Query("SELECT * FROM " + tableName + " ORDER BY key")	if err != nil {		return nil, err	}	records := make(map[string]string)	defer row.Close()	for row.Next() { // Iterate and fetch the records from result cursor		var key string		var value string		row.Scan(&key, &value)		records[key] = value	}	if len(records) == 0 {		return nil, errors.New(NO_RECORDS)	}	return records, nil}func pgCloseDB() {	PGDB.Close()}
 |