| 1 | module main |
| 2 | |
| 3 | import config |
| 4 | import db.pg |
| 5 | import os |
| 6 | |
| 7 | type GitlyDb = pg.DB |
| 8 | |
| 9 | fn connect_db(conf config.Config) !GitlyDb { |
| 10 | if conninfo := first_env_opt(['GITLY_DB_CONNINFO', 'DATABASE_URL'], conf.pg.conninfo) { |
| 11 | db := pg.connect_with_conninfo(conninfo, pg.PoolConfig{})! |
| 12 | return GitlyDb(*db) |
| 13 | } |
| 14 | db := pg.connect( |
| 15 | host: first_env(['GITLY_DB_HOST', 'PGHOST'], conf.pg.host) |
| 16 | port: first_int_env(['GITLY_DB_PORT', 'PGPORT'], conf.pg.port) |
| 17 | dbname: first_env(['GITLY_DB_NAME', 'PGDATABASE'], conf.pg.dbname) |
| 18 | user: first_env(['GITLY_DB_USER', 'PGUSER'], conf.pg.user) |
| 19 | password: first_env(['GITLY_DB_PASSWORD', 'PGPASSWORD'], conf.pg.password) |
| 20 | )! |
| 21 | return GitlyDb(*db) |
| 22 | } |
| 23 | |
| 24 | fn db_backend_name() string { |
| 25 | return 'postgres' |
| 26 | } |
| 27 | |
| 28 | fn db_exec_values(mut db GitlyDb, query string) ![][]string { |
| 29 | rows := db.exec_no_null(query)! |
| 30 | mut values := [][]string{cap: rows.len} |
| 31 | for row in rows { |
| 32 | values << row.vals.clone() |
| 33 | } |
| 34 | return values |
| 35 | } |
| 36 | |
| 37 | fn db_last_insert_id(mut db GitlyDb) int { |
| 38 | return db.last_id() |
| 39 | } |
| 40 | |
| 41 | fn db_column_exists(mut db GitlyDb, table_name string, column_name string) !bool { |
| 42 | rows := db_exec_values(mut db, |
| 43 | 'select column_name from information_schema.columns where table_name = ${sql_literal(table_name.to_lower())} and column_name = ${sql_literal(column_name)}')! |
| 44 | return rows.len > 0 |
| 45 | } |
| 46 | |
| 47 | fn db_bool_column_type() string { |
| 48 | return 'BOOLEAN NOT NULL DEFAULT false' |
| 49 | } |
| 50 | |
| 51 | fn first_env(keys []string, fallback string) string { |
| 52 | for key in keys { |
| 53 | value := os.getenv(key) |
| 54 | if value != '' { |
| 55 | return value |
| 56 | } |
| 57 | } |
| 58 | return fallback |
| 59 | } |
| 60 | |
| 61 | fn first_env_opt(keys []string, fallback string) ?string { |
| 62 | value := first_env(keys, fallback) |
| 63 | if value == '' { |
| 64 | return none |
| 65 | } |
| 66 | return value |
| 67 | } |
| 68 | |
| 69 | fn first_int_env(keys []string, fallback int) int { |
| 70 | for key in keys { |
| 71 | value := os.getenv(key) |
| 72 | if value != '' { |
| 73 | return value.int() |
| 74 | } |
| 75 | } |
| 76 | return fallback |
| 77 | } |
| 78 | |