mirror of https://github.com/Xhofe/alist
				
				
				
			
							parent
							
								
									5a6b600ace
								
							
						
					
					
						commit
						b3be9ef428
					
				|  | @ -42,6 +42,7 @@ func InitDB() { | |||
| 	var err error | ||||
| 	if flags.Dev { | ||||
| 		dB, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), gormConfig) | ||||
| 		conf.Conf.Database.Type = "sqlite3" | ||||
| 	} else { | ||||
| 		database := conf.Conf.Database | ||||
| 		switch database.Type { | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| package db | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 
 | ||||
| 	"github.com/alist-org/alist/v3/internal/conf" | ||||
|  | @ -12,7 +13,21 @@ 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)) | ||||
| 	var err error | ||||
| 	switch conf.Conf.Database.Type { | ||||
| 	case "sqlite3": | ||||
| 		err = AutoMigrate(new(model.Storage), new(model.User), new(model.Meta), new(model.SettingItem), new(model.SearchNode)) | ||||
| 	case "mysql": | ||||
| 		err = AutoMigrate(new(model.Storage), new(model.User), new(model.Meta), new(model.SettingItem), new(model.SearchNodeMySQL)) | ||||
| 	case "postgres": | ||||
| 		err = AutoMigrate(new(model.Storage), new(model.User), new(model.Meta), new(model.SettingItem), new(model.SearchNode)) | ||||
| 		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()) | ||||
| 	} | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ import ( | |||
| 	"path" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/alist-org/alist/v3/internal/conf" | ||||
| 	"github.com/alist-org/alist/v3/internal/model" | ||||
| 	"github.com/alist-org/alist/v3/pkg/utils" | ||||
| 	"github.com/pkg/errors" | ||||
|  | @ -53,13 +54,21 @@ func GetSearchNodesByParent(parent string) ([]model.SearchNode, error) { | |||
| } | ||||
| 
 | ||||
| func SearchNode(req model.SearchReq) ([]model.SearchNode, int64, error) { | ||||
| 	keywordsClause := db.Where("1 = 1") | ||||
| 	for _, keyword := range strings.Split(req.Keywords, " ") { | ||||
| 		keywordsClause = keywordsClause.Where( | ||||
| 			fmt.Sprintf("%s LIKE ?", columnName("name")), | ||||
| 			fmt.Sprintf("%%%s%%", keyword)) | ||||
| 	var searchDB *gorm.DB | ||||
| 	switch conf.Conf.Database.Type { | ||||
| 	case "sqlite3": | ||||
| 		keywordsClause := db.Where("1 = 1") | ||||
| 		for _, keyword := range strings.Split(req.Keywords, " ") { | ||||
| 			keywordsClause = keywordsClause.Where("name LIKE ?", fmt.Sprintf("%%%s%%", keyword)) | ||||
| 		} | ||||
| 		searchDB = db.Model(&model.SearchNode{}).Where(whereInParent(req.Parent)).Where(keywordsClause) | ||||
| 	case "mysql": | ||||
| 		searchDB = db.Model(&model.SearchNode{}).Where(whereInParent(req.Parent)). | ||||
| 			Where("MATCH (name) AGAINST (? IN NATURAL LANGUAGE MODE)", req.Keywords) | ||||
| 	case "postgres": | ||||
| 		searchDB = db.Model(&model.SearchNode{}).Where(whereInParent(req.Parent)). | ||||
| 			Where("to_tsvector(name) @@ to_tsquery(?)", req.Keywords) | ||||
| 	} | ||||
| 	searchDB := db.Model(&model.SearchNode{}).Where(whereInParent(req.Parent)).Where(keywordsClause) | ||||
| 	var count int64 | ||||
| 	if err := searchDB.Count(&count).Error; err != nil { | ||||
| 		return nil, 0, errors.Wrapf(err, "failed get users count") | ||||
|  |  | |||
|  | @ -18,6 +18,13 @@ type SearchReq struct { | |||
| 	PageReq | ||||
| } | ||||
| 
 | ||||
| type SearchNodeMySQL struct { | ||||
| 	Parent string `json:"parent" gorm:"index"` | ||||
| 	Name   string `json:"name" gorm:"index:,class:FULLTEXT"` | ||||
| 	IsDir  bool   `json:"is_dir"` | ||||
| 	Size   int64  `json:"size"` | ||||
| } | ||||
| 
 | ||||
| type SearchNode struct { | ||||
| 	Parent string `json:"parent" gorm:"index"` | ||||
| 	Name   string `json:"name"` | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BoYanZh
						BoYanZh