buildz 0.6.33__tar.gz → 0.6.35__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. {buildz-0.6.33/buildz.egg-info → buildz-0.6.35}/PKG-INFO +3 -1
  2. {buildz-0.6.33 → buildz-0.6.35}/README.md +2 -0
  3. {buildz-0.6.33 → buildz-0.6.35}/buildz/__init__.py +1 -1
  4. buildz-0.6.35/buildz/db/__init__.py +4 -0
  5. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/basez.py +78 -14
  6. buildz-0.6.35/buildz/db/dv/mysqlz.py +73 -0
  7. buildz-0.6.35/buildz/db/dv/oraclez.py +94 -0
  8. buildz-0.6.35/buildz/db/dv/orm.py +194 -0
  9. buildz-0.6.35/buildz/db/dv/sqlite3z.py +105 -0
  10. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/structz.py +21 -4
  11. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/runz.py +27 -17
  12. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/tls.py +2 -0
  13. {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/dirz.py +6 -0
  14. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/__init__.py +2 -2
  15. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/listmapz.py +22 -1
  16. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/mapz.py +11 -5
  17. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/readz.py +23 -8
  18. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/write.py +18 -6
  19. buildz-0.6.35/buildz/xf/writer/deal/listmapz.py +51 -0
  20. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/mg.py +13 -1
  21. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/xargs.py +1 -1
  22. {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/trs.py +2 -0
  23. {buildz-0.6.33 → buildz-0.6.35/buildz.egg-info}/PKG-INFO +3 -1
  24. {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/SOURCES.txt +1 -0
  25. {buildz-0.6.33 → buildz-0.6.35}/setup.py +1 -1
  26. buildz-0.6.33/buildz/db/__init__.py +0 -2
  27. buildz-0.6.33/buildz/db/dv/mysqlz.py +0 -40
  28. buildz-0.6.33/buildz/db/dv/oraclez.py +0 -61
  29. buildz-0.6.33/buildz/db/dv/orm.py +0 -36
  30. buildz-0.6.33/buildz/db/dv/sqlite3z.py +0 -41
  31. {buildz-0.6.33 → buildz-0.6.35}/LICENSE +0 -0
  32. {buildz-0.6.33 → buildz-0.6.35}/MANIFEST.in +0 -0
  33. {buildz-0.6.33 → buildz-0.6.35}/buildz/__main__.py +0 -0
  34. {buildz-0.6.33 → buildz-0.6.35}/buildz/argx.py +0 -0
  35. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/__init__.py +0 -0
  36. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/cache.py +0 -0
  37. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/config.py +0 -0
  38. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/dbs.py +0 -0
  39. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal.py +0 -0
  40. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal_list.py +0 -0
  41. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/deal_type.py +0 -0
  42. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/defs.py +0 -0
  43. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/factory.py +0 -0
  44. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/init.py +0 -0
  45. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/log.py +0 -0
  46. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/request.py +0 -0
  47. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/run.py +0 -0
  48. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/save.py +0 -0
  49. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/cache/cache.js +0 -0
  50. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/config/base.js +0 -0
  51. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/config/config.js +0 -0
  52. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/fp.js +0 -0
  53. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/item1.js +0 -0
  54. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/item2.js +0 -0
  55. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/res/data/test.js +0 -0
  56. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/test.py +0 -0
  57. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/test/xtest.py +0 -0
  58. {buildz-0.6.33 → buildz-0.6.35}/buildz/auto/verify.py +0 -0
  59. {buildz-0.6.33 → buildz-0.6.35}/buildz/base.py +0 -0
  60. {buildz-0.6.33 → buildz-0.6.35}/buildz/cmd.py +0 -0
  61. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/__main__.py +0 -0
  62. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/__init__.py +0 -0
  63. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/clickhousez.py +0 -0
  64. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/lib/readme +0 -0
  65. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/dv/postgresqlz.py +0 -0
  66. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/install.txt +0 -0
  67. {buildz-0.6.33 → buildz-0.6.35}/buildz/db/run.conf +0 -0
  68. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/ioc/deal.py +0 -0
  69. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/ioc/help.py +0 -0
  70. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/myers/deal.py +0 -0
  71. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/myers/help.py +0 -0
  72. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/ioc.js +0 -0
  73. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/main.js +0 -0
  74. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/myers.js +0 -0
  75. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/search.js +0 -0
  76. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/conf/xf.js +0 -0
  77. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/default.js +0 -0
  78. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/ioc.js +0 -0
  79. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/myers.js +0 -0
  80. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/search.js +0 -0
  81. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/help/xf.js +0 -0
  82. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/res/test.js +0 -0
  83. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/search/deal.py +0 -0
  84. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/search/help.py +0 -0
  85. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/test.py +0 -0
  86. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/xf/deal.py +0 -0
  87. {buildz-0.6.33 → buildz-0.6.35}/buildz/demo/xf/help.py +0 -0
  88. {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/__init__.py +0 -0
  89. {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/fhs.py +0 -0
  90. {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/fio.py +0 -0
  91. {buildz-0.6.33 → buildz-0.6.35}/buildz/fz/lsf.py +0 -0
  92. {buildz-0.6.33 → buildz-0.6.35}/buildz/html/__init__.py +0 -0
  93. {buildz-0.6.33 → buildz-0.6.35}/buildz/html/test/demo.html +0 -0
  94. {buildz-0.6.33 → buildz-0.6.35}/buildz/html/test/test.py +0 -0
  95. {buildz-0.6.33 → buildz-0.6.35}/buildz/html/xml.py +0 -0
  96. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/__init__.py +0 -0
  97. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/base.py +0 -0
  98. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/init.py +0 -0
  99. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/base.py +0 -0
  100. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/conf.py +0 -0
  101. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/confs.py +0 -0
  102. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/decorator.py +0 -0
  103. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc/single.py +0 -0
  104. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/base.py +0 -0
  105. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/branch.py +0 -0
  106. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/call.py +0 -0
  107. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/calls.py +0 -0
  108. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/branch_lists.js +0 -0
  109. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/call_defaults.js +0 -0
  110. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/call_lists.js +0 -0
  111. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/calls_defaults.js +0 -0
  112. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/calls_lists.js +0 -0
  113. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/deal_lists.js +0 -0
  114. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/deals.js +0 -0
  115. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/env_lists.js +0 -0
  116. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ioc_lists.js +0 -0
  117. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/iocf_lists.js +0 -0
  118. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/join_lists.js +0 -0
  119. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/list_lists.js +0 -0
  120. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/map_lists.js +0 -0
  121. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/mcall_defaults.js +0 -0
  122. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/mcall_lists.js +0 -0
  123. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_cst_lists.js +0 -0
  124. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_defaults.js +0 -0
  125. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_lists.js +0 -0
  126. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/obj_set_lists.js +0 -0
  127. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ovar_lists.js +0 -0
  128. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/ref_lists.js +0 -0
  129. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/refs_lists.js +0 -0
  130. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/var_lists.js +0 -0
  131. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/xfile_defaults.js +0 -0
  132. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/conf/xfile_lists.js +0 -0
  133. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/deal.py +0 -0
  134. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/demo.py +0 -0
  135. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/env.py +0 -0
  136. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/init.py +0 -0
  137. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ioc.py +0 -0
  138. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/iocf.py +0 -0
  139. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/join.py +0 -0
  140. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/list.py +0 -0
  141. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/map.py +0 -0
  142. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/mcall.py +0 -0
  143. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/obj.py +0 -0
  144. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ovar.py +0 -0
  145. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/ref.py +0 -0
  146. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/refs.py +0 -0
  147. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/val.py +0 -0
  148. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/var.py +0 -0
  149. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/ioc_deal/xfile.py +0 -0
  150. {buildz-0.6.33 → buildz-0.6.35}/buildz/ioc/wrap.py +0 -0
  151. {buildz-0.6.33 → buildz-0.6.35}/buildz/logz.py +0 -0
  152. {buildz-0.6.33 → buildz-0.6.35}/buildz/pyz.py +0 -0
  153. {buildz-0.6.33 → buildz-0.6.35}/buildz/tools.py +0 -0
  154. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/__init__.py +0 -0
  155. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/myers_diff.py +0 -0
  156. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/test_xfind.py +0 -0
  157. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/time/__init__.py +0 -0
  158. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/time/timez.py +0 -0
  159. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/__init__.py +0 -0
  160. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/base.py +0 -0
  161. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/getch.py +0 -0
  162. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/lx.py +0 -0
  163. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/test.py +0 -0
  164. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/tio/win.py +0 -0
  165. {buildz-0.6.33 → buildz-0.6.35}/buildz/tz/xfind.py +0 -0
  166. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/__main__.py +0 -0
  167. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/code.py +0 -0
  168. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/code_modify.py +0 -0
  169. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/copy_old.py +0 -0
  170. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/file.py +0 -0
  171. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/base.py +0 -0
  172. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/buffer.py +0 -0
  173. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/listz.py +0 -0
  174. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/lr.py +0 -0
  175. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/lrval.py +0 -0
  176. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/mapz.py +0 -0
  177. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/nextz.py +0 -0
  178. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/reval.py +0 -0
  179. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/setz.py +0 -0
  180. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/spc.py +0 -0
  181. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/spt.py +0 -0
  182. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/deal/strz.py +0 -0
  183. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/exp.py +0 -0
  184. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/item.py +0 -0
  185. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/mg.py +0 -0
  186. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loader/pos.py +0 -0
  187. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/base.py +0 -0
  188. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/buffer.py +0 -0
  189. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/listz.py +0 -0
  190. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/lr.py +0 -0
  191. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/lrval.py +0 -0
  192. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/mapz.py +0 -0
  193. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/nextz.py +0 -0
  194. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/reval.py +0 -0
  195. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/setz.py +0 -0
  196. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/spc.py +0 -0
  197. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/spt.py +0 -0
  198. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz.py +0 -0
  199. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz_new.py +0 -0
  200. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/deal/strz_old.py +0 -0
  201. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/exp.py +0 -0
  202. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/item.py +0 -0
  203. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/mg.py +0 -0
  204. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/pos.py +0 -0
  205. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/test.py +0 -0
  206. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/loaderz/test1.py +0 -0
  207. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/read.py +0 -0
  208. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/stack.py +0 -0
  209. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/base.py +0 -0
  210. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/conf.py +0 -0
  211. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/jsonval.py +0 -0
  212. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/listz.py +0 -0
  213. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/mapz.py +0 -0
  214. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/reval.py +0 -0
  215. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/deal/strz.py +0 -0
  216. {buildz-0.6.33 → buildz-0.6.35}/buildz/xf/writer/itemz.py +0 -0
  217. {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/__init__.py +0 -0
  218. {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/conf.js +0 -0
  219. {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/data.js +0 -0
  220. {buildz-0.6.33 → buildz-0.6.35}/buildz/xz/test.py +0 -0
  221. {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/dependency_links.txt +0 -0
  222. {buildz-0.6.33 → buildz-0.6.35}/buildz.egg-info/top_level.txt +0 -0
  223. {buildz-0.6.33 → buildz-0.6.35}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buildz
3
- Version: 0.6.33
3
+ Version: 0.6.35
4
4
  Summary: 配置读写(基于json格式进行简化)、ioc、以及其他工具代码。a json-base file format's read and write code by python, and codes to read and product object from configure file in such format(ioc), and other tool codes
5
5
  Home-page: https://github.com/buildCodeZ/buildz
6
6
  Author: Zzz
@@ -34,6 +34,8 @@ License-File: LICENSE
34
34
  运行python -m buildz查看帮助
35
35
 
36
36
  持续更新中。。。
37
+ 2024/12/18:
38
+ 增加数据映射xz,数据库db增加类似orm功能以及表和索引结构查询功能(目前只写了mysql,oracle,sqlite3的查询),配置文件读写xf的输出增加对ListMap的支持(dumpx, dumpxf)
37
39
  2024/11/11:
38
40
  新增buildz.tz.xfind,对json做查询用的,功能类似jsonpath,自己实现的原因是好玩,以及不想为了用jsonpath去学对应的语法
39
41
  2024/10/08:
@@ -21,6 +21,8 @@
21
21
  运行python -m buildz查看帮助
22
22
 
23
23
  持续更新中。。。
24
+ 2024/12/18:
25
+ 增加数据映射xz,数据库db增加类似orm功能以及表和索引结构查询功能(目前只写了mysql,oracle,sqlite3的查询),配置文件读写xf的输出增加对ListMap的支持(dumpx, dumpxf)
24
26
  2024/11/11:
25
27
  新增buildz.tz.xfind,对json做查询用的,功能类似jsonpath,自己实现的原因是好玩,以及不想为了用jsonpath去学对应的语法
26
28
  2024/10/08:
@@ -1,6 +1,6 @@
1
1
  #coding=utf-8
2
2
 
3
- __version__="0.6.31"
3
+ __version__="0.6.34"
4
4
 
5
5
  # 小号多
6
6
  __author__ = "Zzz, emails: 1174534295@qq.com, 1309458652@qq.com"
@@ -0,0 +1,4 @@
1
+
2
+ from .tls import *
3
+ from .dv import orm
4
+ from .runz import cmd, make
@@ -1,6 +1,7 @@
1
1
  import sys
2
2
  from .structz import ItDv
3
3
  from buildz.db import tls
4
+ from buildz import xf
4
5
  def sp(obj):
5
6
  return super(obj.__class__, obj)
6
7
 
@@ -9,21 +10,71 @@ class SimpleDv(ItDv):
9
10
  # func to impl:
10
11
  def to_list(self, query_result):
11
12
  return []
12
- def sql_tables(self):
13
- return "select TABLE_NAME tableName,TABLE_COMMENT comemnt,TABLE_ROWS dataNums from information_schema.tables where table_schema='"+self.db+"'"
13
+ def sql_tables(self, table = None):
14
+ """
15
+ if not note, use name instead
16
+ require:
17
+ table_name, table_note
18
+ """
19
+ raise Exception("unimplement")
20
+ return None
21
+ def sql_columns(self, table):
22
+ """
23
+ require:
24
+ table_name, column_name, column_type, column_default, nullable, column_offset, column_note
25
+ """
26
+ raise Exception("unimplement")
27
+ return None
28
+ def sql_indexes(self, table=None):
29
+ """
30
+ require:
31
+ table_name, index_name, is_unique, index_type, index_note
32
+ """
33
+ raise Exception("unimplement")
34
+ return None
35
+ def sql_index_keys(self, table, index):
36
+ """
37
+ require:
38
+ table_name, index_name, column_name, index_offset, column_note
39
+ """
40
+ raise Exception("unimplement")
41
+ return None
14
42
  def new_con(self):
15
43
  return None
16
44
  def new_cursor(self):
17
45
  return None
18
46
  def init(self, *argv, **maps):
19
47
  pass
48
+ def tables(self, table=None, as_map=None):
49
+ sql = self.sql_tables(table)
50
+ return self.query(sql, as_map=as_map)
51
+ def columns(self, table, as_map=None):
52
+ sql = self.sql_columns(table)
53
+ return self.query(sql, as_map=as_map)
54
+ def indexes(self, table=None, index=None, as_map=None):
55
+ sql = self.sql_indexes(table, index)
56
+ return self.query(sql, as_map=as_map)
57
+ def index_keys(self, table, index, as_map=None):
58
+ sql = self.sql_index_keys(table, index)
59
+ return self.query(sql, as_map=as_map)
20
60
  # func already impl
21
61
  def check_query(self, s):
22
62
  arr = s.split(" ")
23
63
  k = arr[0].strip().lower()
24
- rst = k not in "delete,insert,update,create,drop,commit".split(",")
64
+ rst = k not in "delete,insert,update,create,drop,commit,alter".split(",")
65
+ return rst
66
+ def out_list(self, query_result, as_map=None):
67
+ if as_map is None:
68
+ as_map = self.as_map
69
+ rst = self.to_list(query_result)
70
+ if as_map and len(rst)>0:
71
+ if len(rst)==1:
72
+ return []
73
+ keys = rst[0]
74
+ rst = rst[1:]
75
+ rst = [{k:v for k,v in zip(keys, dt)} for dt in rst]
25
76
  return rst
26
- def __init__(self, host, port, user, pwd, db, *argv, **maps):
77
+ def __init__(self, host, port, user, pwd, db, as_map=False, *argv, **maps):
27
78
  self.host = host
28
79
  self.port = port
29
80
  self.user = user
@@ -31,10 +82,13 @@ class SimpleDv(ItDv):
31
82
  self.db = db
32
83
  self.con = None
33
84
  self.cursor = None
85
+ self.as_map = as_map
34
86
  self.init(*argv, **maps)
35
87
  def begin(self):
36
88
  self.con = self.new_con()
37
89
  self.cursor = self.new_cursor()
90
+ def open(self):
91
+ self.begin()
38
92
  def close(self):
39
93
  self.cursor.close()
40
94
  self.con.close()
@@ -49,14 +103,23 @@ class SimpleDv(ItDv):
49
103
  def refresh(self):
50
104
  self.cursor.close()
51
105
  self.cursor = self.new_cursor()
52
- def query(self, sql, vals=()):
106
+ def query(self, sql, vals=(), as_map = None):
53
107
  # return list, first row is key
54
108
  tmp = self.cursor.execute(sql, vals)
55
109
  #print("[TESTZ] exe:",tmp)
56
110
  rst = self.cursor.fetchall()
57
- return self.to_list(rst)
58
- def execute(self, sql, vals=()):
111
+ return self.out_list(rst, as_map)
112
+ def executes(self, sqls, commit=False):
113
+ if type(sqls)==str:
114
+ sqls = sqls.split(";")
115
+ sqls = [sql.strip() for sql in sqls if sql.strip()!=""]
116
+ _ = [self.execute(sql) for sql in sqls]
117
+ if commit:
118
+ self.execute("commit;")
119
+ def execute(self, sql, vals=(), commit=False):
59
120
  tmp = self.cursor.execute(sql, vals)
121
+ if commit:
122
+ self.cursor.execute("commit;")
60
123
  return tmp
61
124
  def insert_or_update(self, maps, table, keys = None):
62
125
  if type(maps)!=dict:
@@ -77,7 +140,7 @@ class SimpleDv(ItDv):
77
140
  v = maps[k]
78
141
  if type(v)==str:
79
142
  v = f"'{v}'"
80
- if v not is None:
143
+ if v is not None:
81
144
  cond = f"{k} = {v}"
82
145
  else:
83
146
  cond = f"{k} is null"
@@ -85,25 +148,25 @@ class SimpleDv(ItDv):
85
148
  if need_query:
86
149
  conds = " and ".join(conds)
87
150
  sql_search = f"select count(*) from {table} where {conds}"
88
- rst = self.query(sql_search)[1][0]
151
+ rst = self.query(sql_search, as_map = False)[1][0]
89
152
  update = rst>0
90
153
  if update:
91
154
  keys = set(keys)
92
155
  kvs = [[k,tls.py2sql(v)] for k,v in maps.items() if k not in keys]
93
- sets = [f"{k}={v}"]
156
+ sets = [f"{k}={v}" for k,v in kvs]
94
157
  sets = ",".join(sets)
95
158
  sql = f"update {table} set {sets} where {conds}"
96
159
  else:
97
- kvs = [k, tls.py2sql(v) for k,v in maps.items()]
160
+ kvs = [[k, tls.py2sql(v)] for k,v in maps.items()]
98
161
  ks = ",".join([kv[0] for kv in kvs])
99
- vs = ",".join([kv[1] for kv in kvs])
162
+ vs = ",".join([str(kv[1]) for kv in kvs])
100
163
  sql = f"insert into {table}({ks}) values({vs});"
101
164
  return self.execute(sql)
102
165
 
103
166
  pass
104
167
 
105
168
  # user|pwd@host:port/db
106
- def fetch(args):
169
+ def fetch(args, conf={}):
107
170
  """
108
171
  host[:port][/db][ user][ pwd]
109
172
  host:port/db user pwd
@@ -133,6 +196,7 @@ def fetch(args):
133
196
  pwd = args[2]
134
197
  if pwd is not None:
135
198
  pwd = pwd.strip()
136
- return host, port, user, pwd, db
199
+ as_map = xf.g(conf, as_map=False)
200
+ return host, port, user, pwd, db, as_map
137
201
 
138
202
  pass
@@ -0,0 +1,73 @@
1
+ try:
2
+ import pymysql
3
+ except ModuleNotFoundError:
4
+ raise Exception("module not found, try: pip install pymysql")
5
+ import sys
6
+ from .basez import SimpleDv, fetch
7
+ from .structz import CMD
8
+ class Db(SimpleDv):
9
+ # func to impl:
10
+ def to_list(self, rst):
11
+ result = []
12
+ if rst is None or len(rst)==0:
13
+ return result
14
+ a = rst[0]
15
+ keys = list(a.keys())
16
+ result.append(keys)
17
+ for obj in rst:
18
+ v = [obj[k] for k in keys]
19
+ result.append(v)
20
+ return result
21
+ def new_con(self):
22
+ return pymysql.connect(host=self.host,
23
+ port = self.port, user =self.user,
24
+ password =self.pwd, database = self.db,
25
+ charset='utf8',init_command="SET SESSION time_zone='+08:00'")
26
+ def new_cursor(self):
27
+ return self.con.cursor(pymysql.cursors.DictCursor)
28
+ def init(self, *argv, **maps):
29
+ if self.port is None:
30
+ self.port = 3306
31
+ pass
32
+ def sql_tables(self, table = None):
33
+ """
34
+ if not note, use name instead
35
+ require:
36
+ table_name, table_note
37
+ """
38
+ query_table = ""
39
+ if table is not None:
40
+ query_table = f" and table_name = '{table}'"
41
+ return f"select table_name, table_comment as table_note from information_schema.tables where table_schema='{self.db}' {query_table};"
42
+ def sql_columns(self, table):
43
+ """
44
+ require:
45
+ table_name, column_name, column_type, column_default, nullable, column_offset, column_note
46
+ """
47
+ return f"select table_name, column_name, column_type, column_default, is_nullable as nullable, ordinal_position as column_offset, column_comment as column_note from information_schema.columns where table_schema='{self.db}' and table_name = '{table}' order by ordinal_position asc;"
48
+ def sql_indexes(self, table=None, index=None):
49
+ """
50
+ require:
51
+ table_name, index_name, is_unique, index_type, index_note
52
+ """
53
+ query_table = ""
54
+ if table is not None:
55
+ query_table = f" and table_name = '{table}'"
56
+ if index is not None:
57
+ query_table+= f" and index_name='{index}'"
58
+ return f"select table_name, index_name, 1-any_value(non_unique) as is_unique, any_value(index_type) as index_type, any_value(index_comment) as index_note from information_schema.statistics where table_schema='{self.db}' {query_table} group by index_name;"
59
+ def sql_index_keys(self, table, index):
60
+ """
61
+ require:
62
+ table_name, index_name, column_name, index_offset, column_note
63
+ """
64
+ return f"select table_name, index_name, column_name, seq_in_index as index_offset, comment as column_note from information_schema.statistics where table_name='{table}' and table_schema='{self.db}' and index_name = '{index}' order by seq_in_index asc;"
65
+
66
+ pass
67
+ def build(argv, conf):
68
+ dv = Db(*fetch(argv))
69
+ return dv
70
+ def buildbk(argv, conf):
71
+ return CMD(make(argv, conf))
72
+
73
+ pass
@@ -0,0 +1,94 @@
1
+
2
+ import os
3
+ import sys
4
+ dp = os.path.dirname(__file__)
5
+ gdp = os.path.join(dp, "lib")
6
+
7
+ def init_path(dp):
8
+ path = os.environ["PATH"]
9
+ if sys.platform.lower().find("win")>=0:
10
+ cb = ";"
11
+ else:
12
+ cb = ":"
13
+ path = path +cb+dp
14
+ os.environ["PATH"] = path
15
+
16
+ pass
17
+
18
+ #init_path(dp)
19
+ import sys
20
+ from .basez import SimpleDv, fetch
21
+ from .structz import CMD
22
+ class Db(SimpleDv):
23
+ # func to impl:
24
+ def to_list(self, rst):
25
+ rows = self.cursor.description
26
+ keys = [k[0].lower() for k in rows]
27
+ result = []
28
+ result.append(keys)
29
+ if rst is None or len(rst)==0:
30
+ return result
31
+ result += rst
32
+ return result
33
+ def new_con(self):
34
+ if self.port is not None:
35
+ add = ":"+str(self.port)
36
+ else:
37
+ add = ""
38
+ try:
39
+ import cx_Oracle as pymysql
40
+ except ModuleNotFoundError:
41
+ raise Exception("module not found, try: pip install cx-Oracle")
42
+ return pymysql.connect(self.user, self.pwd, self.host+add+"/"+self.db)
43
+ def new_cursor(self):
44
+ return self.con.cursor()
45
+ def init(self, *argv, **maps):
46
+ pass
47
+ def sql_tables(self, table = None):
48
+ """
49
+ if not note, use name instead
50
+ require:
51
+ table_name, table_note
52
+ """
53
+ query_table = ""
54
+ if table is not None:
55
+ query_table = f" and t.table_name = '{table.upper()}'"
56
+ return f"select t.table_name as table_name, tc.comments as table_note from all_tables t inner join all_tab_comments tc on t.table_name=tc.table_name where t.owner='{self.user.upper()}' {query_table}"
57
+ def sql_columns(self, table):
58
+ """
59
+ require:
60
+ table_name, column_name, column_type, column_default, nullable, column_offset, column_note
61
+ """
62
+ return f"select c.table_name as table_name, c.column_name as column_name, c.data_type|| '(' ||c.data_length||','||c.data_precision||','||c.data_scale||')' as column_type, c.data_default as column_default, c.nullable as nullable, c.column_id as column_offset, cc.comments as column_note from all_tab_columns c inner join all_col_comments cc on c.column_name=cc.column_name and c.table_name=cc.table_name where c.table_name='{table.upper()}' order by c.column_id asc"
63
+ def sql_indexes(self, table=None, index=None):
64
+ """
65
+ require:
66
+ table_name, index_name, is_unique, index_type, index_note
67
+ """
68
+ query_table = ""
69
+ if table is not None:
70
+ query_table = f" and table_name = '{table.upper()}'"
71
+ if index is not None:
72
+ query_table+= f" and index_name='{index.upper()}'"
73
+ return f"select table_name, index_name, case uniqueness when 'UNIQUE' then 1 else 0 end as is_unique, index_type, '' as index_note from all_indexes where owner = '{self.user.upper()}'{query_table}"
74
+ def sql_index_keys(self, table, index):
75
+ """
76
+ require:
77
+ table_name, index_name, column_name, index_offset, column_note
78
+ """
79
+ return f"select table_name, index_name, column_name, column_position as index_offset, '' as note from all_ind_columns where index_name='{index.upper()}' and table_name='{table.upper()}' order by column_position asc"
80
+
81
+ pass
82
+ def build(argv, conf):
83
+ k = 'oracle_lib'
84
+ dp = gdp
85
+ if k in conf:
86
+ dp = conf[k]
87
+ init_path(dp)
88
+ #print(f"oracle lib: {dp}")
89
+ dv = Db(*fetch(argv))
90
+ return dv
91
+ def buildbk(argv, conf):
92
+ return CMD(make(argv, conf))
93
+
94
+ pass
@@ -0,0 +1,194 @@
1
+ #coding=utf-8
2
+
3
+ from buildz import Base
4
+ from buildz.db import tls
5
+ from buildz import xf
6
+ def dict2list(data):
7
+ rst = []
8
+ for k,v in data.items():
9
+ if type(v) not in (list, tuple):
10
+ v = [v]
11
+ tmp = [k]+list(v)
12
+ rst.append(tmp)
13
+ return rst
14
+ def deal_item(item, conf):
15
+ key = item[0]
16
+ if key in "sql_before,sql_after,sql_delete_before,sql_delete_after".split(","):
17
+ conf[key].append(item[1])
18
+ else:
19
+ conf[key] = item[1]
20
+ def deal_key(it, conf):
21
+ data_keys = xf.g(conf, data_keys=[])
22
+ tmp = {}
23
+ for i in range(min(len(it), len(data_keys))):
24
+ tmp[data_keys[i]] = it[i]
25
+ sql_key = tmp['sql_key']
26
+ sql_def = tmp['sql_def']
27
+ py_key = xf.g(tmp, py_key=None)
28
+ if py_key is not None:
29
+ xf.g(conf, py2sqls={})[py_key] = sql_key
30
+ xf.g(conf, keys=[]).append(sql_key)
31
+ xf.g(conf, vars=[]).append(sql_key+" "+sql_def)
32
+ def makes(datas, data_keys = "sql_key,sql_def,py_key".split(",")):
33
+ if type(datas)==dict:
34
+ rst = [make(v, k) for k,v in datas.items()]
35
+ else:
36
+ rst = [make(it) for it in datas]
37
+ return rst
38
+ def make(data, table=None, data_keys = "sql_key,sql_def,py_key".split(",")):
39
+ """
40
+ 从配置中生成建表语句,删表语句和orm对象
41
+ 输入:
42
+ data: dict or list
43
+ dict: {
44
+ (其他配置)
45
+ (其他配置)
46
+ 表字段: [sql字段定义, 转py后字段名]
47
+ 表字段: sql字段定义
48
+ }
49
+ list: [
50
+ ((其他配置))
51
+ ((其他配置))
52
+ [表字段, sql字段定义, 转py后字段名]
53
+ [表字段, sql字段定义]
54
+ ]
55
+ 其他配置:
56
+ 格式: key, val
57
+ key:
58
+ table: 表名
59
+ query_keys: 默认null,orm做插入/更新时,判断数据是插入还是更新的查询方式
60
+ auto_translate: 默认true,如果没有配置“转py后字段名”,是否自动转(a_b=>aB)
61
+ sql_before: 新增一条建表前sql语句
62
+ sql_after: 新增一条建表后sql语句
63
+ sql_delete_before: 新增一条删表前sql语句
64
+ sql_delete_after: 新增一条删表后sql语句
65
+ data_keys: 默认[sql_key, sql_def, py_key],非配置项怎么解析,不建议改
66
+ table: 表名
67
+ 输出:
68
+ [[sql_create, sql_delete], orm_obj]
69
+ """
70
+ if xf.is_args(data):
71
+ confs = data.lists
72
+ confs =[[it] for it in confs]
73
+ data = dict2list(data.maps)
74
+ data = confs+data
75
+ elif type(data) == dict:
76
+ data = dict2list(data)
77
+ conf = {}
78
+ xf.s(conf, sql_before = [], sql_after = [], sql_delete_before=[], sql_delete_after=[],auto_translate=True,table=table,keys=[],py2sqls={},query_keys=None, data_keys = data_keys, vars=[])
79
+ for it in data:
80
+ if len(it)==1 and type(it[0]) in (list, tuple):
81
+ deal_item(it[0], conf)
82
+ else:
83
+ deal_key(it, conf)
84
+ table = xf.g(conf, table=table)
85
+ vars = xf.g(conf, vars = [])
86
+ vars = ",".join(vars)
87
+ assert table is not None
88
+ sql = f"create table if not exists {table}({vars})"
89
+ sql_del = f"drop table if exists {table}"
90
+ sqls = xf.g(conf, sql_before=[], sql_after=[], sql_delete_before=[], sql_delete_after=[])
91
+ #sqls = [";".join(k) for k in sqls]
92
+ sqls_crt = sqls[0]+[sql]+sqls[1]
93
+ sqls_del = sqls[2]+[sql_del]+sqls[3]
94
+ sqls = [sqls_crt, sqls_del]
95
+ sqls = [(";\n".join(k)+";").replace(";;",";") for k in sqls]
96
+ obj = TableObject(*xf.g(conf, keys=[], table=table, py2sqls = None, query_keys=None,auto_translate=True), sql_create = sqls[0], sql_delete = sqls[1])
97
+ return sqls, obj
98
+
99
+ pass
100
+
101
+ class TableObject(Base):
102
+ """
103
+ 字段映射
104
+ keys: 表字段
105
+ table: 表名
106
+ py2sqls: 自定义映射
107
+ query_keys: 唯一索引(判断数据重复)
108
+ auto_translate:
109
+ 对于没有在py2sqls自定义映射的表字段,是否自动转换(py|autoTran<=>auto_tran|sql)
110
+ """
111
+ def init(self, keys, table=None, py2sqls=None, query_keys=None, auto_translate=True, dv = None, sql_create=None, sql_delete=None):
112
+ if table is None:
113
+ table = tls.lower(self.__class__.__name__)
114
+ self.table = table
115
+ if py2sqls is None:
116
+ py2sqls = {}
117
+ if type(py2sqls) in (list, tuple):
118
+ py2sqls = {k[0]:k[1] for k in py2sqls}
119
+ sql2pys = {}
120
+ for k_py, k_sql in py2sqls.items():
121
+ sql2pys[k_sql] = k_py
122
+ for key in keys:
123
+ if key not in sql2pys:
124
+ k_py, k_sql = key,key
125
+ if auto_translate:
126
+ k_py,k_sql = tls.upper(key), tls.lower(key)
127
+ py2sqls[k_py] = k_sql
128
+ sql2pys[k_sql] = k_py
129
+ self.py2sqls = py2sqls
130
+ self.sql2pys = sql2pys
131
+ self.keys = keys
132
+ if query_keys is None:
133
+ query_keys = []
134
+ self.query_keys = query_keys
135
+ self.dv = dv
136
+ self.py2sql=self.toSql
137
+ self.sql2py = self.toPy
138
+ self.sql_create = sql_create
139
+ self.sql_delete = sql_delete
140
+ def create(self, dv=None):
141
+ assert self.sql_create is not None
142
+ dv = self.rdv(dv)
143
+ dv.executes(self.sql_create)
144
+ def delete(self, dv=None):
145
+ assert self.sql_delete is not None
146
+ self.rdv(dv).execute(self.sql_delete)
147
+ def bind(self, dv):
148
+ self.dv = dv
149
+ def toSql(self, obj):
150
+ if type(obj)!=dict:
151
+ tmp = {}
152
+ for k in self.py2sqls:
153
+ if hasattr(obj, k):
154
+ tmp[k] = getattr(obj, k)
155
+ obj = tmp
156
+ obj = {self.py2sqls[k]:v for k,v in obj.items()}
157
+ return obj
158
+ def toPy(self, obj):
159
+ if type(obj)!=dict:
160
+ tmp = {}
161
+ for k in self.sql2pys:
162
+ if hasattr(obj, k):
163
+ tmp[k] = getattr(obj, k)
164
+ obj = tmp
165
+ obj = {self.sql2pys[k]:v for k,v in obj.items()}
166
+ return obj
167
+ def rdv(self, dv):
168
+ if dv is None:
169
+ dv = self.dv
170
+ assert dv is not None
171
+ return dv
172
+ def query(self, sql, dv=None, sql2py=True):
173
+ dv=self.rdv(dv)
174
+ rst = dv.query(sql, as_map=1)
175
+ if sql2py:
176
+ rst = [self.sql2py(it) for it in rst]
177
+ return rst
178
+ def queryAll(self, dv=None, sql2py=True):
179
+ sql = f"select * from {self.table};"
180
+ return self.query(sql, dv, sql2py)
181
+ def save(self, obj, dv=None, py2sql = True, commit=False, check = True):
182
+ dv = self.rdv(dv)
183
+ if type(obj) not in [list, tuple]:
184
+ obj = [obj]
185
+ if py2sql:
186
+ obj = [self.toSql(k) for k in obj]
187
+ query_keys = self.query_keys
188
+ if not check:
189
+ query_keys = None
190
+ _ = [dv.insert_or_update(k, self.table, query_keys) for k in obj]
191
+ if commit:
192
+ dv.execute("commit;")
193
+ return _
194
+
@@ -0,0 +1,105 @@
1
+
2
+ import sqlite3
3
+ import sys,os
4
+ from .basez import SimpleDv, fetch
5
+ from .structz import CMD
6
+ from buildz import xf,fz
7
+ class Db(SimpleDv):
8
+ # func to impl:
9
+ def to_list(self, rst):
10
+ rows = self.cursor.description
11
+ keys = [k[0].lower() for k in rows]
12
+ result = []
13
+ result.append(keys)
14
+ if rst is None or len(rst)==0:
15
+ return result
16
+ result += rst
17
+ return result
18
+ def new_con(self):
19
+ return sqlite3.connect(self.fp)
20
+ def new_cursor(self):
21
+ return self.con.cursor()
22
+ def __init__(self, fp, as_map=False, *argv, **maps):
23
+ #def __init__(self, fp):
24
+ self.con = None
25
+ self.cursor = None
26
+ self.as_map = as_map
27
+ self.init(fp)
28
+ def init(self, fp):
29
+ fz.makefdir(fp)
30
+ self.fp = fp
31
+ def sql_tables(self, table = None):
32
+ """
33
+ if not note, use name instead
34
+ require:
35
+ table_name, table_note
36
+ """
37
+ query_table = ""
38
+ if table is not None:
39
+ query_table = f" and name = '{table}'"
40
+ return f"select name as table_name, '' as table_note from sqlite_master where type='table' {query_table};"
41
+ def sql_indexes(self, table=None, index=None):
42
+ """
43
+ require:
44
+ table_name, index_name, is_unique, index_type, index_note
45
+ """
46
+ query_table = ""
47
+ if table is not None:
48
+ query_table = f" and tbl_name = '{table}'"
49
+ if index is not None:
50
+ query_table+= f" and name='{index}'"
51
+ return f"select tbl_name as table_name, name as index_name, -1 as is_unique, '?' as index_type, '' as index_note from sqlite_master where type='index' {query_table};"
52
+ def columns(self, table, as_map=None):
53
+ """
54
+ require:
55
+ table_name, column_name, column_type, column_default, nullable, column_offset, column_note
56
+ """
57
+ rst = self.query(f"PRAGMA table_info({table})", as_map=0)
58
+ dts = rst[1:]
59
+ keys = "table_name, column_name, column_type, column_default, nullable, column_offset, column_note".split(", ")
60
+ rst = [keys]
61
+ for dt in dts:
62
+ cid, name, _type, notnull, dflt_value, pk = dt
63
+ tmp = [table, name, _type, dflt_value, notnull, cid, '']
64
+ rst.append(tmp)
65
+ rst = self.out_list_sqlite3(rst, as_map)
66
+ return rst
67
+ def index_keys(self, table, index, as_map=None):
68
+ """
69
+ require:
70
+ table_name, index_name, column_name, index_offset, column_note
71
+ """
72
+ rst = self.query(f"PRAGMA index_info({index})", as_map=0)
73
+ dts = rst[1:]
74
+ keys = "table_name, index_name, column_name, index_offset, column_note".split(", ")
75
+ rst = [keys]
76
+ for dt in dts:
77
+ seqno, cid, name = dt
78
+ tmp = [table, index, name, seqno, '']
79
+ rst.append(tmp)
80
+ return self.out_list_sqlite3(rst, as_map)
81
+ def out_list_sqlite3(self, query_result, as_map=None):
82
+ if as_map is None:
83
+ as_map = self.as_map
84
+ rst = query_result
85
+ if as_map and len(rst)>0:
86
+ if len(rst)==1:
87
+ return []
88
+ keys = rst[0]
89
+ rst = rst[1:]
90
+ rst = [{k:v for k,v in zip(keys, dt)} for dt in rst]
91
+ return rst
92
+
93
+ pass
94
+ def build(argv, conf):
95
+ root = xf.g(conf, root=None)
96
+ fp = argv[0]
97
+ if root is not None:
98
+ fp = os.path.join(root, fp)
99
+ as_map = xf.g(conf, as_map=False)
100
+ dv = Db(fp, as_map)
101
+ return dv
102
+ def buildbk(argv, conf):
103
+ return CMD(make(argv, conf))
104
+
105
+ pass