From 7d2369ba28564777194dca7c9d4fe5c1c93c5523 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Thu, 2 Feb 2023 18:14:00 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E9=87=8D=E5=BB=BA=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=20https://github.com/siyuan-note/siyuan/issu?= =?UTF-8?q?es/7238?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/sql/database.go | 53 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/kernel/sql/database.go b/kernel/sql/database.go index 47379284b..1d0323610 100644 --- a/kernel/sql/database.go +++ b/kernel/sql/database.go @@ -26,6 +26,7 @@ import ( "regexp" "runtime" "strings" + "sync" "time" "unicode/utf8" @@ -59,7 +60,12 @@ func init() { }) } +var initDatabaseLock = sync.Mutex{} + func InitDatabase(forceRebuild bool) (err error) { + initDatabaseLock.Lock() + defer initDatabaseLock.Unlock() + ClearBlockCache() DisableCache() defer EnableCache() @@ -102,56 +108,83 @@ func InitDatabase(forceRebuild bool) (err error) { } func initDBTables() { - db.Exec("DROP TABLE stat") - _, err := db.Exec("CREATE TABLE stat (key, value)") + _, err := db.Exec("DROP TABLE IF EXISTS stat") + if nil != err { + logging.LogFatalf("drop table [stat] failed: %s", err) + } + _, err = db.Exec("CREATE TABLE stat (key, value)") if nil != err { logging.LogFatalf("create table [stat] failed: %s", err) } setDatabaseVer() - db.Exec("DROP TABLE blocks") + _, err = db.Exec("DROP TABLE IF EXISTS blocks") + if nil != err { + logging.LogFatalf("drop table [blocks] failed: %s", err) + } _, err = db.Exec("CREATE TABLE blocks (id, parent_id, root_id, hash, box, path, hpath, name, alias, memo, tag, content, fcontent, markdown, length, type, subtype, ial, sort, created, updated)") if nil != err { logging.LogFatalf("create table [blocks] failed: %s", err) } - db.Exec("DROP TABLE blocks_fts") + _, err = db.Exec("DROP TABLE IF EXISTS blocks_fts") + if nil != err { + logging.LogFatalf("drop table [blocks_fts] failed: %s", err) + } _, err = db.Exec("CREATE VIRTUAL TABLE blocks_fts USING fts5(id UNINDEXED, parent_id UNINDEXED, root_id UNINDEXED, hash UNINDEXED, box UNINDEXED, path UNINDEXED, hpath, name, alias, memo, tag, content, fcontent, markdown UNINDEXED, length UNINDEXED, type UNINDEXED, subtype UNINDEXED, ial, sort UNINDEXED, created UNINDEXED, updated UNINDEXED, tokenize=\"siyuan\")") if nil != err { logging.LogFatalf("create table [blocks_fts] failed: %s", err) } - db.Exec("DROP TABLE blocks_fts_case_insensitive") + _, err = db.Exec("DROP TABLE IF EXISTS blocks_fts_case_insensitive") + if nil != err { + logging.LogFatalf("drop table [blocks_fts_case_insensitive] failed: %s", err) + } _, err = db.Exec("CREATE VIRTUAL TABLE blocks_fts_case_insensitive USING fts5(id UNINDEXED, parent_id UNINDEXED, root_id UNINDEXED, hash UNINDEXED, box UNINDEXED, path UNINDEXED, hpath, name, alias, memo, tag, content, fcontent, markdown UNINDEXED, length UNINDEXED, type UNINDEXED, subtype UNINDEXED, ial, sort UNINDEXED, created UNINDEXED, updated UNINDEXED, tokenize=\"siyuan case_insensitive\")") if nil != err { logging.LogFatalf("create table [blocks_fts_case_insensitive] failed: %s", err) } - db.Exec("DROP TABLE spans") + _, err = db.Exec("DROP TABLE IF EXISTS spans") + if nil != err { + logging.LogFatalf("drop table [spans] failed: %s", err) + } _, err = db.Exec("CREATE TABLE spans (id, block_id, root_id, box, path, content, markdown, type, ial)") if nil != err { logging.LogFatalf("create table [spans] failed: %s", err) } - db.Exec("DROP TABLE assets") + _, err = db.Exec("DROP TABLE IF EXISTS assets") + if nil != err { + logging.LogFatalf("drop table [assets] failed: %s", err) + } _, err = db.Exec("CREATE TABLE assets (id, block_id, root_id, box, docpath, path, name, title, hash)") if nil != err { logging.LogFatalf("create table [assets] failed: %s", err) } - db.Exec("DROP TABLE attributes") + _, err = db.Exec("DROP TABLE IF EXISTS attributes") + if nil != err { + logging.LogFatalf("drop table [attributes] failed: %s", err) + } _, err = db.Exec("CREATE TABLE attributes (id, name, value, type, block_id, root_id, box, path)") if nil != err { logging.LogFatalf("create table [attributes] failed: %s", err) } - db.Exec("DROP TABLE refs") + _, err = db.Exec("DROP TABLE IF EXISTS refs") + if nil != err { + logging.LogFatalf("drop table [refs] failed: %s", err) + } _, err = db.Exec("CREATE TABLE refs (id, def_block_id, def_block_parent_id, def_block_root_id, def_block_path, block_id, root_id, box, path, content, markdown, type)") if nil != err { logging.LogFatalf("create table [refs] failed: %s", err) } - db.Exec("DROP TABLE file_annotation_refs") + _, err = db.Exec("DROP TABLE IF EXISTS file_annotation_refs") + if nil != err { + logging.LogFatalf("drop table [refs] failed: %s", err) + } _, err = db.Exec("CREATE TABLE file_annotation_refs (id, file_path, annotation_id, block_id, root_id, box, path, content, type)") if nil != err { logging.LogFatalf("create table [refs] failed: %s", err)