prestogres 0.1.0

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 (393) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +20 -0
  4. data/LICENSE +202 -0
  5. data/NOTICE +22 -0
  6. data/README.md +217 -0
  7. data/Rakefile +13 -0
  8. data/VERSION +1 -0
  9. data/bin/prestogres +254 -0
  10. data/config/pcp.conf.sample +28 -0
  11. data/config/pgpool.conf +678 -0
  12. data/config/pool_hba.conf +84 -0
  13. data/config/pool_passwd +0 -0
  14. data/config/postgresql.conf +2 -0
  15. data/ext/.gitignore +6 -0
  16. data/ext/depend +26 -0
  17. data/ext/extconf.rb +4 -0
  18. data/ext/prestogres_config.c +12 -0
  19. data/pgpool2/.gitignore +36 -0
  20. data/pgpool2/AUTHORS +4 -0
  21. data/pgpool2/COPYING +12 -0
  22. data/pgpool2/ChangeLog +1 -0
  23. data/pgpool2/INSTALL +1 -0
  24. data/pgpool2/Makefile.am +159 -0
  25. data/pgpool2/Makefile.in +1187 -0
  26. data/pgpool2/NEWS +4960 -0
  27. data/pgpool2/README +1 -0
  28. data/pgpool2/README.euc_jp +1 -0
  29. data/pgpool2/README.online-recovery +62 -0
  30. data/pgpool2/TODO +103 -0
  31. data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
  32. data/pgpool2/aclocal.m4 +1088 -0
  33. data/pgpool2/c-compiler.m4 +134 -0
  34. data/pgpool2/c-library.m4 +325 -0
  35. data/pgpool2/child.c +2097 -0
  36. data/pgpool2/config.guess +1532 -0
  37. data/pgpool2/config.h.in +332 -0
  38. data/pgpool2/config.sub +1640 -0
  39. data/pgpool2/configure +15752 -0
  40. data/pgpool2/configure.in +392 -0
  41. data/pgpool2/depcomp +522 -0
  42. data/pgpool2/doc/basebackup.sh +17 -0
  43. data/pgpool2/doc/pgpool-de.html +4220 -0
  44. data/pgpool2/doc/pgpool-en.html +5738 -0
  45. data/pgpool2/doc/pgpool-fr.html +4118 -0
  46. data/pgpool2/doc/pgpool-ja.css +198 -0
  47. data/pgpool2/doc/pgpool-ja.html +11279 -0
  48. data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
  49. data/pgpool2/doc/pgpool.css +280 -0
  50. data/pgpool2/doc/pgpool_remote_start +13 -0
  51. data/pgpool2/doc/recovery.conf.sample +117 -0
  52. data/pgpool2/doc/tutorial-en.html +707 -0
  53. data/pgpool2/doc/tutorial-ja.html +422 -0
  54. data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
  55. data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
  56. data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
  57. data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
  58. data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
  59. data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
  60. data/pgpool2/doc/tutorial-zh_cn.html +537 -0
  61. data/pgpool2/doc/watchdog.png +0 -0
  62. data/pgpool2/doc/wd-en.html +236 -0
  63. data/pgpool2/doc/wd-en.jpg +0 -0
  64. data/pgpool2/doc/wd-ja.html +219 -0
  65. data/pgpool2/doc/wd-ja.jpg +0 -0
  66. data/pgpool2/doc/wd-zh_cn.html +201 -0
  67. data/pgpool2/doc/where_to_send_queries.odg +0 -0
  68. data/pgpool2/doc/where_to_send_queries.pdf +0 -0
  69. data/pgpool2/general.m4 +166 -0
  70. data/pgpool2/getopt_long.c +200 -0
  71. data/pgpool2/getopt_long.h +44 -0
  72. data/pgpool2/install-sh +251 -0
  73. data/pgpool2/ltmain.sh +8406 -0
  74. data/pgpool2/m4/libtool.m4 +7360 -0
  75. data/pgpool2/m4/ltoptions.m4 +368 -0
  76. data/pgpool2/m4/ltsugar.m4 +123 -0
  77. data/pgpool2/m4/ltversion.m4 +23 -0
  78. data/pgpool2/m4/lt~obsolete.m4 +92 -0
  79. data/pgpool2/main.c +2971 -0
  80. data/pgpool2/md5.c +444 -0
  81. data/pgpool2/md5.h +28 -0
  82. data/pgpool2/missing +360 -0
  83. data/pgpool2/mkinstalldirs +40 -0
  84. data/pgpool2/parser/Makefile.am +50 -0
  85. data/pgpool2/parser/Makefile.in +559 -0
  86. data/pgpool2/parser/copyfuncs.c +3310 -0
  87. data/pgpool2/parser/gram.c +39100 -0
  88. data/pgpool2/parser/gram.h +940 -0
  89. data/pgpool2/parser/gram.y +13408 -0
  90. data/pgpool2/parser/gramparse.h +74 -0
  91. data/pgpool2/parser/keywords.c +32 -0
  92. data/pgpool2/parser/keywords.h +39 -0
  93. data/pgpool2/parser/kwlist.h +425 -0
  94. data/pgpool2/parser/kwlookup.c +88 -0
  95. data/pgpool2/parser/list.c +1156 -0
  96. data/pgpool2/parser/makefuncs.c +518 -0
  97. data/pgpool2/parser/makefuncs.h +83 -0
  98. data/pgpool2/parser/memnodes.h +79 -0
  99. data/pgpool2/parser/nodes.c +29 -0
  100. data/pgpool2/parser/nodes.h +609 -0
  101. data/pgpool2/parser/outfuncs.c +5790 -0
  102. data/pgpool2/parser/parsenodes.h +2615 -0
  103. data/pgpool2/parser/parser.c +262 -0
  104. data/pgpool2/parser/parser.h +46 -0
  105. data/pgpool2/parser/pg_class.h +158 -0
  106. data/pgpool2/parser/pg_config_manual.h +273 -0
  107. data/pgpool2/parser/pg_list.h +352 -0
  108. data/pgpool2/parser/pg_trigger.h +147 -0
  109. data/pgpool2/parser/pg_wchar.h +492 -0
  110. data/pgpool2/parser/pool_memory.c +342 -0
  111. data/pgpool2/parser/pool_memory.h +77 -0
  112. data/pgpool2/parser/pool_parser.h +222 -0
  113. data/pgpool2/parser/pool_string.c +121 -0
  114. data/pgpool2/parser/pool_string.h +37 -0
  115. data/pgpool2/parser/primnodes.h +1280 -0
  116. data/pgpool2/parser/scan.c +4094 -0
  117. data/pgpool2/parser/scan.l +1451 -0
  118. data/pgpool2/parser/scanner.h +120 -0
  119. data/pgpool2/parser/scansup.c +221 -0
  120. data/pgpool2/parser/scansup.h +28 -0
  121. data/pgpool2/parser/snprintf.c +1102 -0
  122. data/pgpool2/parser/stringinfo.c +294 -0
  123. data/pgpool2/parser/stringinfo.h +178 -0
  124. data/pgpool2/parser/value.c +78 -0
  125. data/pgpool2/parser/value.h +62 -0
  126. data/pgpool2/parser/wchar.c +2048 -0
  127. data/pgpool2/pcp.conf.sample +28 -0
  128. data/pgpool2/pcp/Makefile.am +40 -0
  129. data/pgpool2/pcp/Makefile.in +771 -0
  130. data/pgpool2/pcp/libpcp_ext.h +250 -0
  131. data/pgpool2/pcp/md5.c +444 -0
  132. data/pgpool2/pcp/md5.h +28 -0
  133. data/pgpool2/pcp/pcp.c +1652 -0
  134. data/pgpool2/pcp/pcp.h +61 -0
  135. data/pgpool2/pcp/pcp_attach_node.c +172 -0
  136. data/pgpool2/pcp/pcp_detach_node.c +185 -0
  137. data/pgpool2/pcp/pcp_error.c +87 -0
  138. data/pgpool2/pcp/pcp_node_count.c +160 -0
  139. data/pgpool2/pcp/pcp_node_info.c +198 -0
  140. data/pgpool2/pcp/pcp_pool_status.c +166 -0
  141. data/pgpool2/pcp/pcp_proc_count.c +166 -0
  142. data/pgpool2/pcp/pcp_proc_info.c +261 -0
  143. data/pgpool2/pcp/pcp_promote_node.c +185 -0
  144. data/pgpool2/pcp/pcp_recovery_node.c +172 -0
  145. data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
  146. data/pgpool2/pcp/pcp_stream.c +385 -0
  147. data/pgpool2/pcp/pcp_stream.h +52 -0
  148. data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
  149. data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
  150. data/pgpool2/pcp_child.c +1493 -0
  151. data/pgpool2/pg_md5.c +305 -0
  152. data/pgpool2/pgpool.8.in +121 -0
  153. data/pgpool2/pgpool.conf +553 -0
  154. data/pgpool2/pgpool.conf.sample +666 -0
  155. data/pgpool2/pgpool.conf.sample-master-slave +665 -0
  156. data/pgpool2/pgpool.conf.sample-replication +664 -0
  157. data/pgpool2/pgpool.conf.sample-stream +664 -0
  158. data/pgpool2/pgpool.spec +264 -0
  159. data/pgpool2/pgpool_adm/TODO +7 -0
  160. data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
  161. data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
  162. data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
  163. data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
  164. data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
  165. data/pgpool2/pool.h +655 -0
  166. data/pgpool2/pool_auth.c +1390 -0
  167. data/pgpool2/pool_config.c +5007 -0
  168. data/pgpool2/pool_config.h +284 -0
  169. data/pgpool2/pool_config.l +3281 -0
  170. data/pgpool2/pool_config_md5.c +29 -0
  171. data/pgpool2/pool_connection_pool.c +812 -0
  172. data/pgpool2/pool_error.c +242 -0
  173. data/pgpool2/pool_globals.c +27 -0
  174. data/pgpool2/pool_hba.c +1723 -0
  175. data/pgpool2/pool_hba.conf.sample +67 -0
  176. data/pgpool2/pool_ip.c +567 -0
  177. data/pgpool2/pool_ip.h +65 -0
  178. data/pgpool2/pool_ipc.h +38 -0
  179. data/pgpool2/pool_lobj.c +242 -0
  180. data/pgpool2/pool_lobj.h +32 -0
  181. data/pgpool2/pool_memqcache.c +3818 -0
  182. data/pgpool2/pool_memqcache.h +268 -0
  183. data/pgpool2/pool_params.c +163 -0
  184. data/pgpool2/pool_passwd.c +249 -0
  185. data/pgpool2/pool_passwd.h +41 -0
  186. data/pgpool2/pool_path.c +193 -0
  187. data/pgpool2/pool_path.h +81 -0
  188. data/pgpool2/pool_process_context.c +247 -0
  189. data/pgpool2/pool_process_context.h +62 -0
  190. data/pgpool2/pool_process_query.c +5001 -0
  191. data/pgpool2/pool_process_reporting.c +1671 -0
  192. data/pgpool2/pool_process_reporting.h +44 -0
  193. data/pgpool2/pool_proto2.c +671 -0
  194. data/pgpool2/pool_proto_modules.c +3524 -0
  195. data/pgpool2/pool_proto_modules.h +185 -0
  196. data/pgpool2/pool_query_cache.c +1020 -0
  197. data/pgpool2/pool_query_context.c +1871 -0
  198. data/pgpool2/pool_query_context.h +105 -0
  199. data/pgpool2/pool_relcache.c +284 -0
  200. data/pgpool2/pool_relcache.h +78 -0
  201. data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
  202. data/pgpool2/pool_rewrite_query.c +715 -0
  203. data/pgpool2/pool_rewrite_query.h +192 -0
  204. data/pgpool2/pool_select_walker.c +1150 -0
  205. data/pgpool2/pool_select_walker.h +68 -0
  206. data/pgpool2/pool_sema.c +161 -0
  207. data/pgpool2/pool_session_context.c +952 -0
  208. data/pgpool2/pool_session_context.h +203 -0
  209. data/pgpool2/pool_shmem.c +185 -0
  210. data/pgpool2/pool_signal.c +158 -0
  211. data/pgpool2/pool_signal.h +61 -0
  212. data/pgpool2/pool_ssl.c +339 -0
  213. data/pgpool2/pool_stream.c +962 -0
  214. data/pgpool2/pool_stream.h +61 -0
  215. data/pgpool2/pool_system.c +659 -0
  216. data/pgpool2/pool_timestamp.c +1215 -0
  217. data/pgpool2/pool_timestamp.h +38 -0
  218. data/pgpool2/pool_type.h +171 -0
  219. data/pgpool2/pool_worker_child.c +384 -0
  220. data/pgpool2/ps_status.c +404 -0
  221. data/pgpool2/recovery.c +435 -0
  222. data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
  223. data/pgpool2/redhat/pgpool.init +201 -0
  224. data/pgpool2/redhat/pgpool.sysconfig +7 -0
  225. data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
  226. data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
  227. data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
  228. data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
  229. data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
  230. data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
  231. data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
  232. data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
  233. data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
  234. data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
  235. data/pgpool2/sample/dist_def_pgbench.sql +73 -0
  236. data/pgpool2/sample/pgpool.pam +3 -0
  237. data/pgpool2/sample/pgpool_recovery +20 -0
  238. data/pgpool2/sample/pgpool_recovery_pitr +19 -0
  239. data/pgpool2/sample/pgpool_remote_start +13 -0
  240. data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
  241. data/pgpool2/sql/insert_lock.sql +15 -0
  242. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
  243. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
  244. data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
  245. data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
  246. data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
  247. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
  248. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
  249. data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
  250. data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
  251. data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
  252. data/pgpool2/sql/system_db.sql +38 -0
  253. data/pgpool2/strlcpy.c +85 -0
  254. data/pgpool2/test/C/test_extended.c +98 -0
  255. data/pgpool2/test/jdbc/.cvsignore +2 -0
  256. data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
  257. data/pgpool2/test/jdbc/BatchTest.java +55 -0
  258. data/pgpool2/test/jdbc/ColumnTest.java +60 -0
  259. data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
  260. data/pgpool2/test/jdbc/InsertTest.java +34 -0
  261. data/pgpool2/test/jdbc/LockTest.java +36 -0
  262. data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
  263. data/pgpool2/test/jdbc/README.euc_jp +73 -0
  264. data/pgpool2/test/jdbc/RunTest.java +83 -0
  265. data/pgpool2/test/jdbc/SelectTest.java +37 -0
  266. data/pgpool2/test/jdbc/UpdateTest.java +32 -0
  267. data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
  268. data/pgpool2/test/jdbc/expected/autocommit +10 -0
  269. data/pgpool2/test/jdbc/expected/batch +1 -0
  270. data/pgpool2/test/jdbc/expected/column +100 -0
  271. data/pgpool2/test/jdbc/expected/insert +1 -0
  272. data/pgpool2/test/jdbc/expected/lock +100 -0
  273. data/pgpool2/test/jdbc/expected/select +2 -0
  274. data/pgpool2/test/jdbc/expected/update +1 -0
  275. data/pgpool2/test/jdbc/pgpool.properties +7 -0
  276. data/pgpool2/test/jdbc/prepare.sql +54 -0
  277. data/pgpool2/test/jdbc/run.sh +6 -0
  278. data/pgpool2/test/parser/.cvsignore +6 -0
  279. data/pgpool2/test/parser/README +32 -0
  280. data/pgpool2/test/parser/expected/copy.out +17 -0
  281. data/pgpool2/test/parser/expected/create.out +64 -0
  282. data/pgpool2/test/parser/expected/cursor.out +37 -0
  283. data/pgpool2/test/parser/expected/delete.out +10 -0
  284. data/pgpool2/test/parser/expected/drop.out +12 -0
  285. data/pgpool2/test/parser/expected/insert.out +13 -0
  286. data/pgpool2/test/parser/expected/misc.out +28 -0
  287. data/pgpool2/test/parser/expected/prepare.out +4 -0
  288. data/pgpool2/test/parser/expected/privileges.out +31 -0
  289. data/pgpool2/test/parser/expected/scanner.out +30 -0
  290. data/pgpool2/test/parser/expected/select.out +89 -0
  291. data/pgpool2/test/parser/expected/transaction.out +38 -0
  292. data/pgpool2/test/parser/expected/update.out +11 -0
  293. data/pgpool2/test/parser/expected/v84.out +37 -0
  294. data/pgpool2/test/parser/expected/v90.out +25 -0
  295. data/pgpool2/test/parser/expected/var.out +22 -0
  296. data/pgpool2/test/parser/input/alter.sql +2 -0
  297. data/pgpool2/test/parser/input/copy.sql +17 -0
  298. data/pgpool2/test/parser/input/create.sql +64 -0
  299. data/pgpool2/test/parser/input/cursor.sql +37 -0
  300. data/pgpool2/test/parser/input/delete.sql +10 -0
  301. data/pgpool2/test/parser/input/drop.sql +12 -0
  302. data/pgpool2/test/parser/input/insert.sql +13 -0
  303. data/pgpool2/test/parser/input/misc.sql +28 -0
  304. data/pgpool2/test/parser/input/prepare.sql +4 -0
  305. data/pgpool2/test/parser/input/privileges.sql +31 -0
  306. data/pgpool2/test/parser/input/scanner.sql +34 -0
  307. data/pgpool2/test/parser/input/select.sql +89 -0
  308. data/pgpool2/test/parser/input/transaction.sql +38 -0
  309. data/pgpool2/test/parser/input/update.sql +11 -0
  310. data/pgpool2/test/parser/input/v84.sql +37 -0
  311. data/pgpool2/test/parser/input/v90.sql +38 -0
  312. data/pgpool2/test/parser/input/var.sql +22 -0
  313. data/pgpool2/test/parser/main.c +96 -0
  314. data/pgpool2/test/parser/parse_schedule +16 -0
  315. data/pgpool2/test/parser/pool.h +13 -0
  316. data/pgpool2/test/parser/run-test +62 -0
  317. data/pgpool2/test/pdo-test/README.euc_jp +58 -0
  318. data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
  319. data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
  320. data/pgpool2/test/pdo-test/collections.inc +11 -0
  321. data/pgpool2/test/pdo-test/def.inc +7 -0
  322. data/pgpool2/test/pdo-test/log.txt +0 -0
  323. data/pgpool2/test/pdo-test/mod/database.inc +36 -0
  324. data/pgpool2/test/pdo-test/mod/def.inc +0 -0
  325. data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
  326. data/pgpool2/test/pdo-test/pdotest.php +11 -0
  327. data/pgpool2/test/pdo-test/regsql.inc +56 -0
  328. data/pgpool2/test/pgpool_setup +898 -0
  329. data/pgpool2/test/regression/README +39 -0
  330. data/pgpool2/test/regression/clean.sh +21 -0
  331. data/pgpool2/test/regression/libs.sh +16 -0
  332. data/pgpool2/test/regression/regress.sh +166 -0
  333. data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
  334. data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
  335. data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
  336. data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
  337. data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
  338. data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
  339. data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
  340. data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
  341. data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
  342. data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
  343. data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
  344. data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
  345. data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
  346. data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
  347. data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
  348. data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
  349. data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
  350. data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
  351. data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
  352. data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
  353. data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
  354. data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
  355. data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
  356. data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
  357. data/pgpool2/test/timestamp/expected/insert.out +16 -0
  358. data/pgpool2/test/timestamp/expected/misc.out +3 -0
  359. data/pgpool2/test/timestamp/expected/update.out +6 -0
  360. data/pgpool2/test/timestamp/input/insert.sql +16 -0
  361. data/pgpool2/test/timestamp/input/misc.sql +3 -0
  362. data/pgpool2/test/timestamp/input/update.sql +6 -0
  363. data/pgpool2/test/timestamp/main.c +129 -0
  364. data/pgpool2/test/timestamp/parse_schedule +3 -0
  365. data/pgpool2/test/timestamp/run-test +69 -0
  366. data/pgpool2/version.h +1 -0
  367. data/pgpool2/watchdog/Makefile.am +17 -0
  368. data/pgpool2/watchdog/Makefile.in +505 -0
  369. data/pgpool2/watchdog/test/stab.c +266 -0
  370. data/pgpool2/watchdog/test/test.c +85 -0
  371. data/pgpool2/watchdog/test/wd_child_t.c +87 -0
  372. data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
  373. data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
  374. data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
  375. data/pgpool2/watchdog/watchdog.c +408 -0
  376. data/pgpool2/watchdog/watchdog.h +209 -0
  377. data/pgpool2/watchdog/wd_child.c +444 -0
  378. data/pgpool2/watchdog/wd_ext.h +123 -0
  379. data/pgpool2/watchdog/wd_heartbeat.c +577 -0
  380. data/pgpool2/watchdog/wd_if.c +216 -0
  381. data/pgpool2/watchdog/wd_init.c +126 -0
  382. data/pgpool2/watchdog/wd_interlock.c +347 -0
  383. data/pgpool2/watchdog/wd_lifecheck.c +512 -0
  384. data/pgpool2/watchdog/wd_list.c +429 -0
  385. data/pgpool2/watchdog/wd_packet.c +1159 -0
  386. data/pgpool2/watchdog/wd_ping.c +330 -0
  387. data/pgpool2/ylwrap +223 -0
  388. data/pgsql/presto_client.py +346 -0
  389. data/pgsql/prestogres.py +156 -0
  390. data/pgsql/setup_functions.sql +21 -0
  391. data/pgsql/setup_language.sql +3 -0
  392. data/prestogres.gemspec +23 -0
  393. metadata +496 -0
@@ -0,0 +1,346 @@
1
+ import os
2
+ import httplib
3
+ import time
4
+
5
+ try: import simplejson as json
6
+ except ImportError: import json
7
+
8
+ VERSION = "0.1.0"
9
+
10
+ class ClientSession(object):
11
+ def __init__(self, server, user, source=None, catalog=None, schema=None, debug=False):
12
+ self.server = server
13
+ self.user = user
14
+ self.source = source
15
+ self.catalog = catalog
16
+ self.schema = schema
17
+ self.debug = debug
18
+
19
+ class StatementStats(object):
20
+ def __init__(self, state=None, scheduled=None, nodes=None, total_splits=None, queued_splits=None, running_splits=None, completed_splits=None, user_time_millis=None, cpu_time_millis=None, wall_time_millis=None, processed_rows=None, processed_bytes=None):
21
+ self.state = state
22
+ self.scheduled = scheduled
23
+ self.nodes = nodes
24
+ self.total_splits = total_splits
25
+ self.queued_splits = queued_splits
26
+ self.running_splits = running_splits
27
+ self.completed_splits = completed_splits
28
+ self.user_time_millis = user_time_millis
29
+ self.cpu_time_millis = cpu_time_millis
30
+ self.wall_time_millis = wall_time_millis
31
+ self.processed_rows = processed_rows
32
+ self.processed_bytes = processed_bytes
33
+ #self.root_stage = root_stage
34
+
35
+ @classmethod
36
+ def decode_dict(cls, dic):
37
+ return StatementStats(
38
+ state=dic.get("state"),
39
+ scheduled=dic.get("scheduled"),
40
+ nodes=dic.get("nodes"),
41
+ total_splits=dic.get("totalSplits"),
42
+ queued_splits=dic.get("queuedSplits"),
43
+ running_splits=dic.get("runningSplits"),
44
+ completed_splits=dic.get("completedSplits"),
45
+ user_time_millis=dic.get("userTimeMillis"),
46
+ cpu_time_millis=dic.get("cpuTimeMillis"),
47
+ wall_time_millis=dic.get("wallTimeMillis"),
48
+ processed_rows=dic.get("processedRows"),
49
+ processed_bytes=dic.get("processedBytes"),
50
+ #root_stage=StageStats.decode_dict(dic["rootStage")),
51
+ )
52
+
53
+ class Column(object):
54
+ def __init__(self, name, type):
55
+ self.name = name
56
+ self.type = type
57
+
58
+ @classmethod
59
+ def decode_dict(cls, dic):
60
+ return Column(
61
+ name=dic.get("name"),
62
+ type=dic.get("type"),
63
+ )
64
+
65
+ class ErrorLocation(object):
66
+ def __init__(self, line_number, column_number):
67
+ self.line_number = line_number
68
+ self.column_number = column_number
69
+
70
+ @classmethod
71
+ def decode_dict(cls, dic):
72
+ return ErrorLocation(
73
+ line_number=dic.get("lineNumber"),
74
+ column_number=dic.get("columnNumber"),
75
+ )
76
+
77
+ class FailureInfo(object):
78
+ def __init__(self, type=None, message=None, cause=None, suppressed=None, stack=None, error_location=None):
79
+ self.type = type
80
+ self.message = message
81
+ self.cause = cause
82
+ self.suppressed = suppressed
83
+ self.stack = stack
84
+ self.error_location = error_location
85
+
86
+ @classmethod
87
+ def decode_dict(cls, dic):
88
+ return FailureInfo(
89
+ type=dic.get("type"),
90
+ message=dic.get("message"),
91
+ cause=dic.get("cause"),
92
+ suppressed=map(FailureInfo.decode_dict, dic["suppressed"]) if "suppressed" in dic else None,
93
+ stack=dic.get("stack"),
94
+ error_location=ErrorLocation.decode_dict(dic["errorLocation"]) if "errorLocation" in dic else None,
95
+ )
96
+
97
+ class QueryError(object):
98
+ def __init__(self, message=None, sql_state=None, error_code=None, error_location=None, failure_info=None):
99
+ self.message = message
100
+ self.sql_state = sql_state
101
+ self.error_code = error_code
102
+ self.error_location = error_location
103
+ self.failure_info = failure_info
104
+
105
+ @classmethod
106
+ def decode_dict(cls, dic):
107
+ return QueryError(
108
+ message=dic.get("message"),
109
+ sql_state=dic.get("sqlState"),
110
+ error_code=dic.get("errorCode"),
111
+ error_location=ErrorLocation.decode_dict(dic["errorLocation"]) if "errorLocation" in dic else None,
112
+ failure_info=FailureInfo.decode_dict(dic["failureInfo"]) if "failureInfo" in dic else None,
113
+ )
114
+
115
+ class QueryResults(object):
116
+ def __init__(self, id, info_uri=None, partial_cache_uri=None, next_uri=None, columns=None, data=None, stats=None, error=None):
117
+ self.id = id
118
+ self.info_uri = info_uri
119
+ self.partial_cache_uri = partial_cache_uri
120
+ self.next_uri = next_uri
121
+ self.columns = columns
122
+ self.data = data
123
+ self.stats = stats
124
+ self.error = error
125
+
126
+ @classmethod
127
+ def decode_dict(cls, dic):
128
+ return QueryResults(
129
+ id=dic.get("id"),
130
+ info_uri=dic.get("infoUri"),
131
+ partial_cache_uri=dic.get("partialCancelUri"),
132
+ next_uri=dic.get("nextUri"),
133
+ columns=map(Column.decode_dict, dic["columns"]) if "columns" in dic else None,
134
+ data=dic.get("data"),
135
+ stats=StatementStats.decode_dict(dic["stats"]) if "stats" in dic else None,
136
+ error=QueryError.decode_dict(dic["error"]) if "error" in dic else None,
137
+ )
138
+
139
+ class PrestoException(Exception):
140
+ pass
141
+
142
+ class PrestoHttpException(PrestoException):
143
+ def __init__(self, status, message):
144
+ PrestoException.__init__(self, message)
145
+ self.status = status
146
+
147
+ class PrestoClientException(PrestoException):
148
+ pass
149
+
150
+ class PrestoQueryException(PrestoException):
151
+ def __init__(self, message, query_id, error_code, failure_info):
152
+ PrestoException.__init__(self, message)
153
+ self.query_id = query_id
154
+ self.error_code = error_code
155
+ self.failure_info = failure_info
156
+
157
+ class PrestoHeaders(object):
158
+ PRESTO_USER = "X-Presto-User"
159
+ PRESTO_SOURCE = "X-Presto-Source"
160
+ PRESTO_CATALOG = "X-Presto-Catalog"
161
+ PRESTO_SCHEMA = "X-Presto-Schema"
162
+
163
+ PRESTO_CURRENT_STATE = "X-Presto-Current-State"
164
+ PRESTO_MAX_WAIT = "X-Presto-Max-Wait"
165
+ PRESTO_MAX_SIZE = "X-Presto-Max-Size"
166
+ PRESTO_PAGE_SEQUENCE_ID = "X-Presto-Page-Sequence-Id"
167
+
168
+ class StatementClient(object):
169
+ HEADERS = {
170
+ "User-Agent": "presto-python/%s" % VERSION
171
+ }
172
+
173
+ def __init__(self, http_client, session, query):
174
+ self.http_client = http_client
175
+ self.session = session
176
+ self.query = query
177
+
178
+ self.closed = False
179
+ self.exception = None
180
+ self.results = None
181
+ self._post_query_request()
182
+
183
+ def _post_query_request(self):
184
+ headers = StatementClient.HEADERS.copy()
185
+
186
+ if self.session.user is not None:
187
+ headers[PrestoHeaders.PRESTO_USER] = self.session.user
188
+ if self.session.source is not None:
189
+ headers[PrestoHeaders.PRESTO_SOURCE] = self.session.source
190
+ if self.session.catalog is not None:
191
+ headers[PrestoHeaders.PRESTO_CATALOG] = self.session.catalog
192
+ if self.session.schema is not None:
193
+ headers[PrestoHeaders.PRESTO_SCHEMA] = self.session.schema
194
+
195
+ self.http_client.request("POST", "/v1/statement", self.query, headers)
196
+ response = self.http_client.getresponse()
197
+ body = response.read()
198
+
199
+ if response.status != 200:
200
+ raise PrestoHttpException(response.status, "Failed to start query: %s" % body)
201
+
202
+ dic = json.loads(body)
203
+ self.results = QueryResults.decode_dict(dic)
204
+
205
+ @property
206
+ def is_query_failed(self):
207
+ return self.results.error is not None
208
+
209
+ @property
210
+ def is_query_succeeded(self):
211
+ return self.results.error is None and self.exception is None and not self.closed
212
+
213
+ @property
214
+ def has_next(self):
215
+ return self.results.next_uri is not None
216
+
217
+ def advance(self):
218
+ if self.closed or not self.has_next:
219
+ return False
220
+
221
+ uri = self.results.next_uri
222
+ start = time.time()
223
+ attempts = 0
224
+
225
+ while True:
226
+ try:
227
+ self.http_client.request("GET", uri)
228
+ except Exception as e:
229
+ self.exception = e
230
+ raise
231
+
232
+ response = self.http_client.getresponse()
233
+ body = response.read()
234
+
235
+ if response.status == 200 and body:
236
+ self.results = QueryResults.decode_dict(json.loads(body))
237
+ return True
238
+
239
+ if response.status != 503: # retry on 503 Service Unavailable
240
+ # deterministic error
241
+ self.exception = PrestoHttpException(response.status, "Error fetching next at %s returned %s: %s" % (uri, response.status, body)) # TODO error class
242
+ raise self.exception
243
+
244
+ if (time.time() - start) > 2*60*60 or self.closed:
245
+ break
246
+
247
+ self.exception = PrestoHttpException(408, "Error fetching next") # TODO error class
248
+ raise self.exception
249
+
250
+ def cancel_leaf_stage(self):
251
+ if self.results.next_uri is not None:
252
+ self.http_client.request("DELETE", self.results.next_uri)
253
+ response = self.http_client.getresponse()
254
+ response.read()
255
+ return response.status / 100 == 2
256
+ return False
257
+
258
+ def close(self):
259
+ if self.closed:
260
+ return
261
+
262
+ cancel_leaf_stage(self)
263
+
264
+ self.closed = True
265
+
266
+ class Query(object):
267
+ @classmethod
268
+ def start(cls, session, query):
269
+ http_client = httplib.HTTPConnection(session.server)
270
+ return Query(StatementClient(http_client, session, query))
271
+
272
+ def __init__(self, client):
273
+ self.client = client
274
+
275
+ def _wait_for_data(self):
276
+ while self.client.has_next and self.client.results.data is None:
277
+ self.client.advance()
278
+
279
+ def columns(self):
280
+ self._wait_for_data()
281
+
282
+ if not self.client.is_query_succeeded:
283
+ self._raise_error()
284
+
285
+ return self.client.results.columns
286
+
287
+ def results(self):
288
+ client = self.client
289
+
290
+ if not client.is_query_succeeded:
291
+ self._raise_error()
292
+
293
+ if self.columns() is None:
294
+ raise PrestoException("Query %s has no columns" % client.results.id)
295
+
296
+ while True:
297
+ if client.results.data is None:
298
+ break
299
+
300
+ for row in client.results.data:
301
+ yield row
302
+
303
+ if not self.client.has_next:
304
+ break
305
+
306
+ client.advance()
307
+ if client.results.data is None:
308
+ break
309
+
310
+ def cancel(self):
311
+ self.client.cancel_leaf_stage()
312
+
313
+ def close(self):
314
+ self.client.cancel_leaf_stage()
315
+
316
+ def _raise_error(self):
317
+ if self.client.closed:
318
+ raise PrestoClientException("Query aborted by user")
319
+ elif self.client.exception is not None:
320
+ raise self.client.exception
321
+ elif self.client.is_query_failed:
322
+ results = self.client.results
323
+ error = results.error
324
+ if error is None:
325
+ raise PrestoQueryException("Query %s failed: (unknown reason)" % results.id, None, None)
326
+ raise PrestoQueryException("Query %s failed: %s" % (results.id, error.message), results.id, error.error_code, error.failure_info)
327
+
328
+ class Client(object):
329
+ def __init__(self, **options):
330
+ self.session = ClientSession(**options)
331
+
332
+ def query(self, query):
333
+ return Query.start(self.session, query)
334
+
335
+ def run(self, query):
336
+ q = Query.start(self.session, query)
337
+ try:
338
+ columns = q.columns()
339
+ if columns is None:
340
+ return [], []
341
+ rows = []
342
+ map(rows.append, q.results())
343
+ return columns, rows
344
+ finally:
345
+ q.close()
346
+
@@ -0,0 +1,156 @@
1
+ import presto_client
2
+ import plpy
3
+ from collections import namedtuple
4
+ import time
5
+
6
+ def run_presto_as_temp_table(server, user, catalog, schema, table_name, query):
7
+ client = presto_client.Client(server=server, user=user, catalog=catalog, schema=schema)
8
+
9
+ create_sql = 'create temp table ' + plpy.quote_ident(table_name) + ' (\n '
10
+ insert_sql = 'insert into ' + plpy.quote_ident(table_name) + ' (\n '
11
+ values_types = []
12
+
13
+ q = client.query(query)
14
+ try:
15
+ columns = q.columns()
16
+ column_num = len(columns)
17
+
18
+ first = True
19
+ for column in columns:
20
+ if column.type == "varchar":
21
+ pg_column_type = "text"
22
+ elif column.type == "bigint":
23
+ pg_column_type = "bigint"
24
+ elif column.type == "boolean":
25
+ pg_column_type = "boolean"
26
+ elif column.type == "double":
27
+ pg_column_type = "double precision"
28
+ else:
29
+ raise Exception, "unknown column type: " + plpy.quote_ident(column.type)
30
+
31
+ if first:
32
+ first = False
33
+ else:
34
+ create_sql += ",\n "
35
+ insert_sql += ",\n "
36
+
37
+ create_sql += plpy.quote_ident(column.name) + ' ' + pg_column_type
38
+ insert_sql += plpy.quote_ident(column.name)
39
+ values_types.append(pg_column_type)
40
+
41
+ create_sql += '\n)'
42
+ #if trait:
43
+ # create_sql += ' '
44
+ # create_sql += trait
45
+ create_sql += ';'
46
+
47
+ insert_sql += '\n) values\n'
48
+ values_sql_format = '(' + ', '.join(['${}'] * column_num) + ')'
49
+
50
+ #plpy.execute("drop table if exists "+plpy.quote_ident(table_name))
51
+ plpy.execute(create_sql)
52
+
53
+ batch = []
54
+ for row in q.results():
55
+ batch.append(row)
56
+ if len(batch) > 10:
57
+ batch_len = len(batch)
58
+ # format string 'values ($1, $2), ($3, $4) ...'
59
+ values_sql = (', '.join([values_sql_format] * batch_len)).format(*range(1, batch_len * column_num + 1))
60
+ batch_insert_sql = insert_sql + values_sql
61
+ # flatten rows into an array
62
+ params = [item for sublist in batch for item in sublist]
63
+ plpy.execute(plpy.prepare(batch_insert_sql, values_types * batch_len), params)
64
+ del batch[:]
65
+
66
+ if batch:
67
+ batch_len = len(batch)
68
+ # format string 'values ($1, $2), ($3, $4) ...'
69
+ values_sql = (', '.join([values_sql_format] * batch_len)).format(*range(1, batch_len * column_num + 1))
70
+ batch_insert_sql = insert_sql + values_sql
71
+ # flatten rows into an array
72
+ params = [item for sublist in batch for item in sublist]
73
+ plpy.execute(plpy.prepare(batch_insert_sql, values_types * batch_len), params)
74
+
75
+ finally:
76
+ q.close()
77
+
78
+ Column = namedtuple('Column', ('name', 'type', 'nullable'))
79
+
80
+ cache_expire_times = {}
81
+
82
+ def presto_create_tables(server, user, catalog):
83
+ client = presto_client.Client(server=server, user=user, catalog=catalog, schema="default")
84
+
85
+ cache_key = "%s:%s.%s" % (server, user, catalog)
86
+ expire_time = cache_expire_times.get(cache_key)
87
+ if expire_time is not None and time.time() - expire_time < 10:
88
+ # TODO scan cache_expire_times and remove expired cache entries if it is large
89
+ return
90
+
91
+ try:
92
+ schemas = {}
93
+
94
+ columns, rows = client.run("select table_schema, table_name, column_name, is_nullable, data_type from information_schema.columns")
95
+
96
+ if rows is None:
97
+ return
98
+
99
+ for row in rows:
100
+ schema_name = row[0]
101
+ table_name = row[1]
102
+ column_name = row[2]
103
+ is_nullable = row[3]
104
+ column_type = row[4]
105
+
106
+ tables = schemas.setdefault(schema_name, {})
107
+ columns = tables.setdefault(table_name, [])
108
+ columns.append(Column(column_name, column_type, is_nullable))
109
+
110
+ for schema_name, tables in schemas.items():
111
+ if schema_name == "sys" or schema_name == "information_schema":
112
+ # skip system schemas
113
+ continue
114
+
115
+ # create schema
116
+ try:
117
+ plpy.execute("create schema %s" % plpy.quote_ident(schema_name))
118
+ except:
119
+ # ignore error
120
+ pass
121
+
122
+ for table_name, columns in tables.items():
123
+ create_sql = "create table %s.%s (\n " % (plpy.quote_ident(schema_name), plpy.quote_ident(table_name))
124
+
125
+ first = True
126
+ for column in columns:
127
+ if column.type == "varchar":
128
+ pg_column_type = "varchar(100)"
129
+ elif column.type == "bigint":
130
+ pg_column_type = "bigint"
131
+ elif column.type == "boolean":
132
+ pg_column_type = "boolean"
133
+ elif column.type == "double":
134
+ pg_column_type = "double precision"
135
+ else:
136
+ raise Exception("unknown column type: " + plpy.quote_ident(column.type))
137
+
138
+ if first:
139
+ first = False
140
+ else:
141
+ create_sql += ",\n "
142
+
143
+ create_sql += plpy.quote_ident(column.name) + " " + pg_column_type
144
+ if not column.nullable:
145
+ create_sql += " not null"
146
+
147
+ create_sql += "\n)"
148
+
149
+ plpy.execute("drop table if exists %s.%s" % (plpy.quote_ident(schema_name), plpy.quote_ident(table_name)))
150
+ plpy.execute(create_sql)
151
+
152
+ cache_expire_times[cache_key] = time.time()
153
+
154
+ except Exception as e:
155
+ plpy.error(str(e))
156
+