github.com/diadata-org/diadata@v1.4.593/pkg/dia/helpers/db/postgres.go (about)

     1  package db
     2  
     3  import (
     4  	"bufio"
     5  	"context"
     6  	"github.com/diadata-org/diadata/pkg/utils"
     7  	"github.com/jackc/pgx/v4/pgxpool"
     8  	"os"
     9  )
    10  
    11  const (
    12  	postgresKey = "postgres_credentials.txt"
    13  
    14  //	reconnectWaitSeconds = 5
    15  //	maxRetry             = 120
    16  )
    17  
    18  func PostgresDatabase() *pgxpool.Pool {
    19  	pool, err := pgxpool.Connect(context.Background(), GetPostgresURL())
    20  	if err != nil {
    21  		log.Error(err)
    22  	}
    23  	return pool
    24  
    25  }
    26  
    27  /*
    28  var postgresClient *pgxpool.Pool
    29  func GetPostgresClient() (*pgx.Conn, error) {
    30  	var err error
    31  	log.Info("connect to postgres server...")
    32  	postgresClient, err = pgxpool.Connect(context.Background(), GetPostgresURL())
    33  	if err != nil {
    34  		log.Error(err)
    35  		return &pgx.Conn{}, err
    36  	}
    37  	log.Info("...connection to postgres server established.")
    38  
    39  	return postgresClient.Conn(), err
    40  }
    41  
    42  func PostgresDatabase() *pgx.Conn {
    43  	connected := false
    44  	var err error
    45  	if postgresClient == nil {
    46  		// during startup - if it does not exist, create it
    47  		postgresClient, err = GetPostgresClient()
    48  		if err == nil {
    49  			connected = true
    50  		}
    51  	}
    52  
    53  	count := 0
    54  	for (!connected || postgresClient.IsClosed()) && count < maxRetry {
    55  		log.Info("Connection to Postgres was lost. Waiting for 5s...")
    56  		time.Sleep(reconnectWaitSeconds * time.Second)
    57  		log.Info("Reconnecting to Postgres...")
    58  		postgresClient, err = GetPostgresClient()
    59  		if err == nil {
    60  			connected = true
    61  		}
    62  		count++
    63  	}
    64  	return postgresClient
    65  }
    66  */
    67  
    68  func GetPostgresURL() (url string) {
    69  	if utils.Getenv("USE_ENV", "false") == "true" {
    70  		return "postgresql://" + os.Getenv("POSTGRES_USER") + ":" + os.Getenv("POSTGRES_PASSWORD") + "@" + os.Getenv("POSTGRES_HOST") + "/" + os.Getenv("POSTGRES_DB")
    71  	}
    72  	if utils.Getenv("EXEC_MODE", "local") == "production" {
    73  		return "postgresql://postgres/postgres?user=postgres&password=" + getPostgresKeyFromSecrets()
    74  	}
    75  	return "postgresql://localhost/postgres?user=postgres&password=" + getPostgresKeyFromSecrets()
    76  }
    77  
    78  func getPostgresKeyFromSecrets() string {
    79  	var lines []string
    80  	var file *os.File
    81  	var err error
    82  	if utils.Getenv("EXEC_MODE", "") == "production" {
    83  		pwd, _ := os.Getwd()
    84  		log.Info("current directory: ", pwd)
    85  		file, err = os.Open("/run/secrets/" + "postgres_credentials")
    86  		if err != nil {
    87  			log.Fatal(err)
    88  		}
    89  	} else {
    90  		file, err = os.Open(os.Getenv("GOPATH") + "/src/github.com/diadata-org/diadata/secrets/" + postgresKey)
    91  		if err != nil {
    92  			log.Fatal(err)
    93  		}
    94  	}
    95  	scanner := bufio.NewScanner(file)
    96  	for scanner.Scan() {
    97  		lines = append(lines, scanner.Text())
    98  	}
    99  	if err = scanner.Err(); err != nil {
   100  		log.Fatal(err)
   101  	}
   102  	if len(lines) != 1 {
   103  		log.Fatal("Secrets file should have exactly one line")
   104  	}
   105  	err = file.Close()
   106  	if err != nil {
   107  		log.Error(err)
   108  	}
   109  	return lines[0]
   110  }