From cd0d6a858eccc234fed76ff41b61283c88014246 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Tue, 12 Sep 2023 16:53:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E5=9C=A8=E5=BF=85=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E5=B0=9D=E8=AF=95=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/dbs/db.go | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/internal/utils/dbs/db.go b/internal/utils/dbs/db.go index bec99ea..f3f988c 100644 --- a/internal/utils/dbs/db.go +++ b/internal/utils/dbs/db.go @@ -12,6 +12,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/utils/fs" _ "github.com/mattn/go-sqlite3" + "os" "strings" "sync" "time" @@ -47,15 +48,17 @@ func open(dsn string, lock bool) (*DB, error) { return nil, errors.New("can not open database when process is quiting") } + // decode path + var path = dsn + var queryIndex = strings.Index(dsn, "?") + if queryIndex >= 0 { + path = path[:queryIndex] + } + path = strings.TrimSpace(strings.TrimPrefix(path, "file:")) + // locker var locker *fsutils.Locker if lock { - var path = dsn - var queryIndex = strings.Index(dsn, "?") - if queryIndex >= 0 { - path = path[:queryIndex] - } - path = strings.TrimSpace(strings.TrimPrefix(path, "file:")) locker = fsutils.NewLocker(path) err := locker.Lock() if err != nil { @@ -64,12 +67,30 @@ func open(dsn string, lock bool) (*DB, error) { } } + // check if closed successfully last time, if not we recover it + var walPath = path + "-wal" + _, statWalErr := os.Stat(walPath) + var shouldRecover = statWalErr == nil + // open rawDB, err := sql.Open("sqlite3", dsn) if err != nil { return nil, err } + if shouldRecover { + err = rawDB.Close() + if err != nil { + return nil, err + } + + // open again + rawDB, err = sql.Open("sqlite3", dsn) + if err != nil { + return nil, err + } + } + var db = NewDB(rawDB, dsn) db.locker = locker return db, nil