summaryrefslogtreecommitdiffstats
path: root/database/postgres/create_table.go
diff options
context:
space:
mode:
authorJeff Becker <ampernand@gmail.com>2017-05-14 19:31:17 -0400
committerJeff Becker <ampernand@gmail.com>2017-05-14 19:31:17 -0400
commit431a0c3748c451c64a29b4d3220da2b986276689 (patch)
treeb582af7360bae6780c0396801cbc07c58f6e51b3 /database/postgres/create_table.go
parent3a97c9b32ebe248260927de92545c9af18eccae2 (diff)
downloadnyaa-431a0c3748c451c64a29b4d3220da2b986276689.zip
nyaa-431a0c3748c451c64a29b4d3220da2b986276689.tar.gz
nyaa-431a0c3748c451c64a29b4d3220da2b986276689.tar.bz2
add new db interface beginnings
Diffstat (limited to 'database/postgres/create_table.go')
-rw-r--r--database/postgres/create_table.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/database/postgres/create_table.go b/database/postgres/create_table.go
new file mode 100644
index 0000000..31da112
--- /dev/null
+++ b/database/postgres/create_table.go
@@ -0,0 +1,91 @@
+package postgres
+
+import (
+ "database/sql"
+ "fmt"
+ "strings"
+)
+
+// sql query
+type sqlQuery struct {
+ query string
+ params []interface{}
+}
+
+func (q *sqlQuery) Exec(conn *sql.DB) (err error) {
+ _, err = conn.Exec(q.query, q.params...)
+ return
+}
+
+func (q *sqlQuery) QueryRow(conn *sql.DB, visitor func(*sql.Row) error) (err error) {
+ err = visitor(conn.QueryRow(q.query, q.params))
+ return
+}
+
+func (q *sqlQuery) Query(conn *sql.DB, visitor func(*sql.Rows) error) (err error) {
+ var rows *sql.Rows
+ rows, err = conn.Query(q.query, q.params...)
+ if err == sql.ErrNoRows {
+ err = nil
+ } else if err == nil {
+ err = visitor(rows)
+ rows.Close()
+ }
+ return
+}
+
+// make a createQuery that creates an index for column on table
+func createIndex(table, column string) sqlQuery {
+ return sqlQuery{
+ query: fmt.Sprintf("CREATE INDEX IF NOT EXISTS ON %s %s ", table, column),
+ }
+}
+
+// make a createQuery that creates a trigraph index on a table for multiple columns
+func createTrigraph(table string, columns ...string) sqlQuery {
+ return sqlQuery{
+ query: fmt.Sprintf("CREATE INDEX IF NOT EXISTS ON %s USING gin(%s gin_trgm_ops)", table, strings.Join(columns, ", ")),
+ }
+}
+
+// defines table creation info
+type createTable struct {
+ name string // Table's name
+ columns tableColumns // Table's columns
+ preCreate []sqlQuery // Queries to run before table is ensrued
+ postCreate []sqlQuery // Queries to run after table is ensured
+}
+
+func (t createTable) String() string {
+ return fmt.Sprintf("CREATE TABLE %s IF NOT EXISTS ( %s )", t.name, t.columns)
+}
+
+func (t createTable) Exec(conn *sql.DB) (err error) {
+ // pre queries
+ for idx := range t.preCreate {
+ err = t.preCreate[idx].Exec(conn)
+ if err != nil {
+ return
+ }
+ }
+ // table definition
+ _, err = conn.Exec(t.String())
+ if err != nil {
+ return
+ }
+ // post queries
+ for idx := range t.postCreate {
+ err = t.postCreate[idx].Exec(conn)
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
+// tableColumns is a list of columns for a table to be created
+type tableColumns []string
+
+func (def tableColumns) String() string {
+ return strings.Join(def, ", ")
+}