storage.tin 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. ///=== {
  8. ///// storage 模块实现了一个通用的本地存储引擎。
  9. ///// 可以用来存储和载入变量,这允许其它模块可以持久化自己的数据。
  10. ///// 变量会被存储在本地文件系统当中,称之为「存储文件」。
  11. /////
  12. ///// 存储文件按规定会统一存放在 data 目录下,支持文件重定位。也就是说,
  13. ///// 对于存储文件 file1 来说,其可能的物理存放位置为:
  14. ///// 1. var/data/file1.tin (优先)
  15. ///// 2. data/file1.tin (其次)
  16. /////
  17. ///// 各模块可以通过 API storage.Save 按需创建自己的存储文件,在其中存储一个或多个
  18. ///// 变量,并在需要时通过 API storage.Load 提取这些变量。
  19. /////
  20. ///// 另外,storage 模块自行维护了一个全局存储文件。在简单使用场景下,其它模块
  21. ///// 可以通过 API storage.SetGlobal 和 storage.GetGlobal 来读写这个全局存储文件。
  22. ///// 这对读写少量的数据显得更加方便。
  23. ///// };
  24. #var lib_storage[META] {
  25. {NAME} {通用存储引擎}
  26. {DESC} {可以存储和载入变量,这允许其它模块可以持久化自己的数据}
  27. {AUTHOR} {担子炮}
  28. };
  29. VAR {存储路径} storage-path {data};
  30. #func {lib_storage.Init} {
  31. #local _ {@mkdir{data}};
  32. #local files {};
  33. #line quiet #scan dir {var/data/} files;
  34. #if { &files[] > 0 } {
  35. #var storage-path {var/data};
  36. };
  37. storage.Load {storage} {storage-globals};
  38. dbgLog storage 全局存储项已加载。;
  39. #return {true};
  40. };
  41. ///=== {
  42. // ## storage.Save <文件名> <变量名1> [...]
  43. // 将由变量名列表所指定的变量及其值存储到指定的存储文件中。
  44. // };
  45. #alias {storage.Save} {
  46. #local file {%1};
  47. #local vars {%2};
  48. #if { "$file" == "" || "$vars" == "" } {
  49. xtt.Usage storage.Save;
  50. #return;
  51. };
  52. #class comm-store-tmp open;
  53. #local var {};
  54. #foreach {$vars} {var} {
  55. #local count {&{${var}[]}};
  56. #if { $count < 100 } {
  57. #var {dump-$var} {${$var}};
  58. dbgLog storage 变量 $var 已写入磁盘。共有 @math.Max{$count;1} 个数据项。;
  59. #continue;
  60. };
  61. #local idx {0};
  62. #loop 1 {$count} {idx} {
  63. #local key {*{${var}[+$idx]}};
  64. #local value {${${var}[+$idx]}};
  65. #var {dump-${var}[$key]} {$value};
  66. };
  67. dbgLog storage 变量 $var 已写入磁盘。共有 $count 个数据项。;
  68. };
  69. #class comm-store-tmp close;
  70. #class comm-store-tmp write {$storage-path/${file}.tin};
  71. #class comm-store-tmp kill;
  72. };
  73. ///=== {
  74. // ## storage.Load <文件名> <变量名1> [...]
  75. // 从指定的存储文件中加载变量。
  76. // 存储文件中实际存储的变量可能更多一些,但本函数可以只加载其中一部分变量。
  77. // };
  78. #alias {storage.Load} {
  79. #local file {%1};
  80. #local vars {%2};
  81. #if { "$file" == "" || "$vars" == "" } {
  82. xtt.Usage storage.Load;
  83. #return;
  84. };
  85. #line quiet #class comm-store-tmp {assign} {load-file data/${file}.tin};
  86. #local var {};
  87. #foreach {$vars} {var} {
  88. #local count {&{dump-${var}[]}};
  89. #if { $count < 100 } {
  90. #var {$var} {${dump-$var}};
  91. dbgLog storage 已从磁盘中加载变量 $var,共有 @math.Max{$count;1} 个数据项。;
  92. #continue;
  93. };
  94. #local idx {0};
  95. #loop 1 {$count} {idx} {
  96. #local key {*{dump-${var}[+$idx]}};
  97. #local value {${dump-${var}[+$idx]}};
  98. #var {${var}[$key]} {$value};
  99. };
  100. dbgLog storage 已从磁盘中加载变量 $var,共有 $count 个数据项。;
  101. };
  102. #class comm-store-tmp kill;
  103. };
  104. ///=== {
  105. // ## storage.SetGlobal <KEY> [<值>]
  106. // 将值关联到 KEY 上,并存储到全局存储文件中。
  107. // 参见 storage.GetGlobal
  108. // };
  109. #alias {storage.SetGlobal} {
  110. #local key {%1};
  111. #local value {%2};
  112. #if { "$key" == "" } {
  113. xtt.Usage storage.SetGlobal;
  114. #return;
  115. };
  116. #var storage-globals[$key] {$value};
  117. storage.Save {storage} {storage-globals};
  118. dbgLog storage 全局存储项已写入磁盘。;
  119. };
  120. ///=== {
  121. // #@ storage.GetGlobal <KEY>
  122. // 从全局存储文件中根据 KEY 提取值。
  123. // 参见 storage.SetGlobal
  124. // };
  125. #func {storage.GetGlobal} {
  126. #local key {%1};
  127. #if { "$key" == "" } {
  128. xtt.Usage storage.SetGlobal;
  129. #return {};
  130. };
  131. #return {$storage-globals[$key]};
  132. };