package main import ( "fmt" "database/sql" _ "github.com/lib/pq" ) type databaseConfig struct { Host string Port int User string Pass string Name string } type userData struct { nameserver string zonename string hostname string tsigkey string } func prepareDatabase() (*sql.DB, error) { dbconf := config.Database psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s " + "sslmode=disable", dbconf.Host, dbconf.Port, dbconf.User, dbconf.Pass, dbconf.Name) db, err := sql.Open("postgres", psqlInfo) if err != nil { return nil, err } _, err = db.Exec("CREATE TABLE IF NOT EXISTS users " + "(id SERIAL PRIMARY KEY, username VARCHAR(255) NULL, " + "password VARCHAR(255) NULL, salt VARCHAR(255) NULL, " + "nameserver VARCHAR(255) NULL, zone VARCHAR(255) NULL, " + "hostname VARCHAR(255) NULL, tsig VARCHAR(255) NULL)") if err != nil { db.Close() return nil, err } return db, nil } func getPasswordForUser(db *sql.DB, username string) ([]byte, bool) { var password []byte row := db.QueryRow("SELECT password FROM users WHERE username=$1", username) err := row.Scan(&password) if err != nil { if err == sql.ErrNoRows { return nil, false } else { panic(err) } } return password, true } func getDataForUser(db *sql.DB, username string) (userData, error) { var data userData row := db.QueryRow("SELECT nameserver, zone, hostname, tsig " + "FROM users WHERE username=$1", username) err := row.Scan(&data.nameserver, &data.zonename, &data.hostname, &data.tsigkey) if err != nil { return data, err } return data, nil }