//go:build pgsql // +build pgsql /* Copyright Azareal 2016 - 2020 */ /* Super experimental and incomplete. DON'T USE IT YET! */ package main import ( "database/sql" "strings" c "git.tuxpa.in/a/gosora/common" qgen "git.tuxpa.in/a/gosora/query_gen" _ "github.com/lib/pq" ) // TODO: Add support for SSL for all database drivers, not just pgsql var dbSslmode = "disable" // verify-full func init() { dbAdapter = "pgsql" _initDatabase = initPgsql } func initPgsql() (err error) { // TODO: Investigate connect_timeout to see what it does exactly and whether it's relevant to us var _dbpassword string if c.DbConfig.Password != "" { _dbpassword = " password='" + _escape_bit(c.DbConfig.Password) + "'" } // TODO: Move this bit to the query gen lib db, err = sql.Open("postgres", "host='"+_escape_bit(c.DbConfig.Host)+"' port='"+_escape_bit(c.DbConfig.Port)+"' user='"+_escape_bit(c.DbConfig.Username)+"' dbname='"+_escape_bit(c.DbConfig.Dbname)+"'"+_dbpassword+" sslmode='"+dbSslmode+"'") if err != nil { return err } // Make sure that the connection is alive err = db.Ping() if err != nil { return err } // Set the number of max open connections. How many do we need? Might need to do some tests. db.SetMaxOpenConns(64) db.SetMaxIdleConns(32) // Only hold connections open for five seconds to avoid accumulating a large number of stale connections //db.SetConnMaxLifetime(5 * time.Second) db.SetConnMaxLifetime(c.DBTimeout()) err = _gen_pgsql() if err != nil { return err } // Ready the query builder qgen.Builder.SetConn(db) err = qgen.Builder.SetAdapter("pgsql") if err != nil { return err } // TO-DO Handle the queries which the query generator can't handle yet return nil } func _escape_bit(bit string) string { // TODO: Write a custom parser, so that backslashes work properly in the sql.Open string. Do something similar for the database driver, if possible? return strings.Replace(bit, "'", "\\'", -1) }