@@ -12,6 +12,7 @@ import (
12
12
13
13
"github.com/go-sql-driver/mysql"
14
14
"github.com/grafana/grafana/pkg/bus"
15
+ "github.com/grafana/grafana/pkg/infra/fs"
15
16
"github.com/grafana/grafana/pkg/infra/localcache"
16
17
"github.com/grafana/grafana/pkg/infra/log"
17
18
"github.com/grafana/grafana/pkg/models"
@@ -265,6 +266,34 @@ func (ss *SqlStore) getEngine() (*xorm.Engine, error) {
265
266
}
266
267
267
268
sqlog .Info ("Connecting to DB" , "dbtype" , ss .dbCfg .Type )
269
+ if ss .dbCfg .Type == migrator .SQLITE && strings .HasPrefix (connectionString , "file:" ) {
270
+ exists , err := fs .Exists (ss .dbCfg .Path )
271
+ if err != nil {
272
+ return nil , errutil .Wrapf (err , "can't check for existence of %q" , ss .dbCfg .Path )
273
+ }
274
+
275
+ const perms = 0640
276
+ if ! exists {
277
+ ss .log .Info ("Creating SQLite database file" , "path" , ss .dbCfg .Path )
278
+ f , err := os .OpenFile (ss .dbCfg .Path , os .O_CREATE | os .O_RDWR , perms )
279
+ if err != nil {
280
+ return nil , errutil .Wrapf (err , "failed to create SQLite database file %q" , ss .dbCfg .Path )
281
+ }
282
+ if err := f .Close (); err != nil {
283
+ return nil , errutil .Wrapf (err , "failed to create SQLite database file %q" , ss .dbCfg .Path )
284
+ }
285
+ } else {
286
+ fi , err := os .Lstat (ss .dbCfg .Path )
287
+ if err != nil {
288
+ return nil , errutil .Wrapf (err , "failed to stat SQLite database file %q" , ss .dbCfg .Path )
289
+ }
290
+ m := fi .Mode () & os .ModePerm
291
+ if m | perms != perms {
292
+ ss .log .Warn ("SQLite database file has broader permissions than it should" ,
293
+ "path" , ss .dbCfg .Path , "mode" , m , "expected" , os .FileMode (perms ))
294
+ }
295
+ }
296
+ }
268
297
engine , err := xorm .NewEngine (ss .dbCfg .Type , connectionString )
269
298
if err != nil {
270
299
return nil , err
0 commit comments