MCPcopy
hub / github.com/syncthing/syncthing / getFolderDB

Method getFolderDB

internal/db/sqlite/db_folderdb.go:28–93  ·  view source on GitHub ↗
(folder string, create bool)

Source from the content-addressed store, hash-verified

26var errNoSuchFolder = errors.New("no such folder")
27
28func (s *DB) getFolderDB(folder string, create bool) (*folderDB, error) {
29 // Check for an already open database
30 s.folderDBsMut.RLock()
31 fdb, ok := s.folderDBs[folder]
32 s.folderDBsMut.RUnlock()
33 if ok {
34 return fdb, nil
35 }
36
37 // Check for an existing database. If we're not supposed to create the
38 // folder, we don't move on if it doesn't already have a database name.
39 var dbns sql.NullString
40 if err := s.stmt(`
41 SELECT database_name FROM folders
42 WHERE folder_id = ?
43 `).Get(&dbns, folder); err != nil && !errors.Is(err, sql.ErrNoRows) {
44 return nil, wrap(err)
45 }
46
47 var dbName string
48 if dbns.Valid {
49 dbName = dbns.String
50 }
51 if dbName == "" && !create {
52 return nil, errNoSuchFolder
53 }
54
55 // Create a folder ID and database if it does not already exist
56 s.folderDBsMut.Lock()
57 defer s.folderDBsMut.Unlock()
58 if fdb, ok := s.folderDBs[folder]; ok {
59 return fdb, nil
60 }
61
62 if dbName == "" {
63 // First time we want to access this folder, need to create a new
64 // folder ID
65
66 s.updateLock.Lock()
67 defer s.updateLock.Unlock()
68
69 idx, err := s.folderIdxLocked(folder)
70 if err != nil {
71 return nil, wrap(err)
72 }
73
74 // The database name is the folder index ID and a random slug.
75 slug := strings.ToLower(rand.String(8))
76 dbName = fmt.Sprintf("folder.%04x-%s.db", idx, slug)
77 if _, err := s.stmt(`UPDATE folders SET database_name = ? WHERE idx = ?`).Exec(dbName, idx); err != nil {
78 return nil, wrap(err, "set name")
79 }
80 }
81
82 slog.Debug("Folder database opened", "folder", folder, "db", dbName)
83 path := dbName
84 if !filepath.IsAbs(path) {
85 path = filepath.Join(s.pathBase, dbName)

Callers 15

startFolderDatabasesMethod · 0.95
UpdateMethod · 0.95
DropBlockIndexMethod · 0.95
PopulateBlockIndexMethod · 0.95
GetDeviceFileMethod · 0.95
GetGlobalAvailabilityMethod · 0.95
GetGlobalFileMethod · 0.95
AllGlobalFilesMethod · 0.95
AllGlobalFilesPrefixMethod · 0.95
AllLocalFilesMethod · 0.95

Implementers 1

DBinternal/db/sqlite/db_open.go

Calls 8

folderIdxLockedMethod · 0.95
StringFunction · 0.92
stmtMethod · 0.80
UnlockMethod · 0.80
wrapFunction · 0.70
GetMethod · 0.65
ExecMethod · 0.65
IsMethod · 0.45

Tested by 2

BenchmarkUpdateFunction · 0.64