prestogres 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ * Portions Copyright (c) 2003-2008, PgPool Global Development Group
10
+ * Portions Copyright (c) 2004, PostgreSQL Global Development Group
11
+ *
12
+ * Permission to use, copy, modify, and distribute this software and
13
+ * its documentation for any purpose and without fee is hereby
14
+ * granted, provided that the above copyright notice appear in all
15
+ * copies and that both that copyright notice and this permission
16
+ * notice appear in supporting documentation, and that the name of the
17
+ * author not be used in advertising or publicity pertaining to
18
+ * distribution of the software without specific, written prior
19
+ * permission. The author makes no representations about the
20
+ * suitability of this software for any purpose. It is provided "as
21
+ * is" without express or implied warranty.
22
+ *
23
+ * pool.h.: master definition header file
24
+ *
25
+ */
26
+
27
+ #ifndef POOL_SIGNAL_H
28
+ #define POOL_SIGNAL_H
29
+
30
+ /*
31
+ * Signal stuff. Stolen from PostgreSQL source code.
32
+ */
33
+ #include <signal.h>
34
+
35
+ #ifdef HAVE_SIGPROCMASK
36
+ extern sigset_t UnBlockSig,
37
+ BlockSig,
38
+ AuthBlockSig;
39
+
40
+ #define POOL_SETMASK(mask) sigprocmask(SIG_SETMASK, mask, NULL)
41
+ #define POOL_SETMASK2(mask, oldmask) sigprocmask(SIG_SETMASK, mask, oldmask)
42
+ #else
43
+ extern int UnBlockSig,
44
+ BlockSig,
45
+ AuthBlockSig;
46
+
47
+ #ifndef WIN32
48
+ #define POOL_SETMASK(mask) sigsetmask(*((int*)(mask)))
49
+ #define POOL_SETMASK2(mask, oldmask) do {oldmask = POOL_SETMASK(mask)} while (0)
50
+ #else
51
+ #define POOL_SETMASK(mask) pqsigsetmask(*((int*)(mask)))
52
+ #define POOL_SETMASK2(mask, oldmask) do {oldmask = POOL_SETMASK(mask)} while (0)
53
+ int pqsigsetmask(int mask);
54
+ #endif
55
+ #endif
56
+
57
+ typedef void (*pool_sighandler_t) (int);
58
+ extern pool_sighandler_t pool_signal(int signo, pool_sighandler_t func);
59
+ extern void poolinitmask(void);
60
+
61
+ #endif /* POOL_SIGNAL_H */
@@ -0,0 +1,339 @@
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-2013 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_ssl.c: ssl negotiation functions
22
+ *
23
+ */
24
+
25
+ #include <string.h>
26
+
27
+ #include "config.h"
28
+ #include "pool.h"
29
+ #include "pool_stream.h"
30
+ #include "pool_config.h"
31
+
32
+ #ifdef USE_SSL
33
+
34
+ #define SSL_RETURN_VOID_IF(cond, msg) \
35
+ do { \
36
+ if ( (cond) ) { \
37
+ perror_ssl( (msg) ); \
38
+ return; \
39
+ } \
40
+ } while (0);
41
+
42
+ #define SSL_RETURN_ERROR_IF(cond, msg) \
43
+ do { \
44
+ if ( (cond) ) { \
45
+ perror_ssl( (msg) ); \
46
+ return -1; \
47
+ } \
48
+ } while (0);
49
+
50
+ #include <arpa/inet.h> /* for htonl() */
51
+
52
+ /* Major/minor codes to negotiate SSL prior to startup packet */
53
+ #define NEGOTIATE_SSL_CODE ( 1234<<16 | 5679 )
54
+
55
+ /* enum flag for differentiating server->client vs client->server SSL */
56
+ enum ssl_conn_type { ssl_conn_clientserver, ssl_conn_serverclient };
57
+
58
+ /* perform per-connection ssl initialization. returns nonzero on error */
59
+ static int init_ssl_ctx(POOL_CONNECTION *cp, enum ssl_conn_type conntype);
60
+
61
+ /* OpenSSL error message */
62
+ static void perror_ssl(const char *context);
63
+
64
+ /* attempt to negotiate a secure connection */
65
+ void pool_ssl_negotiate_clientserver(POOL_CONNECTION *cp) {
66
+ int ssl_packet[2] = { htonl(sizeof(int)*2), htonl(NEGOTIATE_SSL_CODE) };
67
+ char server_response;
68
+
69
+ cp->ssl_active = -1;
70
+
71
+ if ( (!pool_config->ssl) || init_ssl_ctx(cp, ssl_conn_clientserver))
72
+ return;
73
+
74
+ pool_debug("pool_ssl: sending client->server SSL request");
75
+ pool_write_and_flush(cp, ssl_packet, sizeof(int)*2);
76
+
77
+ if (pool_read(cp, &server_response, 1) < 0)
78
+ {
79
+ pool_error("pool_ssl_negotiate_clientserver: pool_read failed");
80
+ return;
81
+ }
82
+
83
+ pool_debug("pool_ssl: client->server SSL response: %c", server_response);
84
+
85
+ switch (server_response) {
86
+ case 'S':
87
+ SSL_set_fd(cp->ssl, cp->fd);
88
+ SSL_RETURN_VOID_IF( (SSL_connect(cp->ssl) < 0),
89
+ "SSL_connect");
90
+ cp->ssl_active = 1;
91
+ break;
92
+ case 'N':
93
+ /*
94
+ * If backend does not support SSL but pgpool does, we get this.
95
+ * i.e. This is normal.
96
+ */
97
+ pool_debug("pool_ssl: server doesn't want to talk SSL");
98
+ break;
99
+ default:
100
+ pool_error("pool_ssl: unhandled response: %c", server_response);
101
+ break;
102
+ }
103
+ }
104
+
105
+
106
+ /* attempt to negotiate a secure connection */
107
+ void pool_ssl_negotiate_serverclient(POOL_CONNECTION *cp) {
108
+
109
+ cp->ssl_active = -1;
110
+
111
+ if ( (!pool_config->ssl) || init_ssl_ctx(cp, ssl_conn_serverclient)) {
112
+ /* write back an "SSL reject" response before returning */
113
+ pool_write_and_flush(cp, "N", 1);
114
+ } else {
115
+ /* write back an "SSL accept" response */
116
+ pool_write_and_flush(cp, "S", 1);
117
+
118
+ SSL_set_fd(cp->ssl, cp->fd);
119
+ SSL_RETURN_VOID_IF( (SSL_accept(cp->ssl) < 0), "SSL_accept");
120
+ cp->ssl_active = 1;
121
+ }
122
+ }
123
+
124
+ void pool_ssl_close(POOL_CONNECTION *cp) {
125
+ if (cp->ssl) {
126
+ SSL_shutdown(cp->ssl);
127
+ SSL_free(cp->ssl);
128
+ }
129
+
130
+ if (cp->ssl_ctx)
131
+ SSL_CTX_free(cp->ssl_ctx);
132
+ }
133
+
134
+ int pool_ssl_read(POOL_CONNECTION *cp, void *buf, int size) {
135
+ int n;
136
+ int err;
137
+
138
+ retry:
139
+ errno = 0;
140
+ n = SSL_read(cp->ssl, buf, size);
141
+ err = SSL_get_error(cp->ssl, n);
142
+
143
+ switch (err)
144
+ {
145
+ case SSL_ERROR_NONE:
146
+ break;
147
+ case SSL_ERROR_WANT_READ:
148
+ case SSL_ERROR_WANT_WRITE:
149
+
150
+ /*
151
+ * Returning 0 here would cause caller to wait for read-ready,
152
+ * which is not correct since what SSL wants is wait for
153
+ * write-ready. The former could get us stuck in an infinite
154
+ * wait, so don't risk it; busy-loop instead.
155
+ */
156
+ goto retry;
157
+
158
+ case SSL_ERROR_SYSCALL:
159
+ if (n == -1)
160
+ {
161
+ pool_error("SSL_read error: %d", err);
162
+ }
163
+ else
164
+ {
165
+ pool_error("SSL_read error: EOF detected");
166
+ n = -1;
167
+ }
168
+ break;
169
+
170
+ case SSL_ERROR_SSL:
171
+ case SSL_ERROR_ZERO_RETURN:
172
+ perror_ssl("SSL_read");
173
+ n = -1;
174
+ break;
175
+ default:
176
+ pool_error("pool_ssl_read: unrecognized error code: %d", err);
177
+ /*
178
+ * We assume that the connection is broken. Returns 0
179
+ * rather than -1 in this case because -1 triggers
180
+ * unwanted failover in the caller (pool_read).
181
+ */
182
+ n = 0;
183
+ break;
184
+ }
185
+
186
+ return n;
187
+ }
188
+
189
+ int pool_ssl_write(POOL_CONNECTION *cp, const void *buf, int size)
190
+ {
191
+ int n;
192
+ int err;
193
+
194
+ retry:
195
+ errno = 0;
196
+ n = SSL_write(cp->ssl, buf, size);
197
+ err = SSL_get_error(cp->ssl, n);
198
+ switch (err)
199
+ {
200
+ case SSL_ERROR_NONE:
201
+ break;
202
+
203
+ case SSL_ERROR_WANT_READ:
204
+ case SSL_ERROR_WANT_WRITE:
205
+ goto retry;
206
+
207
+ case SSL_ERROR_SYSCALL:
208
+ if (n == -1)
209
+ {
210
+ pool_error("SSL_write error: %d", err);
211
+ }
212
+ else
213
+ {
214
+ pool_error("SSL_write error: EOF detected");
215
+ n = -1;
216
+ }
217
+ break;
218
+
219
+ case SSL_ERROR_SSL:
220
+ case SSL_ERROR_ZERO_RETURN:
221
+ perror_ssl("SSL_write");
222
+ n = -1;
223
+ break;
224
+
225
+ default:
226
+ pool_error("pool_ssl_write: unrecognized error code: %d", err);
227
+ /*
228
+ * We assume that the connection is broken.
229
+ */
230
+ n = -1;
231
+ break;
232
+ }
233
+ return n;
234
+ }
235
+
236
+ static int init_ssl_ctx(POOL_CONNECTION *cp, enum ssl_conn_type conntype) {
237
+ int error = 0;
238
+ char *cacert = NULL, *cacert_dir = NULL;
239
+
240
+ /* initialize SSL members */
241
+ cp->ssl_ctx = SSL_CTX_new(TLSv1_method());
242
+ SSL_RETURN_ERROR_IF( (! cp->ssl_ctx), "SSL_CTX_new" );
243
+
244
+ if ( conntype == ssl_conn_serverclient) {
245
+ error = SSL_CTX_use_certificate_file(cp->ssl_ctx,
246
+ pool_config->ssl_cert,
247
+ SSL_FILETYPE_PEM);
248
+ SSL_RETURN_ERROR_IF( (error <= 0), "Loading SSL certificate");
249
+
250
+ error = SSL_CTX_use_PrivateKey_file(cp->ssl_ctx,
251
+ pool_config->ssl_key,
252
+ SSL_FILETYPE_PEM);
253
+ SSL_RETURN_ERROR_IF( (error <= 0), "Loading SSL private key");
254
+ } else {
255
+ /* set extra verification if ssl_ca_cert or ssl_ca_cert_dir are set */
256
+ if (strlen(pool_config->ssl_ca_cert))
257
+ cacert = pool_config->ssl_ca_cert;
258
+ if (strlen(pool_config->ssl_ca_cert_dir))
259
+ cacert_dir = pool_config->ssl_ca_cert_dir;
260
+
261
+ if ( cacert || cacert_dir ) {
262
+ error = (!SSL_CTX_load_verify_locations(cp->ssl_ctx,
263
+ cacert,
264
+ cacert_dir));
265
+ SSL_RETURN_ERROR_IF(error, "SSL verification setup");
266
+ SSL_CTX_set_verify(cp->ssl_ctx, SSL_VERIFY_PEER, NULL);
267
+ }
268
+ }
269
+
270
+ cp->ssl = SSL_new(cp->ssl_ctx);
271
+ SSL_RETURN_ERROR_IF( (! cp->ssl), "SSL_new");
272
+
273
+ return 0;
274
+ }
275
+
276
+ static void perror_ssl(const char *context) {
277
+ unsigned long err;
278
+ static const char *no_err_reason = "no SSL error reported";
279
+ const char *reason;
280
+
281
+ err = ERR_get_error();
282
+ if (! err) {
283
+ reason = no_err_reason;
284
+ } else {
285
+ reason = ERR_reason_error_string(err);
286
+ }
287
+
288
+ if (reason != NULL) {
289
+ pool_error("pool_ssl: %s: %s", context, reason);
290
+ } else {
291
+ pool_error("pool_ssl: %s: Unknown SSL error %lu", context, err);
292
+ }
293
+ }
294
+
295
+ /*
296
+ * Return true if SSL layer has any pending data in buffer
297
+ */
298
+ bool pool_ssl_pending(POOL_CONNECTION *cp)
299
+ {
300
+ if (cp->ssl_active > 0 && SSL_pending(cp->ssl) > 0)
301
+ return true;
302
+ return false;
303
+ }
304
+
305
+ #else /* USE_SSL: wrap / no-op ssl functionality if it's not available */
306
+
307
+ void pool_ssl_negotiate_serverclient(POOL_CONNECTION *cp) {
308
+ pool_debug("pool_ssl: SSL requested but SSL support is not available");
309
+ pool_write_and_flush(cp, "N", 1);
310
+ cp->ssl_active = -1;
311
+ }
312
+
313
+ void pool_ssl_negotiate_clientserver(POOL_CONNECTION *cp) {
314
+ pool_debug("pool_ssl: SSL requested but SSL support is not available");
315
+ cp->ssl_active = -1;
316
+ }
317
+
318
+ void pool_ssl_close(POOL_CONNECTION *cp) { return; }
319
+
320
+ int pool_ssl_read(POOL_CONNECTION *cp, void *buf, int size) {
321
+ pool_error("pool_ssl: SSL i/o called but SSL support is not available");
322
+ notice_backend_error(cp->db_node_id);
323
+ child_exit(1);
324
+ return -1; /* never reached */
325
+ }
326
+
327
+ int pool_ssl_write(POOL_CONNECTION *cp, const void *buf, int size) {
328
+ pool_error("pool_ssl: SSL i/o called but SSL support is not available");
329
+ notice_backend_error(cp->db_node_id);
330
+ child_exit(1);
331
+ return -1; /* never reached */
332
+ }
333
+
334
+ bool pool_ssl_pending(POOL_CONNECTION *cp)
335
+ {
336
+ return false;
337
+ }
338
+
339
+ #endif /* USE_SSL */
@@ -0,0 +1,962 @@
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-2013 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_stream.c: stream I/O modules
22
+ *
23
+ */
24
+
25
+ #include "config.h"
26
+
27
+ #ifdef HAVE_SYS_SELECT_H
28
+ #include <sys/select.h>
29
+ #endif
30
+
31
+ #include <stdio.h>
32
+ #include <stdlib.h>
33
+ #include <string.h>
34
+ #include <errno.h>
35
+ #include <unistd.h>
36
+
37
+ #ifdef HAVE_FCNTL_H
38
+ #include <fcntl.h>
39
+ #endif
40
+
41
+ #include "pool.h"
42
+ #include "pool_stream.h"
43
+ #include "pool_config.h"
44
+
45
+ static int mystrlen(char *str, int upper, int *flag);
46
+ static int mystrlinelen(char *str, int upper, int *flag);
47
+ static int save_pending_data(POOL_CONNECTION *cp, void *data, int len);
48
+ static int consume_pending_data(POOL_CONNECTION *cp, void *data, int len);
49
+
50
+ /*
51
+ * open read/write file descriptors.
52
+ * returns POOL_CONNECTION on success otherwise NULL.
53
+ */
54
+ POOL_CONNECTION *pool_open(int fd)
55
+ {
56
+ POOL_CONNECTION *cp;
57
+
58
+ cp = (POOL_CONNECTION *)malloc(sizeof(POOL_CONNECTION));
59
+ if (cp == NULL)
60
+ {
61
+ pool_error("pool_open: malloc failed: %s", strerror(errno));
62
+ return NULL;
63
+ }
64
+
65
+ memset(cp, 0, sizeof(*cp));
66
+
67
+ /* initialize write buffer */
68
+ cp->wbuf = malloc(WRITEBUFSZ);
69
+ if (cp->wbuf == NULL)
70
+ {
71
+ pool_error("pool_open: malloc failed");
72
+ return NULL;
73
+ }
74
+ cp->wbufsz = WRITEBUFSZ;
75
+ cp->wbufpo = 0;
76
+
77
+ /* initialize pending data buffer */
78
+ cp->hp = malloc(READBUFSZ);
79
+ if (cp->hp == NULL)
80
+ {
81
+ pool_error("pool_open: malloc failed");
82
+ free(cp);
83
+ return NULL;
84
+ }
85
+ cp->bufsz = READBUFSZ;
86
+ cp->po = 0;
87
+ cp->len = 0;
88
+ cp->sbuf = NULL;
89
+ cp->sbufsz = 0;
90
+ cp->buf2 = NULL;
91
+ cp->bufsz2 = 0;
92
+
93
+ cp->fd = fd;
94
+ return cp;
95
+ }
96
+
97
+ /*
98
+ * close read/write file descriptors.
99
+ */
100
+ void pool_close(POOL_CONNECTION *cp)
101
+ {
102
+ /*
103
+ * shutdown connection to the client so that pgpool is not blocked
104
+ */
105
+ if (!cp->isbackend)
106
+ shutdown(cp->fd, 1);
107
+ close(cp->fd);
108
+
109
+ free(cp->wbuf);
110
+ free(cp->hp);
111
+ if (cp->sbuf)
112
+ free(cp->sbuf);
113
+ if (cp->buf2)
114
+ free(cp->buf2);
115
+ pool_discard_params(&cp->params);
116
+
117
+ pool_ssl_close(cp);
118
+
119
+ free(cp);
120
+ }
121
+
122
+ /*
123
+ * read len bytes from cp
124
+ * returns 0 on success otherwise -1.
125
+ */
126
+ int pool_read(POOL_CONNECTION *cp, void *buf, int len)
127
+ {
128
+ static char readbuf[READBUFSZ];
129
+
130
+ int consume_size;
131
+ int readlen;
132
+
133
+ consume_size = consume_pending_data(cp, buf, len);
134
+ len -= consume_size;
135
+ buf += consume_size;
136
+
137
+ while (len > 0)
138
+ {
139
+ if (pool_check_fd(cp))
140
+ {
141
+ if (!IS_MASTER_NODE_ID(cp->db_node_id) && (getpid() != mypid))
142
+ {
143
+ pool_log("pool_read: data is not ready in DB node: %d. abort this session",
144
+ cp->db_node_id);
145
+ exit(1);
146
+ }
147
+ else
148
+ {
149
+ pool_error("pool_read: pool_check_fd failed (%s)", strerror(errno));
150
+ return -1;
151
+ }
152
+ }
153
+
154
+ if (cp->ssl_active > 0) {
155
+ readlen = pool_ssl_read(cp, readbuf, READBUFSZ);
156
+ } else {
157
+ readlen = read(cp->fd, readbuf, READBUFSZ);
158
+ }
159
+
160
+ if (readlen == -1)
161
+ {
162
+ if (errno == EINTR || errno == EAGAIN)
163
+ {
164
+ pool_debug("pool_read: retrying due to %s", strerror(errno));
165
+ continue;
166
+ }
167
+
168
+ pool_error("pool_read: read failed (%s)", strerror(errno));
169
+
170
+ if (cp->isbackend)
171
+ {
172
+ /* if fail_over_on_backend_error is true, then trigger failover */
173
+ if (pool_config->fail_over_on_backend_error)
174
+ {
175
+ notice_backend_error(cp->db_node_id);
176
+ child_exit(1);
177
+ pool_log("pool_read: do not failover because I am the main process");
178
+ return -1;
179
+ }
180
+ else
181
+ {
182
+ pool_log("pool_read: do not failover because fail_over_on_backend_error is off");
183
+ return -1;
184
+ }
185
+ }
186
+ else
187
+ {
188
+ return -1;
189
+ }
190
+ }
191
+ else if (readlen == 0)
192
+ {
193
+ if (cp->isbackend)
194
+ {
195
+ pool_error("pool_read: EOF encountered with backend");
196
+ return -1;
197
+
198
+ #ifdef NOT_USED
199
+ /* fatal error, notice to parent and exit */
200
+ notice_backend_error(IS_MASTER_NODE_ID(cp->db_node_id));
201
+ child_exit(1);
202
+ #endif
203
+ }
204
+ else
205
+ {
206
+ /*
207
+ * if backend offers authentication method, frontend could close connection
208
+ */
209
+ return -1;
210
+ }
211
+ }
212
+
213
+ if (len < readlen)
214
+ {
215
+ /* overrun. we need to save remaining data to pending buffer */
216
+ if (save_pending_data(cp, readbuf+len, readlen-len))
217
+ return -1;
218
+ memmove(buf, readbuf, len);
219
+ break;
220
+ }
221
+
222
+ memmove(buf, readbuf, readlen);
223
+ buf += readlen;
224
+ len -= readlen;
225
+ }
226
+
227
+ return 0;
228
+ }
229
+
230
+ /*
231
+ * read exactly len bytes from cp
232
+ * returns buffer address on success otherwise NULL.
233
+ */
234
+ char *pool_read2(POOL_CONNECTION *cp, int len)
235
+ {
236
+ char *buf;
237
+ int req_size;
238
+ int alloc_size;
239
+ int consume_size;
240
+ int readlen;
241
+
242
+ req_size = cp->len + len;
243
+
244
+ if (req_size > cp->bufsz2)
245
+ {
246
+ alloc_size = ((req_size+1)/READBUFSZ+1)*READBUFSZ;
247
+ cp->buf2 = realloc(cp->buf2, alloc_size);
248
+ if (cp->buf2 == NULL)
249
+ {
250
+ pool_error("pool_read2: failed to realloc");
251
+ exit(1);
252
+ }
253
+ cp->bufsz2 = alloc_size;
254
+ }
255
+
256
+ buf = cp->buf2;
257
+
258
+ consume_size = consume_pending_data(cp, buf, len);
259
+ len -= consume_size;
260
+ buf += consume_size;
261
+
262
+ while (len > 0)
263
+ {
264
+ if (pool_check_fd(cp))
265
+ {
266
+ if (!IS_MASTER_NODE_ID(cp->db_node_id))
267
+ {
268
+ pool_log("pool_read2: data is not ready in DB node:%d. abort this session",
269
+ cp->db_node_id);
270
+ exit(1);
271
+ }
272
+ else
273
+ {
274
+ pool_error("pool_read2: pool_check_fd failed (%s)", strerror(errno));
275
+ return NULL;
276
+ }
277
+ }
278
+
279
+ if (cp->ssl_active > 0) {
280
+ readlen = pool_ssl_read(cp, buf, len);
281
+ } else {
282
+ readlen = read(cp->fd, buf, len);
283
+ }
284
+
285
+ if (readlen == -1)
286
+ {
287
+ if (errno == EINTR || errno == EAGAIN)
288
+ {
289
+ pool_debug("pool_read2: retrying due to %s", strerror(errno));
290
+ continue;
291
+ }
292
+
293
+ pool_error("pool_read2: read failed (%s)", strerror(errno));
294
+
295
+ if (cp->isbackend)
296
+ {
297
+ /* if fail_over_on_backend_error is true, then trigger failover */
298
+ if (pool_config->fail_over_on_backend_error)
299
+ {
300
+ notice_backend_error(cp->db_node_id);
301
+ child_exit(1);
302
+ pool_log("pool_read2: do not failover because I am the main process");
303
+ return NULL;
304
+ }
305
+ else
306
+ {
307
+ pool_log("pool_read2: do not failover because fail_over_on_backend_error is off");
308
+ return NULL;
309
+ }
310
+ }
311
+ else
312
+ {
313
+ return NULL;
314
+ }
315
+ }
316
+ else if (readlen == 0)
317
+ {
318
+ if (cp->isbackend)
319
+ {
320
+ pool_error("pool_read2: EOF encountered with backend");
321
+ return NULL;
322
+
323
+ #ifdef NOT_USED
324
+ /* fatal error, notice to parent and exit */
325
+ notice_backend_error(IS_MASTER_NODE_ID(cp->db_node_id));
326
+ child_exit(1);
327
+ #endif
328
+ }
329
+ else
330
+ {
331
+ /*
332
+ * if backend offers authentication method, frontend could close connection
333
+ */
334
+ return NULL;
335
+ }
336
+ }
337
+
338
+ buf += readlen;
339
+ len -= readlen;
340
+ }
341
+
342
+ return cp->buf2;
343
+ }
344
+
345
+ /*
346
+ * write len bytes to cp the write buffer.
347
+ * returns 0 on success otherwise -1.
348
+ */
349
+ int pool_write(POOL_CONNECTION *cp, void *buf, int len)
350
+ {
351
+ if (len < 0)
352
+ {
353
+ pool_error("pool_write: invalid request size: %d", len);
354
+ return -1;
355
+ }
356
+
357
+ if (cp->no_forward)
358
+ return 0;
359
+
360
+ while (len > 0)
361
+ {
362
+ int remainder = WRITEBUFSZ - cp->wbufpo;
363
+
364
+ if (cp->wbufpo >= WRITEBUFSZ)
365
+ {
366
+ /*
367
+ * Write buffer is full. so flush buffer.
368
+ * wbufpo is reset in pool_flush_it().
369
+ */
370
+ if (pool_flush_it(cp) == -1)
371
+ return -1;
372
+ remainder = WRITEBUFSZ;
373
+ }
374
+
375
+ /* check buffer size */
376
+ if (remainder >= len)
377
+ {
378
+ /* OK, buffer size is enough. */
379
+ remainder = len;
380
+ }
381
+ memcpy(cp->wbuf+cp->wbufpo, buf, remainder);
382
+ cp->wbufpo += remainder;
383
+ buf += remainder;
384
+ len -= remainder;
385
+ }
386
+
387
+ return 0;
388
+ }
389
+
390
+ /*
391
+ * flush write buffer
392
+ */
393
+ int pool_flush_it(POOL_CONNECTION *cp)
394
+ {
395
+ int sts;
396
+ int wlen;
397
+ int offset;
398
+ wlen = cp->wbufpo;
399
+
400
+ if (wlen == 0)
401
+ {
402
+ return 0;
403
+ }
404
+
405
+ offset = 0;
406
+
407
+ for (;;)
408
+ {
409
+ errno = 0;
410
+
411
+ #ifdef NOT_USED
412
+ if (!cp->isbackend)
413
+ {
414
+ fd_set writemask;
415
+ fd_set exceptmask;
416
+
417
+ FD_ZERO(&writemask);
418
+ FD_ZERO(&exceptmask);
419
+ FD_SET(cp->fd, &writemask);
420
+ FD_SET(cp->fd, &exceptmask);
421
+
422
+ sts = select(cp->fd+1, NULL, &writemask, &exceptmask, NULL);
423
+ if (sts == -1)
424
+ {
425
+ if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK)
426
+ continue;
427
+
428
+ pool_error("pool_flush_it: select() failed. reason: %s", strerror(errno));
429
+ cp->wbufpo = 0;
430
+ return -1;
431
+ }
432
+ else if (sts == 0)
433
+ {
434
+ continue;
435
+ }
436
+ else if (FD_ISSET(cp->fd, &exceptmask))
437
+ {
438
+ pool_log("pool_flush_it: exception occurred");
439
+ cp->wbufpo = 0;
440
+ return -1;
441
+ }
442
+ }
443
+ #endif
444
+ if (cp->ssl_active > 0) {
445
+ sts = pool_ssl_write(cp, cp->wbuf + offset, wlen);
446
+ } else {
447
+ sts = write(cp->fd, cp->wbuf + offset, wlen);
448
+ }
449
+
450
+ if (sts > 0)
451
+ {
452
+ wlen -= sts;
453
+
454
+ if (wlen == 0)
455
+ {
456
+ /* write completed */
457
+ break;
458
+ }
459
+
460
+ else if (wlen < 0)
461
+ {
462
+ pool_error("pool_flush_it: invalid write size %d", sts);
463
+ cp->wbufpo = 0;
464
+ return -1;
465
+ }
466
+
467
+ else
468
+ {
469
+ /* need to write remaining data */
470
+ offset += sts;
471
+ continue;
472
+ }
473
+ }
474
+
475
+ else if (errno == EAGAIN || errno == EINTR)
476
+ {
477
+ continue;
478
+ }
479
+
480
+ else
481
+ {
482
+ /* If this is the backend stream, report error. Otherwise
483
+ * just report debug message.
484
+ */
485
+ if (cp->isbackend)
486
+ pool_error("pool_flush_it: write failed to backend (%d). reason: %s offset: %d wlen: %d",
487
+ cp->db_node_id, strerror(errno), offset, wlen);
488
+ else
489
+ pool_debug("pool_flush_it: write failed to frontend. reason: %s offset: %d wlen: %d",
490
+ strerror(errno), offset, wlen);
491
+
492
+ cp->wbufpo = 0;
493
+ return -1;
494
+ }
495
+ }
496
+
497
+ cp->wbufpo = 0;
498
+
499
+ return 0;
500
+ }
501
+
502
+ /*
503
+ * flush write buffer and degenerate/failover if error occurs
504
+ */
505
+ int pool_flush(POOL_CONNECTION *cp)
506
+ {
507
+ if (pool_flush_it(cp) == -1)
508
+ {
509
+ if (cp->isbackend)
510
+ {
511
+ /* if fail_over_on_backend_error is true, then trigger failover */
512
+ if (pool_config->fail_over_on_backend_error)
513
+ {
514
+ notice_backend_error(cp->db_node_id);
515
+ child_exit(1);
516
+ pool_log("pool_flush: do not failover because I am the main process");
517
+ return -1;
518
+ }
519
+ else
520
+ {
521
+ pool_log("pool_flush: do not failover because fail_over_on_backend_error is off");
522
+ return -1;
523
+ }
524
+ }
525
+ else
526
+ {
527
+ /*
528
+ * If we are in replication mode, we need to continue the
529
+ * processing with backends to keep consistency among
530
+ * backends, thus ignore error.
531
+ */
532
+ if (REPLICATION)
533
+ return 0;
534
+ else
535
+ return -1;
536
+ }
537
+ }
538
+ return 0;
539
+ }
540
+
541
+ /*
542
+ * combo of pool_write and pool_flush
543
+ */
544
+ int pool_write_and_flush(POOL_CONNECTION *cp, void *buf, int len)
545
+ {
546
+ if (pool_write(cp, buf, len))
547
+ return -1;
548
+ return pool_flush(cp);
549
+ }
550
+
551
+ /*
552
+ * read a string until EOF or NULL is encountered.
553
+ * if line is not 0, read until new line is encountered.
554
+ */
555
+ char *pool_read_string(POOL_CONNECTION *cp, int *len, int line)
556
+ {
557
+ int readp;
558
+ int readsize;
559
+ int readlen;
560
+ int strlength;
561
+ int flag;
562
+ int consume_size;
563
+
564
+ #ifdef DEBUG
565
+ static char pbuf[READBUFSZ];
566
+ #endif
567
+
568
+ *len = 0;
569
+ readp = 0;
570
+
571
+ /* initialize read buffer */
572
+ if (cp->sbufsz == 0)
573
+ {
574
+ cp->sbuf = malloc(READBUFSZ);
575
+ if (cp->sbuf == NULL)
576
+ {
577
+ pool_error("pool_read_string: malloc failed");
578
+ return NULL;
579
+ }
580
+ cp->sbufsz = READBUFSZ;
581
+ *cp->sbuf = '\0';
582
+ }
583
+
584
+ /* any pending data? */
585
+ if (cp->len)
586
+ {
587
+ if (line)
588
+ strlength = mystrlinelen(cp->hp+cp->po, cp->len, &flag);
589
+ else
590
+ strlength = mystrlen(cp->hp+cp->po, cp->len, &flag);
591
+
592
+ /* buffer is too small? */
593
+ if ((strlength + 1) > cp->sbufsz)
594
+ {
595
+ cp->sbufsz = ((strlength+1)/READBUFSZ+1)*READBUFSZ;
596
+ cp->sbuf = realloc(cp->sbuf, cp->sbufsz);
597
+ if (cp->sbuf == NULL)
598
+ {
599
+ pool_error("pool_read_string: realloc failed");
600
+ return NULL;
601
+ }
602
+ }
603
+
604
+ /* consume pending and save to read string buffer */
605
+ consume_size = consume_pending_data(cp, cp->sbuf, strlength);
606
+
607
+ *len = strlength;
608
+
609
+ /* is the string null terminated? */
610
+ if (consume_size == strlength && !flag)
611
+ {
612
+ /* not null or line terminated.
613
+ * we need to read more since we have not encountered NULL or new line yet
614
+ */
615
+ readsize = cp->sbufsz - strlength;
616
+ readp = strlength;
617
+ }
618
+ else
619
+ {
620
+ pool_debug("pool_read_string: read all from pending data. po:%d len:%d",
621
+ cp->po, cp->len);
622
+ return cp->sbuf;
623
+ }
624
+ } else
625
+ {
626
+ readsize = cp->sbufsz;
627
+ }
628
+
629
+ for (;;)
630
+ {
631
+ if (pool_check_fd(cp))
632
+ {
633
+ if (!IS_MASTER_NODE_ID(cp->db_node_id))
634
+ {
635
+ pool_log("pool_read_string: data is not ready in DB node:%d. abort this session",
636
+ cp->db_node_id);
637
+ exit(1);
638
+ }
639
+ else
640
+ {
641
+ pool_error("pool_read_string: pool_check_fd failed (%s)", strerror(errno));
642
+ return NULL;
643
+ }
644
+ }
645
+
646
+ if (cp->ssl_active > 0) {
647
+ readlen = pool_ssl_read(cp, cp->sbuf+readp, readsize);
648
+ } else {
649
+ readlen = read(cp->fd, cp->sbuf+readp, readsize);
650
+ }
651
+
652
+ if (readlen == -1)
653
+ {
654
+ pool_error("pool_read_string: read() failed. reason:%s", strerror(errno));
655
+
656
+ if (cp->isbackend)
657
+ {
658
+ notice_backend_error(cp->db_node_id);
659
+ child_exit(1);
660
+ return NULL;
661
+ }
662
+ else
663
+ {
664
+ return NULL;
665
+ }
666
+ }
667
+ else if (readlen == 0) /* EOF detected */
668
+ {
669
+ /*
670
+ * just returns an error, not trigger failover or degeneration
671
+ */
672
+ pool_error("pool_read_string: read () EOF detected");
673
+ return NULL;
674
+ }
675
+
676
+ /* check overrun */
677
+ if (line)
678
+ strlength = mystrlinelen(cp->sbuf+readp, readlen, &flag);
679
+ else
680
+ strlength = mystrlen(cp->sbuf+readp, readlen, &flag);
681
+
682
+ if (strlength < readlen)
683
+ {
684
+ save_pending_data(cp, cp->sbuf+readp+strlength, readlen-strlength);
685
+ *len += strlength;
686
+ pool_debug("pool_read_string: total result %d with pending data po:%d len:%d", *len, cp->po, cp->len);
687
+ return cp->sbuf;
688
+ }
689
+
690
+ *len += readlen;
691
+
692
+ /* encountered null or newline? */
693
+ if (flag)
694
+ {
695
+ /* ok we have read all data */
696
+ pool_debug("pool_read_string: total result %d ", *len);
697
+ break;
698
+ }
699
+
700
+ readp += readlen;
701
+ readsize = READBUFSZ;
702
+
703
+ if ((*len+readsize) > cp->sbufsz)
704
+ {
705
+ cp->sbufsz += READBUFSZ;
706
+
707
+ cp->sbuf = realloc(cp->sbuf, cp->sbufsz);
708
+ if (cp->sbuf == NULL)
709
+ {
710
+ pool_error("pool_read_string: realloc failed");
711
+ return NULL;
712
+ }
713
+ }
714
+ }
715
+ return cp->sbuf;
716
+ }
717
+
718
+ /*
719
+ * returns the byte length of str, including \0, no more than upper.
720
+ * if encountered \0, flag is set to non 0.
721
+ * example:
722
+ * mystrlen("abc", 2) returns 2
723
+ * mystrlen("abc", 3) returns 3
724
+ * mystrlen("abc", 4) returns 4
725
+ * mystrlen("abc", 5) returns 4
726
+ */
727
+ static int mystrlen(char *str, int upper, int *flag)
728
+ {
729
+ int len;
730
+
731
+ *flag = 0;
732
+
733
+ for (len = 0;len < upper; len++, str++)
734
+ {
735
+ if (!*str)
736
+ {
737
+ len++;
738
+ *flag = 1;
739
+ break;
740
+ }
741
+ }
742
+ return len;
743
+ }
744
+
745
+ /*
746
+ * returns the byte length of str terminated by \n or \0 (including \n or \0), no more than upper.
747
+ * if encountered \0 or \n, flag is set to non 0.
748
+ * example:
749
+ * mystrlinelen("abc", 2) returns 2
750
+ * mystrlinelen("abc", 3) returns 3
751
+ * mystrlinelen("abc", 4) returns 4
752
+ * mystrlinelen("abc", 5) returns 4
753
+ * mystrlinelen("abcd\nefg", 4) returns 4
754
+ * mystrlinelen("abcd\nefg", 5) returns 5
755
+ * mystrlinelen("abcd\nefg", 6) returns 5
756
+ */
757
+ static int mystrlinelen(char *str, int upper, int *flag)
758
+ {
759
+ int len;
760
+
761
+ *flag = 0;
762
+
763
+ for (len = 0;len < upper; len++, str++)
764
+ {
765
+ if (!*str || *str == '\n')
766
+ {
767
+ len++;
768
+ *flag = 1;
769
+ break;
770
+ }
771
+ }
772
+ return len;
773
+ }
774
+
775
+ /*
776
+ * save pending data
777
+ */
778
+ static int save_pending_data(POOL_CONNECTION *cp, void *data, int len)
779
+ {
780
+ int reqlen;
781
+ size_t realloc_size;
782
+ char *p;
783
+
784
+ /* to be safe */
785
+ if (cp->len == 0)
786
+ cp->po = 0;
787
+
788
+ reqlen = cp->po + cp->len + len;
789
+
790
+ /* pending buffer is enough? */
791
+ if (reqlen > cp->bufsz)
792
+ {
793
+ /* too small, enlarge it */
794
+ realloc_size = (reqlen/READBUFSZ+1)*READBUFSZ;
795
+ p = realloc(cp->hp, realloc_size);
796
+ if (p == NULL)
797
+ {
798
+ pool_error("save_pending_data: realloc failed");
799
+ return -1;
800
+ }
801
+
802
+ cp->bufsz = realloc_size;
803
+ cp->hp = p;
804
+ }
805
+
806
+ memmove(cp->hp + cp->po + cp->len, data, len);
807
+ cp->len += len;
808
+
809
+ return 0;
810
+ }
811
+
812
+ /*
813
+ * consume pending data. returns actually consumed data length.
814
+ */
815
+ static int consume_pending_data(POOL_CONNECTION *cp, void *data, int len)
816
+ {
817
+ int consume_size;
818
+
819
+ if (cp->len <= 0)
820
+ return 0;
821
+
822
+ consume_size = Min(len, cp->len);
823
+ memmove(data, cp->hp + cp->po, consume_size);
824
+ cp->len -= consume_size;
825
+
826
+ if (cp->len <= 0)
827
+ cp->po = 0;
828
+ else
829
+ cp->po += consume_size;
830
+
831
+ return consume_size;
832
+ }
833
+
834
+ /*
835
+ * pool_unread: Put back data to input buffer
836
+ */
837
+ int pool_unread(POOL_CONNECTION *cp, void *data, int len)
838
+ {
839
+ void *p = cp->hp;
840
+ int n = cp->len + len;
841
+ int realloc_size;
842
+
843
+ if (cp->bufsz < n)
844
+ {
845
+ realloc_size = (n/READBUFSZ+1)*READBUFSZ;
846
+ p = realloc(cp->hp, realloc_size);
847
+ if (p == NULL)
848
+ {
849
+ pool_error("pool_unread: realloc failed");
850
+ return -1;
851
+ }
852
+ cp->hp = p;
853
+ }
854
+ if (cp->len != 0)
855
+ memmove(p + len, cp->hp + cp->po, cp->len);
856
+ memmove(p, data, len);
857
+ cp->len = n;
858
+ cp->po = 0;
859
+ return 0;
860
+ }
861
+
862
+ /*
863
+ * pool_push: Push data into buffer stack.
864
+ */
865
+ int pool_push(POOL_CONNECTION *cp, void *data, int len)
866
+ {
867
+ char *p;
868
+
869
+ pool_debug("pool_push: len: %d", len);
870
+
871
+ if (cp->bufsz3 == 0)
872
+ {
873
+ p = cp->buf3 = malloc(len);
874
+ if (p == NULL)
875
+ {
876
+ pool_error("pool_push: malloc failed. len:%d", len);
877
+ return -1;
878
+ }
879
+ }
880
+ else
881
+ {
882
+ p = cp->buf3 + cp->bufsz3;
883
+ cp->buf3 = realloc(cp->buf3, cp->bufsz3 + len);
884
+ }
885
+
886
+ memcpy(p, data, len);
887
+ cp->bufsz3 += len;
888
+
889
+ return 0;
890
+ }
891
+
892
+ /*
893
+ * pool_pop: Pop data from buffer stack and put back data using
894
+ * pool_unread.
895
+ */
896
+ void pool_pop(POOL_CONNECTION *cp, int *len)
897
+ {
898
+ if (cp->bufsz3 == 0)
899
+ {
900
+ *len = 0;
901
+ pool_debug("pool_pop: len: %d", *len);
902
+ return;
903
+ }
904
+
905
+ pool_unread(cp, cp->buf3, cp->bufsz3);
906
+ *len = cp->bufsz3;
907
+ free(cp->buf3);
908
+ cp->bufsz3 = 0;
909
+ cp->buf3 = NULL;
910
+ pool_debug("pool_pop: len: %d", *len);
911
+ }
912
+
913
+ /*
914
+ * pool_stacklen: Returns buffer stack length
915
+ * pool_unread.
916
+ */
917
+ int pool_stacklen(POOL_CONNECTION *cp)
918
+ {
919
+ return cp->bufsz3;
920
+ }
921
+
922
+ /*
923
+ * set non-block flag
924
+ */
925
+ void pool_set_nonblock(int fd)
926
+ {
927
+ int var;
928
+
929
+ /* set fd to none blocking */
930
+ var = fcntl(fd, F_GETFL, 0);
931
+ if (var == -1)
932
+ {
933
+ pool_error("fcntl failed. %s", strerror(errno));
934
+ child_exit(1);
935
+ }
936
+ if (fcntl(fd, F_SETFL, var | O_NONBLOCK) == -1)
937
+ {
938
+ pool_error("fcntl failed. %s", strerror(errno));
939
+ child_exit(1);
940
+ }
941
+ }
942
+
943
+ /*
944
+ * unset non-block flag
945
+ */
946
+ void pool_unset_nonblock(int fd)
947
+ {
948
+ int var;
949
+
950
+ /* set fd to none blocking */
951
+ var = fcntl(fd, F_GETFL, 0);
952
+ if (var == -1)
953
+ {
954
+ pool_error("fcntl failed. %s", strerror(errno));
955
+ child_exit(1);
956
+ }
957
+ if (fcntl(fd, F_SETFL, var & ~O_NONBLOCK) == -1)
958
+ {
959
+ pool_error("fcntl failed. %s", strerror(errno));
960
+ child_exit(1);
961
+ }
962
+ }