You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
1.8 KiB

  1. package sqlite
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "github.com/chrislusf/seaweedfs/weed/filer"
  7. "github.com/chrislusf/seaweedfs/weed/filer/abstract_sql"
  8. "github.com/chrislusf/seaweedfs/weed/filer/mysql"
  9. "github.com/chrislusf/seaweedfs/weed/util"
  10. _ "modernc.org/sqlite"
  11. )
  12. func init() {
  13. filer.Stores = append(filer.Stores, &SqliteStore{})
  14. }
  15. type SqliteStore struct {
  16. abstract_sql.AbstractSqlStore
  17. }
  18. func (store *SqliteStore) GetName() string {
  19. return "sqlite"
  20. }
  21. func (store *SqliteStore) Initialize(configuration util.Configuration, prefix string) (err error) {
  22. dbFile := configuration.GetString(prefix + "dbFile")
  23. createTable := `CREATE TABLE IF NOT EXISTS "%s" (
  24. dirhash BIGINT,
  25. name VARCHAR(1000),
  26. directory TEXT,
  27. meta BLOB,
  28. PRIMARY KEY (dirhash, name)
  29. ) WITHOUT ROWID;`
  30. upsertQuery := `INSERT INTO "%s"(dirhash,name,directory,meta)VALUES(?,?,?,?)
  31. ON CONFLICT(dirhash,name) DO UPDATE SET
  32. directory=excluded.directory,
  33. meta=excluded.meta;
  34. `
  35. return store.initialize(
  36. dbFile,
  37. createTable,
  38. upsertQuery,
  39. )
  40. }
  41. func (store *SqliteStore) initialize(dbFile, createTable, upsertQuery string) (err error) {
  42. store.SupportBucketTable = true
  43. store.SqlGenerator = &mysql.SqlGenMysql{
  44. CreateTableSqlTemplate: createTable,
  45. DropTableSqlTemplate: "drop table `%s`",
  46. UpsertQueryTemplate: upsertQuery,
  47. }
  48. var dbErr error
  49. store.DB, dbErr = sql.Open("sqlite", dbFile)
  50. if dbErr != nil {
  51. store.DB.Close()
  52. store.DB = nil
  53. return fmt.Errorf("can not connect to %s error:%v", dbFile, err)
  54. }
  55. if err = store.DB.Ping(); err != nil {
  56. return fmt.Errorf("connect to %s error:%v", dbFile, err)
  57. }
  58. if err = store.CreateTable(context.Background(), abstract_sql.DEFAULT_TABLE); err != nil {
  59. return fmt.Errorf("init table %s: %v", abstract_sql.DEFAULT_TABLE, err)
  60. }
  61. return nil
  62. }