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,61 @@
1
+ /* -*-pgsql-c-*- */
2
+ /*
3
+ *
4
+ * $Header$
5
+ *
6
+ * pgpool: a language independent connection pool server for PostgreSQL
7
+ * written by Tatsuo Ishii
8
+ *
9
+ * Copyright (c) 2003-2013 PgPool Global Development Group
10
+ *
11
+ * Permission to use, copy, modify, and distribute this software and
12
+ * its documentation for any purpose and without fee is hereby
13
+ * granted, provided that the above copyright notice appear in all
14
+ * copies and that both that copyright notice and this permission
15
+ * notice appear in supporting documentation, and that the name of the
16
+ * author not be used in advertising or publicity pertaining to
17
+ * distribution of the software without specific, written prior
18
+ * permission. The author makes no representations about the
19
+ * suitability of this software for any purpose. It is provided "as
20
+ * is" without express or implied warranty.
21
+ *
22
+ * pool_steam.h.: pool_stream.c related header file
23
+ *
24
+ */
25
+
26
+ #ifndef POOL_STREAM_H
27
+ #define POOL_STREAM_H
28
+
29
+ #define READBUFSZ 1024
30
+ #define WRITEBUFSZ 8192
31
+
32
+ /*
33
+ * Return true if read buffer is empty. Argument is POOL_CONNECTION.
34
+ */
35
+ #define pool_read_buffer_is_empty(connection) ((connection)->len <= 0)
36
+
37
+ /*
38
+ * Discard read buffer contents
39
+ */
40
+ #define pool_discard_read_buffer(connection) \
41
+ do { \
42
+ (connection)->len = 0; \
43
+ } while (0)
44
+
45
+ extern POOL_CONNECTION *pool_open(int fd);
46
+ extern void pool_close(POOL_CONNECTION *cp);
47
+ extern int pool_read(POOL_CONNECTION *cp, void *buf, int len);
48
+ extern char *pool_read2(POOL_CONNECTION *cp, int len);
49
+ extern int pool_write(POOL_CONNECTION *cp, void *buf, int len);
50
+ extern int pool_flush(POOL_CONNECTION *cp);
51
+ extern int pool_flush_it(POOL_CONNECTION *cp);
52
+ extern int pool_write_and_flush(POOL_CONNECTION *cp, void *buf, int len);
53
+ extern char *pool_read_string(POOL_CONNECTION *cp, int *len, int line);
54
+ extern int pool_unread(POOL_CONNECTION *cp, void *data, int len);
55
+ extern int pool_push(POOL_CONNECTION *cp, void *data, int len);
56
+ extern void pool_pop(POOL_CONNECTION *cp, int *len);
57
+ extern int pool_stacklen(POOL_CONNECTION *cp);
58
+ extern void pool_set_nonblock(int fd);
59
+ extern void pool_unset_nonblock(int fd);
60
+
61
+ #endif /* POOL_STREAM_H */
@@ -0,0 +1,659 @@
1
+ /* -*-pgsql-c-*- */
2
+ /*
3
+ * $Header$
4
+ *
5
+ * pgpool: a language independent connection pool server for PostgreSQL
6
+ * written by Tatsuo Ishii
7
+ *
8
+ * Copyright (c) 2003-2010 PgPool Global Development Group
9
+ *
10
+ * Permission to use, copy, modify, and distribute this software and
11
+ * its documentation for any purpose and without fee is hereby
12
+ * granted, provided that the above copyright notice appear in all
13
+ * copies and that both that copyright notice and this permission
14
+ * notice appear in supporting documentation, and that the name of the
15
+ * author not be used in advertising or publicity pertaining to
16
+ * distribution of the software without specific, written prior
17
+ * permission. The author makes no representations about the
18
+ * suitability of this software for any purpose. It is provided "as
19
+ * is" without express or implied warranty.
20
+ *
21
+ * pool_system.c: systemdb
22
+ *
23
+ */
24
+
25
+ #include <errno.h>
26
+ #include <stdlib.h>
27
+ #include <string.h>
28
+ #include "pool.h"
29
+ #include "pool_config.h"
30
+
31
+ static int create_prepared_statement(DistDefInfo *dist_info);
32
+ static int get_col_list(DistDefInfo *info);
33
+ static int get_col_list2(RepliDefInfo *info);
34
+
35
+ static
36
+ int get_col_list(DistDefInfo *info)
37
+ {
38
+ int i;
39
+ static char sql[1024];
40
+ PGresult *result;
41
+
42
+ if (!system_db_info->pgconn ||
43
+ (PQstatus(system_db_info->pgconn) != CONNECTION_OK))
44
+ {
45
+ if (system_db_connect())
46
+ return -1;
47
+ }
48
+
49
+ for (i = 0; i < info->col_num; i++)
50
+ {
51
+ snprintf(sql,
52
+ sizeof(sql),
53
+ "SELECT col_list[%d],type_list[%d] FROM %s.dist_def where dbname = '%s' and schema_name = '%s' and table_name = '%s'",
54
+ i + 1,
55
+ i + 1,
56
+ pool_config->system_db_schema,
57
+ info->dbname,info->schema_name,
58
+ info->table_name);
59
+
60
+ result = PQexec(system_db_info->pgconn, sql);
61
+
62
+ if (!result || PQresultStatus(result) != PGRES_TUPLES_OK)
63
+ {
64
+ pool_error("get_col_list :PQexec failed: %s",
65
+ PQerrorMessage(system_db_info->pgconn));
66
+ return -1;
67
+ }
68
+ else
69
+ {
70
+ info->col_list[i] = malloc(strlen(PQgetvalue(result,0,0)) + 1);
71
+ info->type_list[i] = malloc(strlen(PQgetvalue(result,0,1)) + 1);
72
+
73
+ if (info->col_list[i] == NULL || info->type_list[i] == NULL)
74
+ {
75
+ pool_error("get_col_list: malloc failed: %s", strerror(errno));
76
+ PQclear(result);
77
+ return -1;
78
+ }
79
+ strcpy(info->col_list[i],PQgetvalue(result,0,0));
80
+ strcpy(info->type_list[i],PQgetvalue(result,0,1));
81
+ if (strcmp(info->col_list[i], info->dist_key_col_name) == 0)
82
+ info->dist_key_col_id = i;
83
+ PQclear(result);
84
+ }
85
+ }
86
+ return 0;
87
+ }
88
+
89
+ static
90
+ int get_col_list2(RepliDefInfo *info)
91
+ {
92
+ int i;
93
+ static char sql[1024];
94
+ PGresult *result;
95
+
96
+ if (!system_db_info->pgconn ||
97
+ (PQstatus(system_db_info->pgconn) != CONNECTION_OK))
98
+ {
99
+ if (system_db_connect())
100
+ return -1;
101
+ }
102
+
103
+ for (i = 0; i < info->col_num; i++)
104
+ {
105
+ snprintf(sql,
106
+ sizeof(sql),
107
+ "SELECT col_list[%d],type_list[%d] FROM %s.replicate_def where dbname = '%s' and schema_name = '%s' and table_name = '%s'",
108
+ i + 1,
109
+ i + 1,
110
+ pool_config->system_db_schema,
111
+ info->dbname,info->schema_name,
112
+ info->table_name);
113
+
114
+ result = PQexec(system_db_info->pgconn, sql);
115
+
116
+ if (!result || PQresultStatus(result) != PGRES_TUPLES_OK)
117
+ {
118
+ pool_error("get_col_list2: PQexec failed: %s",
119
+ PQerrorMessage(system_db_info->pgconn));
120
+ return -1;
121
+ }
122
+ else
123
+ {
124
+ info->col_list[i] = malloc(strlen(PQgetvalue(result,0,0)) + 1);
125
+ info->type_list[i] = malloc(strlen(PQgetvalue(result,0,1)) + 1);
126
+
127
+ if (info->col_list[i] == NULL || info->type_list[i] == NULL)
128
+ {
129
+ pool_error("get_col_list2: malloc failed: %s", strerror(errno));
130
+ PQclear(result);
131
+ return -1;
132
+ }
133
+ strcpy(info->col_list[i],PQgetvalue(result,0,0));
134
+ strcpy(info->type_list[i],PQgetvalue(result,0,1));
135
+ PQclear(result);
136
+ }
137
+ }
138
+ return 0;
139
+ }
140
+
141
+ /*
142
+ * system_db_connect:
143
+ * Connects System DB by PQconnectdb().
144
+ */
145
+ int system_db_connect (void)
146
+ {
147
+ static char conninfo[1024];
148
+ int i;
149
+
150
+ snprintf(conninfo,
151
+ sizeof(conninfo),
152
+ "host='%s' port=%d dbname='%s' user='%s' password='%s'",
153
+ system_db_info->info->hostname,
154
+ system_db_info->info->port,
155
+ system_db_info->info->database_name,
156
+ system_db_info->info->user,
157
+ system_db_info->info->password);
158
+
159
+ system_db_info->pgconn = PQconnectdb(conninfo);
160
+
161
+ if (PQstatus(system_db_info->pgconn) != CONNECTION_OK)
162
+ {
163
+ pool_error("Connection to database failed: %s",
164
+ PQerrorMessage(system_db_info->pgconn));
165
+ PQfinish(system_db_info->pgconn);
166
+ system_db_info->pgconn = NULL;
167
+ return 1;
168
+ }
169
+
170
+ for (i = 0; i < system_db_info->info->dist_def_num; i++)
171
+ {
172
+ DistDefInfo *info = &system_db_info->info->dist_def_slot[i];
173
+ info->is_created_prepare = 0;
174
+ }
175
+
176
+ system_db_info->info->query_cache_table_info.has_prepared_statement = 0;
177
+
178
+ return 0;
179
+ }
180
+
181
+ /*
182
+ * pool_memset_system_db_info:
183
+ * Initializes distribution rules. Distribution rules are stored in
184
+ * System DB. So we have to execute query, and expand results on
185
+ * memory.
186
+ */
187
+ int pool_memset_system_db_info (SystemDBInfo *info)
188
+ {
189
+ int i;
190
+ static char sql[1024],sql2[1024];
191
+ PGresult *result;
192
+ DistDefInfo *dist_info = NULL;
193
+ RepliDefInfo *repli_info = NULL;
194
+
195
+ if (!system_db_info->pgconn ||
196
+ (PQstatus(system_db_info->pgconn) != CONNECTION_OK))
197
+ {
198
+ if (system_db_connect())
199
+ return -1;
200
+ }
201
+
202
+ /* get distribution rules */
203
+ snprintf(sql,
204
+ sizeof(sql),
205
+ "SELECT dbname, schema_name, table_name,col_name,array_upper(col_list,1),col_list,type_list, dist_def_func FROM %s.dist_def",
206
+ pool_config->system_db_schema);
207
+
208
+ result = PQexec(system_db_info->pgconn, sql);
209
+ if (!result || PQresultStatus(result) != PGRES_TUPLES_OK)
210
+ {
211
+ pool_error("PQexec failed: %s", PQerrorMessage(system_db_info->pgconn));
212
+ return -1;
213
+ }
214
+ else
215
+ {
216
+ info->dist_def_num = PQntuples(result);
217
+ if (info->dist_def_num != 0)
218
+ {
219
+ dist_info = malloc(sizeof(DistDefInfo) * info->dist_def_num);
220
+ }
221
+
222
+ if (dist_info == NULL && info->dist_def_num != 0)
223
+ {
224
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
225
+ strerror(errno));
226
+ PQclear(result);
227
+ pool_close_libpq_connection();
228
+ return -1;
229
+ }
230
+
231
+ info->dist_def_slot = dist_info;
232
+
233
+ for (i = 0; i < PQntuples(result); ++i)
234
+ {
235
+ char *t_dbname;
236
+ char *t_schema_name;
237
+ char *t_table_name;
238
+ char *t_dist_key_col_name;
239
+ char *t_dist_def_func;
240
+ int num;
241
+ int len;
242
+
243
+ num = atol(PQgetvalue(result, i ,4));
244
+ t_dbname = malloc(strlen(PQgetvalue(result,i,0)) + 1);
245
+ if (t_dbname == NULL)
246
+ {
247
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
248
+ strerror(errno));
249
+ PQclear(result);
250
+ pool_close_libpq_connection();
251
+ return -1;
252
+ }
253
+ strcpy(t_dbname, PQgetvalue(result,i,0));
254
+ dist_info[i].dbname = t_dbname;
255
+
256
+ t_schema_name = malloc(strlen(PQgetvalue(result,i,1)) + 1);
257
+ if (t_schema_name == NULL)
258
+ {
259
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
260
+ strerror(errno));
261
+ PQclear(result);
262
+ pool_close_libpq_connection();
263
+ return -1;
264
+ }
265
+ strcpy(t_schema_name, PQgetvalue(result,i,1));
266
+ dist_info[i].schema_name = t_schema_name;
267
+
268
+ t_table_name = malloc(strlen(PQgetvalue(result,i,2)) + 1);
269
+ if (t_table_name == NULL)
270
+ {
271
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
272
+ strerror(errno));
273
+ PQclear(result);
274
+ pool_close_libpq_connection();
275
+ return -1;
276
+ }
277
+ strcpy(t_table_name, PQgetvalue(result,i,2));
278
+ dist_info[i].table_name = t_table_name;
279
+
280
+ t_dist_key_col_name = malloc(strlen(PQgetvalue(result,i,3)) + 1);
281
+ if (t_dist_key_col_name == NULL)
282
+ {
283
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
284
+ strerror(errno));
285
+ PQclear(result);
286
+ pool_close_libpq_connection();
287
+ return -1;
288
+ }
289
+ strcpy(t_dist_key_col_name, PQgetvalue(result,i,3));
290
+ dist_info[i].dist_key_col_name = t_dist_key_col_name;
291
+
292
+ t_dist_def_func = malloc(strlen(PQgetvalue(result,i,7)) + 1);
293
+ if (t_dist_def_func == NULL)
294
+ {
295
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
296
+ strerror(errno));
297
+ PQclear(result);
298
+ pool_close_libpq_connection();
299
+ return -1;
300
+ }
301
+ strcpy(t_dist_def_func, PQgetvalue(result,i,7));
302
+ dist_info[i].dist_def_func = t_dist_def_func;
303
+
304
+ dist_info[i].col_num = num;
305
+
306
+ dist_info[i].col_list = calloc(num, sizeof(char *));
307
+ dist_info[i].type_list = calloc(num, sizeof(char *));
308
+ if (dist_info[i].col_list == NULL || dist_info[i].type_list == NULL)
309
+ {
310
+ pool_error("pool_memset_system_db_info: calloc failed: %s",
311
+ strerror(errno));
312
+ PQclear(result);
313
+ pool_close_libpq_connection();
314
+ return -1;
315
+ }
316
+
317
+ if (get_col_list(&dist_info[i]) < 0)
318
+ {
319
+ pool_error("get_col_list() failed");
320
+ PQclear(result);
321
+ pool_close_libpq_connection();
322
+ return -1;
323
+ }
324
+
325
+ /* create PREPARE statement */
326
+ len = strlen(t_dbname) + strlen(t_schema_name) +
327
+ strlen(t_table_name) + strlen("pgpool_");
328
+
329
+ dist_info[i].prepare_name = malloc(len + 1);
330
+ if (dist_info[i].prepare_name == NULL)
331
+ {
332
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
333
+ strerror(errno));
334
+ return -1;
335
+ }
336
+
337
+ snprintf(dist_info[i].prepare_name, len+1, "pgpool_%s%s%s",
338
+ t_dbname, t_schema_name, t_table_name);
339
+ dist_info[i].prepare_name[len] = '\0';
340
+ }
341
+ }
342
+
343
+ PQclear(result);
344
+
345
+ /* get replication rules */
346
+ snprintf(sql2,
347
+ sizeof(sql2),
348
+ "SELECT dbname, schema_name, table_name, array_upper(col_list,1),col_list,type_list FROM %s.replicate_def",
349
+ pool_config->system_db_schema);
350
+
351
+ result = PQexec(system_db_info->pgconn, sql2);
352
+
353
+ if (!result)
354
+ {
355
+ pool_error("PQexec failed: %s", PQerrorMessage(system_db_info->pgconn));
356
+ return -1;
357
+ }
358
+ else if (PQresultStatus(result) != PGRES_TUPLES_OK)
359
+ {
360
+ info->repli_def_num = 0;
361
+ info->repli_def_slot = NULL;
362
+ }
363
+ else
364
+ {
365
+ info->repli_def_num = PQntuples(result);
366
+ if (info->repli_def_num != 0)
367
+ {
368
+ repli_info = malloc(sizeof(RepliDefInfo) * info->repli_def_num);
369
+ }
370
+
371
+ if (repli_info == NULL && info->repli_def_num != 0)
372
+ {
373
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
374
+ strerror(errno));
375
+ PQclear(result);
376
+ pool_close_libpq_connection();
377
+ return -1;
378
+ }
379
+
380
+ info->repli_def_slot = repli_info;
381
+
382
+ for (i = 0; i < PQntuples(result); ++i)
383
+ {
384
+ char *t_dbname;
385
+ char *t_schema_name;
386
+ char *t_table_name;
387
+ int num;
388
+ int len;
389
+
390
+ num = atol(PQgetvalue(result, i ,3));
391
+ t_dbname = malloc(strlen(PQgetvalue(result,i,0)) + 1);
392
+ if (t_dbname == NULL)
393
+ {
394
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
395
+ strerror(errno));
396
+ PQclear(result);
397
+ pool_close_libpq_connection();
398
+ return -1;
399
+ }
400
+ strcpy(t_dbname, PQgetvalue(result,i,0));
401
+ repli_info[i].dbname = t_dbname;
402
+
403
+ t_schema_name = malloc(strlen(PQgetvalue(result,i,1)) + 1);
404
+ if (t_schema_name == NULL)
405
+ {
406
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
407
+ strerror(errno));
408
+ PQclear(result);
409
+ pool_close_libpq_connection();
410
+ return -1;
411
+ }
412
+ strcpy(t_schema_name, PQgetvalue(result,i,1));
413
+ repli_info[i].schema_name = t_schema_name;
414
+
415
+ t_table_name = malloc(strlen(PQgetvalue(result,i,2)) + 1);
416
+ if (t_table_name == NULL)
417
+ {
418
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
419
+ strerror(errno));
420
+ PQclear(result);
421
+ pool_close_libpq_connection();
422
+ return -1;
423
+ }
424
+ strcpy(t_table_name, PQgetvalue(result,i,2));
425
+ repli_info[i].table_name = t_table_name;
426
+
427
+ repli_info[i].col_num = num;
428
+
429
+ repli_info[i].col_list = calloc(num, sizeof(char *));
430
+ repli_info[i].type_list = calloc(num, sizeof(char *));
431
+ if (repli_info[i].col_list == NULL || repli_info[i].type_list == NULL)
432
+ {
433
+ pool_error("pool_memset_system_db_info: calloc failed: %s",
434
+ strerror(errno));
435
+ PQclear(result);
436
+ pool_close_libpq_connection();
437
+ return -1;
438
+ }
439
+
440
+ if (get_col_list2(&repli_info[i]) < 0)
441
+ {
442
+ pool_error("get_col_list() failed");
443
+ PQclear(result);
444
+ pool_close_libpq_connection();
445
+ return -1;
446
+ }
447
+
448
+ /* create PREPARE statement */
449
+ len = strlen(t_dbname) + strlen(t_schema_name) +
450
+ strlen(t_table_name) + strlen("pgpool_");
451
+
452
+ repli_info[i].prepare_name = malloc(len + 1);
453
+ if (repli_info[i].prepare_name == NULL)
454
+ {
455
+ pool_error("pool_memset_system_db_info: malloc failed: %s",
456
+ strerror(errno));
457
+ return -1;
458
+ }
459
+
460
+ snprintf(repli_info[i].prepare_name, len+1, "pgpool_%s%s%s",
461
+ t_dbname, t_schema_name, t_table_name);
462
+ repli_info[i].prepare_name[len] = '\0';
463
+ }
464
+ }
465
+
466
+ PQclear(result);
467
+
468
+ pool_close_libpq_connection();
469
+ return i;
470
+ }
471
+
472
+ /*
473
+ * pool_get_dist_def_info:
474
+ * Looks up distribution rule with dbname, schema_name and table_name.
475
+ */
476
+ DistDefInfo *pool_get_dist_def_info (char *dbname, char *schema_name, char *table_name)
477
+ {
478
+ int i;
479
+ int dist_def_num = system_db_info->info->dist_def_num;
480
+ char *public ="public";
481
+
482
+ if (!dbname || !table_name)
483
+ {
484
+ return NULL;
485
+ }
486
+
487
+ if (!schema_name)
488
+ {
489
+ schema_name = public;
490
+ }
491
+
492
+ for (i = 0; i < dist_def_num; i++)
493
+ {
494
+ char *mem_dbname;
495
+ char *mem_schema_name;
496
+ char *mem_table_name;
497
+
498
+ mem_dbname = system_db_info->info->dist_def_slot[i].dbname;
499
+ mem_schema_name = system_db_info->info->dist_def_slot[i].schema_name;
500
+ mem_table_name = system_db_info->info->dist_def_slot[i].table_name;
501
+
502
+ if ((strcmp(mem_dbname, dbname) == 0) &&
503
+ (strcmp(mem_schema_name, schema_name) == 0) &&
504
+ (strcmp(mem_table_name, table_name) ==0))
505
+ {
506
+ return &system_db_info->info->dist_def_slot[i];
507
+ }
508
+ }
509
+ return NULL;
510
+ }
511
+
512
+ /*
513
+ * pool_get_repli_def_info:
514
+ * Looks up replication rule with dbname, schema_name and table_name.
515
+ */
516
+ RepliDefInfo *pool_get_repli_def_info (char *dbname, char *schema_name, char *table_name)
517
+ {
518
+ int i;
519
+ int repli_def_num = system_db_info->info->repli_def_num;
520
+ char *public ="public";
521
+
522
+ if (!dbname || !table_name)
523
+ {
524
+ return NULL;
525
+ }
526
+
527
+ if (!schema_name)
528
+ {
529
+ schema_name = public;
530
+ }
531
+
532
+ for (i = 0; i < repli_def_num; i++)
533
+ {
534
+ char *mem_dbname;
535
+ char *mem_schema_name;
536
+ char *mem_table_name;
537
+
538
+ mem_dbname = system_db_info->info->repli_def_slot[i].dbname;
539
+ mem_schema_name = system_db_info->info->repli_def_slot[i].schema_name;
540
+ mem_table_name = system_db_info->info->repli_def_slot[i].table_name;
541
+
542
+ if ((strcmp(mem_dbname, dbname) == 0) &&
543
+ (strcmp(mem_schema_name, schema_name) == 0) &&
544
+ (strcmp(mem_table_name, table_name) ==0))
545
+ {
546
+ return &system_db_info->info->repli_def_slot[i];
547
+ }
548
+ }
549
+ return NULL;
550
+ }
551
+
552
+ /*
553
+ * pool_get_id:
554
+ * Returns the backend node id from value.
555
+ */
556
+ int pool_get_id (DistDefInfo *info, const char *value)
557
+ {
558
+ int num;
559
+ PGresult *result;
560
+ char *type;
561
+ int length;
562
+
563
+ if (!system_db_info->pgconn ||
564
+ (PQstatus(system_db_info->pgconn) != CONNECTION_OK))
565
+ {
566
+ if (system_db_connect())
567
+ return -1;
568
+ }
569
+
570
+ if (info->is_created_prepare == 0)
571
+ {
572
+ if (create_prepared_statement(info) != 0)
573
+ return -1;
574
+ }
575
+
576
+ type=info->type_list[info->dist_key_col_id];
577
+ length = strlen(value);
578
+ result = PQexecPrepared(system_db_info->pgconn, info->prepare_name,
579
+ 1, &value, &length, NULL, 0);
580
+
581
+ if (!result || PQresultStatus(result) != PGRES_TUPLES_OK ||
582
+ PQgetisnull(result, 0, 0))
583
+ {
584
+ pool_error("PQexecPrepared failed: %s", PQerrorMessage(system_db_info->pgconn));
585
+ return -1;
586
+ }
587
+ else
588
+ {
589
+ char *id;
590
+ id = PQgetvalue(result, 0 ,0);
591
+
592
+ if(strlen(id))
593
+ {
594
+ num = atoi(id);
595
+ PQclear(result);
596
+
597
+ if(num < NUM_BACKENDS)
598
+ {
599
+ return num;
600
+ } else {
601
+ return -1;
602
+ }
603
+ }
604
+ return -1;
605
+ }
606
+ }
607
+
608
+ /*
609
+ * pool_close_libpq_connection:
610
+ * Closes libpq's connection.
611
+ */
612
+ void pool_close_libpq_connection(void)
613
+ {
614
+ PQfinish(system_db_info->pgconn);
615
+ system_db_info->pgconn = NULL;
616
+ }
617
+
618
+ /*
619
+ * pool_system_db_connection:
620
+ * Returns persistent connection to the system DB
621
+ */
622
+ POOL_CONNECTION_POOL_SLOT *pool_system_db_connection(void)
623
+ {
624
+ return system_db_info->connection;
625
+ }
626
+
627
+ /*
628
+ * create_prepared_statement:
629
+ * Returns 0 if prepared statement is created.
630
+ * Returns 1 if prepared statement can't created.
631
+ */
632
+ static int create_prepared_statement(DistDefInfo *dist_info)
633
+ {
634
+ static char sql[1024];
635
+ PGresult *result;
636
+
637
+ #ifdef HAVE_PQPREPARE
638
+ snprintf(sql, 1024, "SELECT %s($1::%s)", dist_info->dist_def_func,
639
+ dist_info->type_list[dist_info->dist_key_col_id]);
640
+ result = PQprepare(system_db_info->pgconn,
641
+ dist_info->prepare_name,
642
+ sql, 1, NULL);
643
+ #else
644
+ snprintf(sql, 1024, "PREPARE %s (%s) AS SELECT %s($1::%s)",
645
+ dist_info->prepare_name,
646
+ dist_info->type_list[dist_info->dist_key_col_id],
647
+ dist_info->dist_def_func,
648
+ dist_info->type_list[dist_info->dist_key_col_id]);
649
+ result = PQexec(system_db_info->pgconn, sql);
650
+ #endif /* HAVE_PQPREPARE */
651
+
652
+ if (!result || PQresultStatus(result) != PGRES_COMMAND_OK)
653
+ {
654
+ pool_error("PQprepare failed: %s", PQerrorMessage(system_db_info->pgconn));
655
+ return 1;
656
+ }
657
+ dist_info->is_created_prepare = 1;
658
+ return 0;
659
+ }