package main import ( "fmt" "database/sql" _ "github.com/lib/pq" ) //TODO: move into separate config file? const ( DBHost = "127.0.0.1" DBPort = 5432 DBUser = "username" DBPass = "password" DBName = "database" ) type userData struct { nameserver string zonename string hostname string tsigkey string } func prepareDatabase() (*sql.DB, error) { psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s " + "sslmode=disable", DBHost, DBPort, DBUser, DBPass, DBName) 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) (string, bool) { var password string row := db.QueryRow("SELECT password FROM users WHERE username=$1", username) err := row.Scan(&password) if err != nil { if err == sql.ErrNoRows { return "", 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 }