From 0ad9e17196191fff4f03a033d009af18832271ad Mon Sep 17 00:00:00 2001 From: BoYanZh Date: Mon, 9 Jan 2023 14:09:21 +0800 Subject: [PATCH] feat: lazy index creation on searcher init (#2962) --- internal/db/db.go | 22 +++++----------------- internal/search/db/init.go | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/internal/db/db.go b/internal/db/db.go index 6cad404e..4f1dcf11 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -1,8 +1,7 @@ package db import ( - "fmt" - "log" + log "github.com/sirupsen/logrus" "github.com/alist-org/alist/v3/internal/conf" "github.com/alist-org/alist/v3/internal/model" @@ -14,21 +13,6 @@ var db *gorm.DB func Init(d *gorm.DB) { db = d err := AutoMigrate(new(model.Storage), new(model.User), new(model.Meta), new(model.SettingItem), new(model.SearchNode)) - switch conf.Conf.Database.Type { - case "sqlite3": - case "mysql": - if err == nil { - tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) - db.Exec(fmt.Sprintf("CREATE FULLTEXT INDEX idx_%s_name_fulltext ON %s(name);", tableName, tableName)) - } - case "postgres": - if err == nil { - db.Exec("CREATE EXTENSION pg_trgm;") - db.Exec("CREATE EXTENSION btree_gin;") - tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) - db.Exec(fmt.Sprintf("CREATE INDEX idx_%s_name ON %s USING GIN (name);", tableName, tableName)) - } - } if err != nil { log.Fatalf("failed migrate database: %s", err.Error()) } @@ -43,3 +27,7 @@ func AutoMigrate(dst ...interface{}) error { } return err } + +func GetDb() *gorm.DB { + return db; +} diff --git a/internal/search/db/init.go b/internal/search/db/init.go index bd83ffe6..b7d0288f 100644 --- a/internal/search/db/init.go +++ b/internal/search/db/init.go @@ -1,6 +1,13 @@ package db import ( + "fmt" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/alist-org/alist/v3/internal/conf" + "github.com/alist-org/alist/v3/internal/db" "github.com/alist-org/alist/v3/internal/search/searcher" ) @@ -11,6 +18,25 @@ var config = searcher.Config{ func init() { searcher.RegisterSearcher(config, func() (searcher.Searcher, error) { + db := db.GetDb() + switch conf.Conf.Database.Type { + case "mysql": + tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) + tx := db.Exec(fmt.Sprintf("CREATE FULLTEXT INDEX idx_%s_name_fulltext ON %s(name);", tableName, tableName)) + if err := tx.Error; err != nil && !strings.Contains(err.Error(), "Error 1061 (42000)") { // duplicate error + log.Errorf("failed to create full text index: %v", err) + return nil, err + } + case "postgres": + db.Exec("CREATE EXTENSION pg_trgm;") + db.Exec("CREATE EXTENSION btree_gin;") + tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) + tx := db.Exec(fmt.Sprintf("CREATE INDEX idx_%s_name ON %s USING GIN (name);", tableName, tableName)) + if err := tx.Error; err != nil && !strings.Contains(err.Error(), "SQLSTATE 42P07") { + log.Errorf("failed to create index using GIN: %v", err) + return nil, err + } + } return &DB{}, nil }) }