diff options
| author | Chris Lu <chris.lu@gmail.com> | 2018-05-26 22:02:49 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2018-05-26 22:02:49 -0700 |
| commit | 869161a2613a64bc5cf15f7841607f2721b8ef40 (patch) | |
| tree | 81e540779d6970bf6e9909df88df4eaa63d98452 /weed/filer2/postgres/postgres_store.go | |
| parent | 87b3b84471c7041c29474840616cd3f15705eabe (diff) | |
| download | seaweedfs-869161a2613a64bc5cf15f7841607f2721b8ef40.tar.xz seaweedfs-869161a2613a64bc5cf15f7841607f2721b8ef40.zip | |
support both mysql and postgres
Diffstat (limited to 'weed/filer2/postgres/postgres_store.go')
| -rw-r--r-- | weed/filer2/postgres/postgres_store.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/weed/filer2/postgres/postgres_store.go b/weed/filer2/postgres/postgres_store.go new file mode 100644 index 000000000..387b8f58d --- /dev/null +++ b/weed/filer2/postgres/postgres_store.go @@ -0,0 +1,68 @@ +package postgres + +import ( + "fmt" + "database/sql" + + "github.com/chrislusf/seaweedfs/weed/filer2" + "github.com/spf13/viper" + _ "github.com/lib/pq" + "github.com/chrislusf/seaweedfs/weed/filer2/abstract_sql" +) + +const ( + CONNECTION_URL_PATTERN = "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s connect_timeout=30" +) + +func init() { + filer2.Stores = append(filer2.Stores, &PostgresStore{}) +} + +type PostgresStore struct { + abstract_sql.AbstractSqlStore +} + +func (store *PostgresStore) GetName() string { + return "postgres" +} + +func (store *PostgresStore) Initialize(viper *viper.Viper) (err error) { + return store.initialize( + viper.GetString("username"), + viper.GetString("password"), + viper.GetString("hostname"), + viper.GetInt("port"), + viper.GetString("database"), + viper.GetString("sslmode"), + viper.GetInt("connection_max_idle"), + viper.GetInt("connection_max_open"), + ) +} + +func (store *PostgresStore) initialize(user, password, hostname string, port int, database, sslmode string, maxIdle, maxOpen int) (err error) { + + store.SqlInsert = "INSERT INTO filemeta (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)" + store.SqlUpdate = "UPDATE filemeta SET meta=$1 WHERE dirhash=$2 AND name=$3 AND directory=$4" + store.SqlFind = "SELECT meta FROM filemeta WHERE dirhash=$1 AND name=$2 AND directory=$3" + store.SqlDelete = "DELETE FROM filemeta WHERE dirhash=$1 AND name=$2 AND directory=$3" + store.SqlListExclusive = "SELECT NAME, meta FROM filemeta WHERE dirhash=$1 AND name>$2 AND directory=$3 LIMIT $4" + store.SqlListInclusive = "SELECT NAME, meta FROM filemeta WHERE dirhash=$1 AND name>=$2 AND directory=$3 LIMIT $4" + + sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, hostname, port, user, password, database, sslmode) + var dbErr error + store.DB, dbErr = sql.Open("postgres", sqlUrl) + if dbErr != nil { + store.DB.Close() + store.DB = nil + return fmt.Errorf("can not connect to %s error:%v", sqlUrl, err) + } + + store.DB.SetMaxIdleConns(maxIdle) + store.DB.SetMaxOpenConns(maxOpen) + + if err = store.DB.Ping(); err != nil { + return fmt.Errorf("connect to %s error:%v", sqlUrl, err) + } + + return nil +} |
