本文简单介绍一下 合并两个mweb文档库的方法。

0x01 背景

mweb文档库是 mweb用来管理多个markdown的。
原理是 将管理markdown的元数据信息(article的元数据信息,category的元数据信息)存在sqlite数据库中(即:mainlib.db)。

mweb文档库设置后,目录结构如下:

├── docs
│   ├── xxx.md      # markdown 源文件
│   └── media       # 图片等信息
├── mainlib.db      # sqlite数据库
└── metadata        # 发布时用到的文件夹

通过sqlite3查看sqlite数据中的表很简单:(字段参考补充信息)

sqlite> .tables
article      cat          cat_article  tag          tag_article

我们的目标是将文档库2中的数据 合并到 文档库1中,因此简化为:

  • 复制表信息:将文档库2中的 表中的信息 insert到文档库1中的 表中。
  • 复制数据。

0x02 步骤

1、创建category:“导入-新”。
在文档库1中创建一个新的category,例如导入。(防止insert时改变文档库1中原始catetory的sort顺序)

# 创建后,效果如下,记住这个category的id为16134842697556
88|0|16134842697556|导入-新||12|87|0|||0|||||0|0||||||||||0|0

2、insert category结构。
复制文档库2的category sql语句(通过navicat可以实现),insert到文档库1的sqlite db中。
注意:需要替换文档库2 cat表中 pid为0的数据,让其pid为刚创建的category的pid:16134842697556。例如:

# 替换前
INSERT INTO "cat" VALUES (25, 0, 16129449644395, 'Security', '', 12, 81, 0, '', '', 0, '', '', '', '', 0, 0, '', '', '', '', '', '', '', '', '', 0, 0);

# 替换后
INSERT INTO "cat" VALUES (89, 16134842697556, 16129449644395, 'Security', '', 12, 81, 0, '', '', 0, '', '', '', '', 0, 0, '', '', '', '', '', '', '', '', '', 0, 0);

insert pid为0的数据之后,再insert pid不为0的数据。

insert之后,重新载入文档库,就可以发现文档库1中的 分类 已经更新了。

3、导入article。
由于文档库2中的id和文档库1中的id不同,需要当id自增,一个sql demo如下:

INSERT INTO "article"(uuid, type, state, sort, dateAdd, dateModif, dateArt, docName, otherMedia, buildResource, postExtValue) VALUES (15941875466662, 0, 1, 15941875466662, 1594187546, 1594388338, 1594187546, '', '', '', '');

4、导入cat_article。

INSERT INTO "cat_article"(rid, aid) VALUES (15961005158239, 15961005194269);

5、复制md和media信息。
文档库2中的docs下的media 和md文件到 文档库1中,重新载入文档库1 即可。

0x03 效果

0x04 参考

1、https://zh.mweb.im/mweb-library.html
2、https://blog.csdn.net/why10260922/article/details/80332786

补充

1)创建insert SQL时,可能用到的正则如下。

" VALUES .*?, 

"(uuid, type, state, sort, dateAdd, dateModif, dateArt, docName, otherMedia, buildResource, postExtValue) VALUES (

"(rid, aid) VALUES (

2)表结构

sqlite> .tables
article      cat          cat_article  tag          tag_article


sqlite> .schema article
CREATE TABLE article(	
    id INTEGER primary key autoincrement
    uuid INTEGER
    type INTEGER
    state INTEGER
    sort INTEGER
    dateAdd INTEGER
    dateModif INTEGER
    dateArt INTEGER
    docName TEXT,  
    otherMedia TEXT
    buildResource TEXT
    postExtValue TEXT);
CREATE UNIQUE INDEX article_uuid_idx ON article (uuid);



sqlite> .schema cat
CREATE TABLE cat(	
    id INTEGER primary key autoincrement
    pid INTEGER
    uuid INTEGER
    name TEXT
    docName TEXT
    catType INTEGER
    sort INTEGER
    sortType INTEGER
    siteURL TEXT
    siteSkinName TEXT
    siteLastBuildDate INTEGER
    siteBuildPath TEXT
    siteFavicon TEXT
    siteLogo TEXT
    siteDateFormat TEXT
    sitePageSize INTEGER
    siteListTextNum INTEGER
    siteName TEXT
    siteDes TEXT
    siteShareCode TEXT
    siteHeader TEXT
    siteOther TEXT
    siteMainMenuData TEXT
    siteExtDef TEXT
    siteExtValue TEXT
    sitePostExtDef TEXT
    siteEnableLaTeX INTEGER
    siteEnableChart INTEGER);
CREATE UNIQUE INDEX cat_uuid_idx ON cat (uuid);



sqlite> .schema cat_article
CREATE TABLE cat_article(	
    id INTEGER primary key autoincrement
    rid INTEGER
    aid INTEGER);

sqlite> .schema tag
CREATE TABLE tag(	
    id INTEGER primary key autoincrement
    name TEXT);


sqlite> .schema tag_article
CREATE TABLE tag_article(	
    id INTEGER primary key autoincrement
    rid INTEGER
    aid INTEGER);