Browse Source

feat(lib/storage): 新增通用存储引擎

用法如下:

/* 加载模块 */
load-lib storage;

/* 存储数据 */
storage.Save my-data {myvar1;myvar2;myvar3};

/* 提取数据 */
storage.Load my-data {myvar1;myvar2;myvar3};

数据以 tintin++ 格式默认储存在 data 目录,文件名就是 Save/Load 的第一个参数。
存储位置支持文件重定位,即:如果储存时存在 var/data 目录,则改为储存到 var/data 目录。
如果提取时存在 var/data/my-data.tin 文件中,则改为从该文件获取内容。

用途举例:pp 大米可以通过 storage 来加载和存储黑白名单,优化 pp 大米的利用率。
dzp 3 years ago
parent
commit
aecfdeea55
3 changed files with 58 additions and 3 deletions
  1. 2 0
      .gitignore
  2. 4 3
      README.md
  3. 52 0
      plugins/lib/storage.tin

+ 2 - 0
.gitignore

@@ -35,3 +35,5 @@ out[1-9]
 
 var/*
 var
+
+data/*

+ 4 - 3
README.md

@@ -80,7 +80,7 @@ docker run --rm -it --name tt --hostname tt mudclient/paotin
 mkdir -p $HOME/my-paotin/
 
 # 创建游戏目录结构
-mkdir -p $HOME/my-paotin/{ids,etc,log,plugins}
+mkdir -p $HOME/my-paotin/{ids,etc,data,log,plugins}
 
 docker run -d -it --name tt --hostname tt -v $HOME/my-paotin:/paotin/var mudclient/paotin daemon
 ```
@@ -194,7 +194,8 @@ PaoTin++ 大部分模块源码文件都支持重定位,你可以在 `var/` 目
 Docker 方式下,可以将本地工作目录 mount 到容器内的 /paotin/var 目录,那么就可以实现容器内外的文件共享。
 
 ```
-mkdir -p $HOME/my-paotin   # 先创建一个本地工作目录
+# 先创建一个本地工作目录
+mkdir -p $HOME/my-paotin/{ids,etc,data,log,plugins}
 docker run -d -it --name tt --hostname tt -v $HOME/my-paotin:/paotin/var mudclient/paotin daemon
 ```
 
@@ -213,7 +214,7 @@ ID 配置文件和数据配置文件可分别放置在 `$HOME/my-paotin/ids/` 
 建议另外新建一个目录,用来存放你的源代码,并将 `var/` 目录通过符号链接指向该目录。例如:
 
 ```
-mkdir -p ../my-paotin/{etc,ids,plugins,log}
+mkdir -p ../my-paotin/{ids,etc,data,log,plugins}
 ln -s ../my-paotin var
 ```
 

+ 52 - 0
plugins/lib/storage.tin

@@ -0,0 +1,52 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分。
+PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+*/
+
+#var lib_storage[META] {
+    {NAME}      {通用存储引擎}
+    {DESC}      {可以存储和载入变量,这允许其它模块可以持久化自己的数据}
+    {AUTHOR}    {担子炮}
+};
+
+#function {lib_storage.Init} {
+    #local _ {@mkdir{data}};
+    #return {true};
+};
+
+#alias {storage.Save} {
+    #local file {%1};
+    #local vars {%2};
+
+    #class comm-store-tmp open;
+    #local var {};
+    #foreach {$vars} {var} {
+        #var {dump-$var} {${$var}};
+    };
+    #class comm-store-tmp close;
+
+    #local files {};
+    #line quiet #scan dir {var/data/} files;
+
+    #if { &files[] > 0 } {
+        #class comm-store-tmp write {var/data/${file}.tin};
+    };
+    #else {
+        #class comm-store-tmp write {data/${file}.tin};
+    };
+};
+
+#alias {storage.Load} {
+    #local file {%1};
+    #local vars  {%2};
+
+    #line quiet #class comm-store-tmp {assign} {load-file data/${file}.tin};
+    #local var {};
+    #foreach {$vars} {var} {
+        #var {$var} {${dump-$var}};
+    };
+    #class comm-store-tmp kill;
+};