diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-05-23 23:58:28 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-05-23 23:58:28 -0700 |
| commit | 064269bb57b49c790886bfb28dbe375d0ae5a615 (patch) | |
| tree | b20ace0fc12366137085035a2f73d35dfb2f316f /weed | |
| parent | b70aeb758571f4dcb236abec92f410f18d1dc642 (diff) | |
| download | seaweedfs-064269bb57b49c790886bfb28dbe375d0ae5a615.tar.xz seaweedfs-064269bb57b49c790886bfb28dbe375d0ae5a615.zip | |
filer: Support sqlite as filer meta store
Diffstat (limited to 'weed')
| -rw-r--r-- | weed/command/scaffold.go | 5 | ||||
| -rw-r--r-- | weed/filer/sqlite/sqlite_store.go | 74 | ||||
| -rw-r--r-- | weed/server/filer_server.go | 1 |
3 files changed, 80 insertions, 0 deletions
diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 88dc94df1..8dc64aa6b 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -101,6 +101,11 @@ dir = "./filerldb3" # directory to store level db files enabled = false dir = "./filerrdb" # directory to store rocksdb files +[sqlite] +# local on disk, similar to leveldb +enabled = false +dbFile = "./filer.db" # sqlite db file + [mysql] # or memsql, tidb # CREATE TABLE IF NOT EXISTS filemeta ( # dirhash BIGINT COMMENT 'first 64 bits of MD5 hash value of directory field', diff --git a/weed/filer/sqlite/sqlite_store.go b/weed/filer/sqlite/sqlite_store.go new file mode 100644 index 000000000..b32d86c11 --- /dev/null +++ b/weed/filer/sqlite/sqlite_store.go @@ -0,0 +1,74 @@ +package sqlite + +import ( + "context" + "database/sql" + "fmt" + + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/filer/abstract_sql" + "github.com/chrislusf/seaweedfs/weed/filer/mysql" + "github.com/chrislusf/seaweedfs/weed/util" + _ "modernc.org/sqlite" +) + +func init() { + filer.Stores = append(filer.Stores, &SqliteStore{}) +} + +type SqliteStore struct { + abstract_sql.AbstractSqlStore +} + +func (store *SqliteStore) GetName() string { + return "sqlite" +} + +func (store *SqliteStore) Initialize(configuration util.Configuration, prefix string) (err error) { + dbFile := configuration.GetString(prefix + "dbFile") + createTable := `CREATE TABLE IF NOT EXISTS "%s" ( + dirhash BIGINT, + name VARCHAR(1000), + directory TEXT, + meta BLOB, + PRIMARY KEY (dirhash, name) + ) WITHOUT ROWID;` + upsertQuery := `INSERT INTO "%s"(dirhash,name,directory,meta)VALUES(?,?,?,?) + ON CONFLICT(dirhash,name) DO UPDATE SET + directory=excluded.directory, + meta=excluded.meta; + ` + return store.initialize( + dbFile, + createTable, + upsertQuery, + ) +} + +func (store *SqliteStore) initialize(dbFile, createTable, upsertQuery string) (err error) { + + store.SupportBucketTable = true + store.SqlGenerator = &mysql.SqlGenMysql{ + CreateTableSqlTemplate: createTable, + DropTableSqlTemplate: "drop table `%s`", + UpsertQueryTemplate: upsertQuery, + } + + var dbErr error + store.DB, dbErr = sql.Open("sqlite", dbFile) + if dbErr != nil { + store.DB.Close() + store.DB = nil + return fmt.Errorf("can not connect to %s error:%v", dbFile, err) + } + + if err = store.DB.Ping(); err != nil { + return fmt.Errorf("connect to %s error:%v", dbFile, err) + } + + if err = store.CreateTable(context.Background(), abstract_sql.DEFAULT_TABLE); err != nil { + return fmt.Errorf("init table %s: %v", abstract_sql.DEFAULT_TABLE, err) + } + + return nil +} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index def400300..dfb43c706 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -30,6 +30,7 @@ import ( _ "github.com/chrislusf/seaweedfs/weed/filer/mongodb" _ "github.com/chrislusf/seaweedfs/weed/filer/mysql" _ "github.com/chrislusf/seaweedfs/weed/filer/mysql2" + _ "github.com/chrislusf/seaweedfs/weed/filer/sqlite" _ "github.com/chrislusf/seaweedfs/weed/filer/postgres" _ "github.com/chrislusf/seaweedfs/weed/filer/postgres2" _ "github.com/chrislusf/seaweedfs/weed/filer/redis" |
