2018-08-26 13:15:48 +02:00
|
|
|
//
|
|
|
|
// Copyright (c) 2018
|
|
|
|
// Mainflux
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
//
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
package postgres
|
|
|
|
|
|
|
|
import (
|
2018-05-11 01:00:10 +02:00
|
|
|
"database/sql"
|
2018-03-11 18:06:01 +01:00
|
|
|
"fmt"
|
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
_ "github.com/lib/pq" // required for SQL access
|
|
|
|
migrate "github.com/rubenv/sql-migrate"
|
2018-03-11 18:06:01 +01:00
|
|
|
)
|
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
// Connect creates a connection to the PostgreSQL instance and applies any
|
|
|
|
// unapplied database migrations. A non-nil error is returned to indicate
|
|
|
|
// failure.
|
2018-11-07 14:54:51 -06:00
|
|
|
func Connect(host, port, name, user, pass, sslMode string) (*sql.DB, error) {
|
|
|
|
url := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s", host, port, user, name, pass, sslMode)
|
2018-03-11 18:06:01 +01:00
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
db, err := sql.Open("postgres", url)
|
2018-03-11 18:06:01 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
if err := migrateDB(db); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2018-03-11 18:06:01 +01:00
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
return db, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func migrateDB(db *sql.DB) error {
|
|
|
|
migrations := &migrate.MemoryMigrationSource{
|
|
|
|
Migrations: []*migrate.Migration{
|
2018-05-21 12:51:46 +02:00
|
|
|
{
|
2018-05-15 17:13:09 +02:00
|
|
|
Id: "things_1",
|
2018-05-11 01:00:10 +02:00
|
|
|
Up: []string{
|
2018-08-27 12:17:41 +02:00
|
|
|
`CREATE TABLE IF NOT EXISTS things (
|
2018-11-28 15:58:48 +01:00
|
|
|
id BIGSERIAL,
|
|
|
|
owner VARCHAR(254),
|
|
|
|
type VARCHAR(10) NOT NULL,
|
|
|
|
key CHAR(36) UNIQUE NOT NULL,
|
|
|
|
name TEXT,
|
|
|
|
metadata JSON,
|
2018-05-11 01:00:10 +02:00
|
|
|
PRIMARY KEY (id, owner)
|
|
|
|
)`,
|
2018-08-27 12:17:41 +02:00
|
|
|
`CREATE TABLE IF NOT EXISTS channels (
|
2018-11-28 15:58:48 +01:00
|
|
|
id BIGSERIAL,
|
|
|
|
owner VARCHAR(254),
|
|
|
|
name TEXT,
|
|
|
|
metadata JSON,
|
2018-05-11 01:00:10 +02:00
|
|
|
PRIMARY KEY (id, owner)
|
|
|
|
)`,
|
2018-08-27 12:17:41 +02:00
|
|
|
`CREATE TABLE IF NOT EXISTS connections (
|
2018-05-21 12:51:46 +02:00
|
|
|
channel_id BIGINT,
|
2018-05-11 01:00:10 +02:00
|
|
|
channel_owner VARCHAR(254),
|
2018-11-28 15:58:48 +01:00
|
|
|
thing_id BIGINT,
|
|
|
|
thing_owner VARCHAR(254),
|
2018-05-11 01:00:10 +02:00
|
|
|
FOREIGN KEY (channel_id, channel_owner) REFERENCES channels (id, owner) ON DELETE CASCADE ON UPDATE CASCADE,
|
2018-05-15 17:13:09 +02:00
|
|
|
FOREIGN KEY (thing_id, thing_owner) REFERENCES things (id, owner) ON DELETE CASCADE ON UPDATE CASCADE,
|
|
|
|
PRIMARY KEY (channel_id, channel_owner, thing_id, thing_owner)
|
2018-05-11 01:00:10 +02:00
|
|
|
)`,
|
|
|
|
},
|
|
|
|
Down: []string{
|
|
|
|
"DROP TABLE connections",
|
2018-05-15 17:13:09 +02:00
|
|
|
"DROP TABLE things",
|
2018-05-11 01:00:10 +02:00
|
|
|
"DROP TABLE channels",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
2018-03-11 18:06:01 +01:00
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
_, err := migrate.Exec(db, "postgres", migrations, migrate.Up)
|
|
|
|
return err
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|