fix: fix the error of database is locked when use sqlite (#60)

This commit is contained in:
Li4n0
2022-09-14 01:08:42 +08:00
committed by GitHub
parent 3fa2cae862
commit d29b767d9c
7 changed files with 49 additions and 2 deletions
+7 -2
View File
@@ -3,6 +3,7 @@ package database
import ( import (
"errors" "errors"
"strings" "strings"
"sync"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -10,6 +11,7 @@ import (
var ( var (
DB *gorm.DB DB *gorm.DB
Driver DriverType Driver DriverType
Locker sync.Mutex
) )
type DriverType = string type DriverType = string
@@ -17,7 +19,7 @@ type DriverType = string
const Sqlite = "sqlite" const Sqlite = "sqlite"
const Mysql = "mysql" const Mysql = "mysql"
const Postgres = "postgres" const Postgres = "postgres"
const UnknowDatabase = "unknown database" const UnknownDatabase = "unknown database"
func InitDB(dsn string) (err error) { func InitDB(dsn string) (err error) {
dbName, dbDsn := dbType(dsn) dbName, dbDsn := dbType(dsn)
@@ -25,10 +27,13 @@ func InitDB(dsn string) (err error) {
switch dbName { switch dbName {
case Sqlite: case Sqlite:
DB, err = NewSqlite3(dbDsn) DB, err = NewSqlite3(dbDsn)
Driver = Sqlite
case Mysql: case Mysql:
DB, err = NewMysql(dbDsn) DB, err = NewMysql(dbDsn)
Driver = Mysql
case Postgres: case Postgres:
DB, err = NewPostgres(dbDsn) DB, err = NewPostgres(dbDsn)
Driver = Postgres
default: default:
err = errors.New("unsupported database") err = errors.New("unsupported database")
} }
@@ -45,5 +50,5 @@ func dbType(dsn string) (DriverType, string) {
} else if strings.Contains(dsn, "@tcp") { //兼容上个版本的写法 } else if strings.Contains(dsn, "@tcp") { //兼容上个版本的写法
return Mysql, dsn return Mysql, dsn
} }
return UnknowDatabase, dsn return UnknownDatabase, dsn
} }
+7
View File
@@ -41,6 +41,13 @@ func newRecord(rule *Rule, flag, domain, remoteIp, ipArea string) (r *Record, er
Domain: domain, Domain: domain,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }
+7
View File
@@ -52,6 +52,13 @@ func NewRecord(rule *Rule, flag, user, password, method, path, ip, area string,
File: file, File: file,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }
+7
View File
@@ -40,6 +40,13 @@ func NewRecord(rule *Rule, flag, path, ip, area string) (r *Record, err error) {
Path: path, Path: path,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }
+7
View File
@@ -51,6 +51,13 @@ func newRecord(rule *Rule, flag, username, schema, clientName, clientOS, remoteI
Files: files, Files: files,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }
+7
View File
@@ -44,6 +44,13 @@ func NewRecord(rule *Rule, flag, method, url, ip, area, raw string) (r *Record,
RawRequest: raw, RawRequest: raw,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }
+7
View File
@@ -40,6 +40,13 @@ func NewRecord(rule *Rule, flag, path, ip, area string) (r *Record, err error) {
Path: path, Path: path,
Rule: *rule, Rule: *rule,
} }
// sqlite db-level lock to prevent too much write operation lead to error of `database is locked` #54
if database.Driver == database.Sqlite {
database.Locker.Lock()
defer database.Locker.Unlock()
}
return r, database.DB.Create(r).Error return r, database.DB.Create(r).Error
} }