mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* initial Db helper split - make SQL and datastore packages optional * abstracting log store * break out DB, MQ and log drivers as extensions * cleanup * fewer deps * fixing docker test * hmm dbness * updating db startup * Consolidate all your extensions into one convenient package * cleanup * clean up dep constraints
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package postgres
|
|
|
|
import (
|
|
"github.com/fnproject/fn/api/datastore/sql/dbhelper"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/lib/pq"
|
|
"net/url"
|
|
)
|
|
|
|
type postgresHelper int
|
|
|
|
func (postgresHelper) Supports(scheme string) bool {
|
|
switch scheme {
|
|
case "postgres", "pgx":
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (postgresHelper) PreConnect(url *url.URL) (string, error) {
|
|
return url.String(), nil
|
|
}
|
|
|
|
func (postgresHelper) PostCreate(db *sqlx.DB) (*sqlx.DB, error) {
|
|
return db, nil
|
|
|
|
}
|
|
func (postgresHelper) CheckTableExists(tx *sqlx.Tx, table string) (bool, error) {
|
|
query := tx.Rebind(`SELECT count(*)
|
|
FROM information_schema.TABLES
|
|
WHERE TABLE_NAME = 'apps'
|
|
`)
|
|
|
|
row := tx.QueryRow(query)
|
|
|
|
var count int
|
|
err := row.Scan(&count)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
exists := count > 0
|
|
return exists, nil
|
|
}
|
|
|
|
func (postgresHelper) String() string {
|
|
return "postgres"
|
|
}
|
|
|
|
func (postgresHelper) IsDuplicateKeyError(err error) bool {
|
|
switch dbErr := err.(type) {
|
|
case *pq.Error:
|
|
if dbErr.Code == "23505" {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func init() {
|
|
dbhelper.Add(postgresHelper(0))
|
|
}
|