diff --git a/internal/db/sqlite/basedb.go b/internal/db/sqlite/basedb.go index 63f09c160..c2d1b8808 100644 --- a/internal/db/sqlite/basedb.go +++ b/internal/db/sqlite/basedb.go @@ -199,11 +199,9 @@ nextScript: for _, scr := range scripts { for _, fn := range filter { if !fn(scr) { - l.Debugln(s.baseName, "skipping script", scr) continue nextScript } } - l.Debugln(s.baseName, "executing script", scr) bs, err := fs.ReadFile(embedded, scr) if err != nil { return wrap(err, scr) diff --git a/internal/db/sqlite/db_folderdb.go b/internal/db/sqlite/db_folderdb.go index 1af061a28..f82946d2a 100644 --- a/internal/db/sqlite/db_folderdb.go +++ b/internal/db/sqlite/db_folderdb.go @@ -12,12 +12,14 @@ import ( "fmt" "iter" "path/filepath" + "strings" "time" "github.com/syncthing/syncthing/internal/db" "github.com/syncthing/syncthing/internal/itererr" "github.com/syncthing/syncthing/lib/config" "github.com/syncthing/syncthing/lib/protocol" + "github.com/syncthing/syncthing/lib/rand" ) var errNoSuchFolder = errors.New("no such folder") @@ -31,16 +33,16 @@ func (s *DB) getFolderDB(folder string, create bool) (*folderDB, error) { return fdb, nil } - // Check for an existing folder. If we're not supposed to create the - // folder, we don't move on if it doesn't already have an ID. - var idx int64 + // Check for an existing database. If we're not supposed to create the + // folder, we don't move on if it doesn't already have a database name. + var dbName string if err := s.stmt(` - SELECT idx FROM folders + SELECT database_name FROM folders WHERE folder_id = ? - `).Get(&idx, folder); err != nil && !errors.Is(err, sql.ErrNoRows) { + `).Get(&dbName, folder); err != nil && !errors.Is(err, sql.ErrNoRows) { return nil, wrap(err) } - if idx == 0 && !create { + if dbName == "" && !create { return nil, errNoSuchFolder } @@ -51,21 +53,30 @@ func (s *DB) getFolderDB(folder string, create bool) (*folderDB, error) { return fdb, nil } - var err error - if idx == 0 { + if dbName == "" { // First time we want to access this folder, need to create a new // folder ID - idx, err = s.folderIdxLocked(folder) + idx, err := s.folderIdxLocked(folder) if err != nil { - return nil, err + return nil, wrap(err) + } + + // The database name is the folder index ID and a random slug. + slug := strings.ToLower(rand.String(8)) + dbName = fmt.Sprintf("folder.%04x-%s.db", idx, slug) + if _, err := s.stmt(`UPDATE folders SET database_name = ? WHERE idx = ?`).Exec(dbName, idx); err != nil { + return nil, wrap(err, "set name") } } - name := fmt.Sprintf("folder.%04x.db", idx) - path := filepath.Join(s.pathBase, name) - fdb, err = s.folderDBOpener(folder, path, s.deleteRetention) + l.Debugf("Folder %s in database %s", folder, dbName) + path := dbName + if !filepath.IsAbs(path) { + path = filepath.Join(s.pathBase, dbName) + } + fdb, err := s.folderDBOpener(folder, path, s.deleteRetention) if err != nil { - return nil, err + return nil, wrap(err) } s.folderDBs[folder] = fdb return fdb, nil diff --git a/internal/db/sqlite/sql/schema/folder/00-indexes.sql b/internal/db/sqlite/sql/schema/folder/00-devices.sql similarity index 100% rename from internal/db/sqlite/sql/schema/folder/00-indexes.sql rename to internal/db/sqlite/sql/schema/folder/00-devices.sql diff --git a/internal/db/sqlite/sql/schema/main/00-indexes.sql b/internal/db/sqlite/sql/schema/main/00-folders.sql similarity index 62% rename from internal/db/sqlite/sql/schema/main/00-indexes.sql rename to internal/db/sqlite/sql/schema/main/00-folders.sql index 0a0d6a8dd..72f20ab13 100644 --- a/internal/db/sqlite/sql/schema/main/00-indexes.sql +++ b/internal/db/sqlite/sql/schema/main/00-folders.sql @@ -7,6 +7,10 @@ -- folders map folder IDs as used by Syncthing to database folder indexes CREATE TABLE IF NOT EXISTS folders ( idx INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - folder_id TEXT NOT NULL UNIQUE COLLATE BINARY + folder_id TEXT NOT NULL UNIQUE COLLATE BINARY, + database_name TEXT COLLATE BINARY -- initially null ) STRICT ; +-- The database_name is unique, when set +CREATE INDEX IF NOT EXISTS folders_database_name ON folders (database_name) WHERE database_name IS NOT NULL +;