mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-21 22:30:46 +08:00
fix: fix the error of database is locked when use sqlite (#60)
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user