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.
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +20 -0
- data/LICENSE +202 -0
- data/NOTICE +22 -0
- data/README.md +217 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/bin/prestogres +254 -0
- data/config/pcp.conf.sample +28 -0
- data/config/pgpool.conf +678 -0
- data/config/pool_hba.conf +84 -0
- data/config/pool_passwd +0 -0
- data/config/postgresql.conf +2 -0
- data/ext/.gitignore +6 -0
- data/ext/depend +26 -0
- data/ext/extconf.rb +4 -0
- data/ext/prestogres_config.c +12 -0
- data/pgpool2/.gitignore +36 -0
- data/pgpool2/AUTHORS +4 -0
- data/pgpool2/COPYING +12 -0
- data/pgpool2/ChangeLog +1 -0
- data/pgpool2/INSTALL +1 -0
- data/pgpool2/Makefile.am +159 -0
- data/pgpool2/Makefile.in +1187 -0
- data/pgpool2/NEWS +4960 -0
- data/pgpool2/README +1 -0
- data/pgpool2/README.euc_jp +1 -0
- data/pgpool2/README.online-recovery +62 -0
- data/pgpool2/TODO +103 -0
- data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
- data/pgpool2/aclocal.m4 +1088 -0
- data/pgpool2/c-compiler.m4 +134 -0
- data/pgpool2/c-library.m4 +325 -0
- data/pgpool2/child.c +2097 -0
- data/pgpool2/config.guess +1532 -0
- data/pgpool2/config.h.in +332 -0
- data/pgpool2/config.sub +1640 -0
- data/pgpool2/configure +15752 -0
- data/pgpool2/configure.in +392 -0
- data/pgpool2/depcomp +522 -0
- data/pgpool2/doc/basebackup.sh +17 -0
- data/pgpool2/doc/pgpool-de.html +4220 -0
- data/pgpool2/doc/pgpool-en.html +5738 -0
- data/pgpool2/doc/pgpool-fr.html +4118 -0
- data/pgpool2/doc/pgpool-ja.css +198 -0
- data/pgpool2/doc/pgpool-ja.html +11279 -0
- data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
- data/pgpool2/doc/pgpool.css +280 -0
- data/pgpool2/doc/pgpool_remote_start +13 -0
- data/pgpool2/doc/recovery.conf.sample +117 -0
- data/pgpool2/doc/tutorial-en.html +707 -0
- data/pgpool2/doc/tutorial-ja.html +422 -0
- data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
- data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
- data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
- data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
- data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
- data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
- data/pgpool2/doc/tutorial-zh_cn.html +537 -0
- data/pgpool2/doc/watchdog.png +0 -0
- data/pgpool2/doc/wd-en.html +236 -0
- data/pgpool2/doc/wd-en.jpg +0 -0
- data/pgpool2/doc/wd-ja.html +219 -0
- data/pgpool2/doc/wd-ja.jpg +0 -0
- data/pgpool2/doc/wd-zh_cn.html +201 -0
- data/pgpool2/doc/where_to_send_queries.odg +0 -0
- data/pgpool2/doc/where_to_send_queries.pdf +0 -0
- data/pgpool2/general.m4 +166 -0
- data/pgpool2/getopt_long.c +200 -0
- data/pgpool2/getopt_long.h +44 -0
- data/pgpool2/install-sh +251 -0
- data/pgpool2/ltmain.sh +8406 -0
- data/pgpool2/m4/libtool.m4 +7360 -0
- data/pgpool2/m4/ltoptions.m4 +368 -0
- data/pgpool2/m4/ltsugar.m4 +123 -0
- data/pgpool2/m4/ltversion.m4 +23 -0
- data/pgpool2/m4/lt~obsolete.m4 +92 -0
- data/pgpool2/main.c +2971 -0
- data/pgpool2/md5.c +444 -0
- data/pgpool2/md5.h +28 -0
- data/pgpool2/missing +360 -0
- data/pgpool2/mkinstalldirs +40 -0
- data/pgpool2/parser/Makefile.am +50 -0
- data/pgpool2/parser/Makefile.in +559 -0
- data/pgpool2/parser/copyfuncs.c +3310 -0
- data/pgpool2/parser/gram.c +39100 -0
- data/pgpool2/parser/gram.h +940 -0
- data/pgpool2/parser/gram.y +13408 -0
- data/pgpool2/parser/gramparse.h +74 -0
- data/pgpool2/parser/keywords.c +32 -0
- data/pgpool2/parser/keywords.h +39 -0
- data/pgpool2/parser/kwlist.h +425 -0
- data/pgpool2/parser/kwlookup.c +88 -0
- data/pgpool2/parser/list.c +1156 -0
- data/pgpool2/parser/makefuncs.c +518 -0
- data/pgpool2/parser/makefuncs.h +83 -0
- data/pgpool2/parser/memnodes.h +79 -0
- data/pgpool2/parser/nodes.c +29 -0
- data/pgpool2/parser/nodes.h +609 -0
- data/pgpool2/parser/outfuncs.c +5790 -0
- data/pgpool2/parser/parsenodes.h +2615 -0
- data/pgpool2/parser/parser.c +262 -0
- data/pgpool2/parser/parser.h +46 -0
- data/pgpool2/parser/pg_class.h +158 -0
- data/pgpool2/parser/pg_config_manual.h +273 -0
- data/pgpool2/parser/pg_list.h +352 -0
- data/pgpool2/parser/pg_trigger.h +147 -0
- data/pgpool2/parser/pg_wchar.h +492 -0
- data/pgpool2/parser/pool_memory.c +342 -0
- data/pgpool2/parser/pool_memory.h +77 -0
- data/pgpool2/parser/pool_parser.h +222 -0
- data/pgpool2/parser/pool_string.c +121 -0
- data/pgpool2/parser/pool_string.h +37 -0
- data/pgpool2/parser/primnodes.h +1280 -0
- data/pgpool2/parser/scan.c +4094 -0
- data/pgpool2/parser/scan.l +1451 -0
- data/pgpool2/parser/scanner.h +120 -0
- data/pgpool2/parser/scansup.c +221 -0
- data/pgpool2/parser/scansup.h +28 -0
- data/pgpool2/parser/snprintf.c +1102 -0
- data/pgpool2/parser/stringinfo.c +294 -0
- data/pgpool2/parser/stringinfo.h +178 -0
- data/pgpool2/parser/value.c +78 -0
- data/pgpool2/parser/value.h +62 -0
- data/pgpool2/parser/wchar.c +2048 -0
- data/pgpool2/pcp.conf.sample +28 -0
- data/pgpool2/pcp/Makefile.am +40 -0
- data/pgpool2/pcp/Makefile.in +771 -0
- data/pgpool2/pcp/libpcp_ext.h +250 -0
- data/pgpool2/pcp/md5.c +444 -0
- data/pgpool2/pcp/md5.h +28 -0
- data/pgpool2/pcp/pcp.c +1652 -0
- data/pgpool2/pcp/pcp.h +61 -0
- data/pgpool2/pcp/pcp_attach_node.c +172 -0
- data/pgpool2/pcp/pcp_detach_node.c +185 -0
- data/pgpool2/pcp/pcp_error.c +87 -0
- data/pgpool2/pcp/pcp_node_count.c +160 -0
- data/pgpool2/pcp/pcp_node_info.c +198 -0
- data/pgpool2/pcp/pcp_pool_status.c +166 -0
- data/pgpool2/pcp/pcp_proc_count.c +166 -0
- data/pgpool2/pcp/pcp_proc_info.c +261 -0
- data/pgpool2/pcp/pcp_promote_node.c +185 -0
- data/pgpool2/pcp/pcp_recovery_node.c +172 -0
- data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
- data/pgpool2/pcp/pcp_stream.c +385 -0
- data/pgpool2/pcp/pcp_stream.h +52 -0
- data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
- data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
- data/pgpool2/pcp_child.c +1493 -0
- data/pgpool2/pg_md5.c +305 -0
- data/pgpool2/pgpool.8.in +121 -0
- data/pgpool2/pgpool.conf +553 -0
- data/pgpool2/pgpool.conf.sample +666 -0
- data/pgpool2/pgpool.conf.sample-master-slave +665 -0
- data/pgpool2/pgpool.conf.sample-replication +664 -0
- data/pgpool2/pgpool.conf.sample-stream +664 -0
- data/pgpool2/pgpool.spec +264 -0
- data/pgpool2/pgpool_adm/TODO +7 -0
- data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
- data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
- data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
- data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
- data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
- data/pgpool2/pool.h +655 -0
- data/pgpool2/pool_auth.c +1390 -0
- data/pgpool2/pool_config.c +5007 -0
- data/pgpool2/pool_config.h +284 -0
- data/pgpool2/pool_config.l +3281 -0
- data/pgpool2/pool_config_md5.c +29 -0
- data/pgpool2/pool_connection_pool.c +812 -0
- data/pgpool2/pool_error.c +242 -0
- data/pgpool2/pool_globals.c +27 -0
- data/pgpool2/pool_hba.c +1723 -0
- data/pgpool2/pool_hba.conf.sample +67 -0
- data/pgpool2/pool_ip.c +567 -0
- data/pgpool2/pool_ip.h +65 -0
- data/pgpool2/pool_ipc.h +38 -0
- data/pgpool2/pool_lobj.c +242 -0
- data/pgpool2/pool_lobj.h +32 -0
- data/pgpool2/pool_memqcache.c +3818 -0
- data/pgpool2/pool_memqcache.h +268 -0
- data/pgpool2/pool_params.c +163 -0
- data/pgpool2/pool_passwd.c +249 -0
- data/pgpool2/pool_passwd.h +41 -0
- data/pgpool2/pool_path.c +193 -0
- data/pgpool2/pool_path.h +81 -0
- data/pgpool2/pool_process_context.c +247 -0
- data/pgpool2/pool_process_context.h +62 -0
- data/pgpool2/pool_process_query.c +5001 -0
- data/pgpool2/pool_process_reporting.c +1671 -0
- data/pgpool2/pool_process_reporting.h +44 -0
- data/pgpool2/pool_proto2.c +671 -0
- data/pgpool2/pool_proto_modules.c +3524 -0
- data/pgpool2/pool_proto_modules.h +185 -0
- data/pgpool2/pool_query_cache.c +1020 -0
- data/pgpool2/pool_query_context.c +1871 -0
- data/pgpool2/pool_query_context.h +105 -0
- data/pgpool2/pool_relcache.c +284 -0
- data/pgpool2/pool_relcache.h +78 -0
- data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
- data/pgpool2/pool_rewrite_query.c +715 -0
- data/pgpool2/pool_rewrite_query.h +192 -0
- data/pgpool2/pool_select_walker.c +1150 -0
- data/pgpool2/pool_select_walker.h +68 -0
- data/pgpool2/pool_sema.c +161 -0
- data/pgpool2/pool_session_context.c +952 -0
- data/pgpool2/pool_session_context.h +203 -0
- data/pgpool2/pool_shmem.c +185 -0
- data/pgpool2/pool_signal.c +158 -0
- data/pgpool2/pool_signal.h +61 -0
- data/pgpool2/pool_ssl.c +339 -0
- data/pgpool2/pool_stream.c +962 -0
- data/pgpool2/pool_stream.h +61 -0
- data/pgpool2/pool_system.c +659 -0
- data/pgpool2/pool_timestamp.c +1215 -0
- data/pgpool2/pool_timestamp.h +38 -0
- data/pgpool2/pool_type.h +171 -0
- data/pgpool2/pool_worker_child.c +384 -0
- data/pgpool2/ps_status.c +404 -0
- data/pgpool2/recovery.c +435 -0
- data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
- data/pgpool2/redhat/pgpool.init +201 -0
- data/pgpool2/redhat/pgpool.sysconfig +7 -0
- data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
- data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
- data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
- data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
- data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
- data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
- data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
- data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
- data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
- data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
- data/pgpool2/sample/dist_def_pgbench.sql +73 -0
- data/pgpool2/sample/pgpool.pam +3 -0
- data/pgpool2/sample/pgpool_recovery +20 -0
- data/pgpool2/sample/pgpool_recovery_pitr +19 -0
- data/pgpool2/sample/pgpool_remote_start +13 -0
- data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
- data/pgpool2/sql/insert_lock.sql +15 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
- data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
- data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
- data/pgpool2/sql/system_db.sql +38 -0
- data/pgpool2/strlcpy.c +85 -0
- data/pgpool2/test/C/test_extended.c +98 -0
- data/pgpool2/test/jdbc/.cvsignore +2 -0
- data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
- data/pgpool2/test/jdbc/BatchTest.java +55 -0
- data/pgpool2/test/jdbc/ColumnTest.java +60 -0
- data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
- data/pgpool2/test/jdbc/InsertTest.java +34 -0
- data/pgpool2/test/jdbc/LockTest.java +36 -0
- data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
- data/pgpool2/test/jdbc/README.euc_jp +73 -0
- data/pgpool2/test/jdbc/RunTest.java +83 -0
- data/pgpool2/test/jdbc/SelectTest.java +37 -0
- data/pgpool2/test/jdbc/UpdateTest.java +32 -0
- data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
- data/pgpool2/test/jdbc/expected/autocommit +10 -0
- data/pgpool2/test/jdbc/expected/batch +1 -0
- data/pgpool2/test/jdbc/expected/column +100 -0
- data/pgpool2/test/jdbc/expected/insert +1 -0
- data/pgpool2/test/jdbc/expected/lock +100 -0
- data/pgpool2/test/jdbc/expected/select +2 -0
- data/pgpool2/test/jdbc/expected/update +1 -0
- data/pgpool2/test/jdbc/pgpool.properties +7 -0
- data/pgpool2/test/jdbc/prepare.sql +54 -0
- data/pgpool2/test/jdbc/run.sh +6 -0
- data/pgpool2/test/parser/.cvsignore +6 -0
- data/pgpool2/test/parser/README +32 -0
- data/pgpool2/test/parser/expected/copy.out +17 -0
- data/pgpool2/test/parser/expected/create.out +64 -0
- data/pgpool2/test/parser/expected/cursor.out +37 -0
- data/pgpool2/test/parser/expected/delete.out +10 -0
- data/pgpool2/test/parser/expected/drop.out +12 -0
- data/pgpool2/test/parser/expected/insert.out +13 -0
- data/pgpool2/test/parser/expected/misc.out +28 -0
- data/pgpool2/test/parser/expected/prepare.out +4 -0
- data/pgpool2/test/parser/expected/privileges.out +31 -0
- data/pgpool2/test/parser/expected/scanner.out +30 -0
- data/pgpool2/test/parser/expected/select.out +89 -0
- data/pgpool2/test/parser/expected/transaction.out +38 -0
- data/pgpool2/test/parser/expected/update.out +11 -0
- data/pgpool2/test/parser/expected/v84.out +37 -0
- data/pgpool2/test/parser/expected/v90.out +25 -0
- data/pgpool2/test/parser/expected/var.out +22 -0
- data/pgpool2/test/parser/input/alter.sql +2 -0
- data/pgpool2/test/parser/input/copy.sql +17 -0
- data/pgpool2/test/parser/input/create.sql +64 -0
- data/pgpool2/test/parser/input/cursor.sql +37 -0
- data/pgpool2/test/parser/input/delete.sql +10 -0
- data/pgpool2/test/parser/input/drop.sql +12 -0
- data/pgpool2/test/parser/input/insert.sql +13 -0
- data/pgpool2/test/parser/input/misc.sql +28 -0
- data/pgpool2/test/parser/input/prepare.sql +4 -0
- data/pgpool2/test/parser/input/privileges.sql +31 -0
- data/pgpool2/test/parser/input/scanner.sql +34 -0
- data/pgpool2/test/parser/input/select.sql +89 -0
- data/pgpool2/test/parser/input/transaction.sql +38 -0
- data/pgpool2/test/parser/input/update.sql +11 -0
- data/pgpool2/test/parser/input/v84.sql +37 -0
- data/pgpool2/test/parser/input/v90.sql +38 -0
- data/pgpool2/test/parser/input/var.sql +22 -0
- data/pgpool2/test/parser/main.c +96 -0
- data/pgpool2/test/parser/parse_schedule +16 -0
- data/pgpool2/test/parser/pool.h +13 -0
- data/pgpool2/test/parser/run-test +62 -0
- data/pgpool2/test/pdo-test/README.euc_jp +58 -0
- data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
- data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
- data/pgpool2/test/pdo-test/collections.inc +11 -0
- data/pgpool2/test/pdo-test/def.inc +7 -0
- data/pgpool2/test/pdo-test/log.txt +0 -0
- data/pgpool2/test/pdo-test/mod/database.inc +36 -0
- data/pgpool2/test/pdo-test/mod/def.inc +0 -0
- data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
- data/pgpool2/test/pdo-test/pdotest.php +11 -0
- data/pgpool2/test/pdo-test/regsql.inc +56 -0
- data/pgpool2/test/pgpool_setup +898 -0
- data/pgpool2/test/regression/README +39 -0
- data/pgpool2/test/regression/clean.sh +21 -0
- data/pgpool2/test/regression/libs.sh +16 -0
- data/pgpool2/test/regression/regress.sh +166 -0
- data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
- data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
- data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
- data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
- data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
- data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
- data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
- data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
- data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
- data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
- data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
- data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
- data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
- data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
- data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
- data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
- data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
- data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
- data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
- data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
- data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
- data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
- data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
- data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
- data/pgpool2/test/timestamp/expected/insert.out +16 -0
- data/pgpool2/test/timestamp/expected/misc.out +3 -0
- data/pgpool2/test/timestamp/expected/update.out +6 -0
- data/pgpool2/test/timestamp/input/insert.sql +16 -0
- data/pgpool2/test/timestamp/input/misc.sql +3 -0
- data/pgpool2/test/timestamp/input/update.sql +6 -0
- data/pgpool2/test/timestamp/main.c +129 -0
- data/pgpool2/test/timestamp/parse_schedule +3 -0
- data/pgpool2/test/timestamp/run-test +69 -0
- data/pgpool2/version.h +1 -0
- data/pgpool2/watchdog/Makefile.am +17 -0
- data/pgpool2/watchdog/Makefile.in +505 -0
- data/pgpool2/watchdog/test/stab.c +266 -0
- data/pgpool2/watchdog/test/test.c +85 -0
- data/pgpool2/watchdog/test/wd_child_t.c +87 -0
- data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
- data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
- data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
- data/pgpool2/watchdog/watchdog.c +408 -0
- data/pgpool2/watchdog/watchdog.h +209 -0
- data/pgpool2/watchdog/wd_child.c +444 -0
- data/pgpool2/watchdog/wd_ext.h +123 -0
- data/pgpool2/watchdog/wd_heartbeat.c +577 -0
- data/pgpool2/watchdog/wd_if.c +216 -0
- data/pgpool2/watchdog/wd_init.c +126 -0
- data/pgpool2/watchdog/wd_interlock.c +347 -0
- data/pgpool2/watchdog/wd_lifecheck.c +512 -0
- data/pgpool2/watchdog/wd_list.c +429 -0
- data/pgpool2/watchdog/wd_packet.c +1159 -0
- data/pgpool2/watchdog/wd_ping.c +330 -0
- data/pgpool2/ylwrap +223 -0
- data/pgsql/presto_client.py +346 -0
- data/pgsql/prestogres.py +156 -0
- data/pgsql/setup_functions.sql +21 -0
- data/pgsql/setup_language.sql +3 -0
- data/prestogres.gemspec +23 -0
- metadata +496 -0
|
@@ -0,0 +1,44 @@
|
|
|
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-2012 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_process_reporting.h.: header file for pool_process_reporting.c
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
#ifndef POOL_PROCESS_REPORTING_H
|
|
27
|
+
#define POOL_PROCESS_REPORTING_H
|
|
28
|
+
|
|
29
|
+
extern void send_row_description(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend,
|
|
30
|
+
short num_fields, char **field_names);
|
|
31
|
+
extern void send_complete_and_ready(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, const int num_rows);
|
|
32
|
+
extern POOL_REPORT_CONFIG* get_config(int *nrows);
|
|
33
|
+
extern POOL_REPORT_POOLS* get_pools(int *nrows);
|
|
34
|
+
extern POOL_REPORT_PROCESSES* get_processes(int *nrows);
|
|
35
|
+
extern POOL_REPORT_NODES* get_nodes(int *nrows);
|
|
36
|
+
extern POOL_REPORT_VERSION* get_version(void);
|
|
37
|
+
extern void config_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
38
|
+
extern void pools_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
39
|
+
extern void processes_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
40
|
+
extern void nodes_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
41
|
+
extern void version_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
42
|
+
extern void cache_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend);
|
|
43
|
+
|
|
44
|
+
#endif
|
|
@@ -0,0 +1,671 @@
|
|
|
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
|
+
*---------------------------------------------------------------------
|
|
22
|
+
* pool_proto2.c: modules corresponding to protocol 2.0.
|
|
23
|
+
* used by pool_process_query()
|
|
24
|
+
*---------------------------------------------------------------------
|
|
25
|
+
*/
|
|
26
|
+
#include <stdlib.h>
|
|
27
|
+
#include <string.h>
|
|
28
|
+
#include <netinet/in.h>
|
|
29
|
+
|
|
30
|
+
#include "pool.h"
|
|
31
|
+
#include "pool_config.h"
|
|
32
|
+
#include "pool_proto_modules.h"
|
|
33
|
+
#include "pool_stream.h"
|
|
34
|
+
|
|
35
|
+
POOL_STATUS AsciiRow(POOL_CONNECTION *frontend,
|
|
36
|
+
POOL_CONNECTION_POOL *backend,
|
|
37
|
+
short num_fields)
|
|
38
|
+
{
|
|
39
|
+
static char nullmap[8192], nullmap1[8192];
|
|
40
|
+
int nbytes;
|
|
41
|
+
int i, j;
|
|
42
|
+
unsigned char mask;
|
|
43
|
+
int size, size1 = 0;
|
|
44
|
+
char *buf = NULL, *sendbuf = NULL;
|
|
45
|
+
char msgbuf[1024];
|
|
46
|
+
|
|
47
|
+
pool_write(frontend, "D", 1);
|
|
48
|
+
|
|
49
|
+
nbytes = (num_fields + 7)/8;
|
|
50
|
+
|
|
51
|
+
if (nbytes <= 0)
|
|
52
|
+
return POOL_CONTINUE;
|
|
53
|
+
|
|
54
|
+
/* NULL map */
|
|
55
|
+
pool_read(MASTER(backend), nullmap, nbytes);
|
|
56
|
+
memcpy(nullmap1, nullmap, nbytes);
|
|
57
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
58
|
+
{
|
|
59
|
+
if (VALID_BACKEND(i) && !IS_MASTER_NODE_ID(i))
|
|
60
|
+
{
|
|
61
|
+
pool_read(CONNECTION(backend, i), nullmap, nbytes);
|
|
62
|
+
if (memcmp(nullmap, nullmap1, nbytes))
|
|
63
|
+
{
|
|
64
|
+
/* XXX: NULLMAP maybe different among
|
|
65
|
+
backends. If we were a paranoid, we have to treat
|
|
66
|
+
this as a fatal error. However in the real world
|
|
67
|
+
we'd better to adapt this situation. Just throw a
|
|
68
|
+
log... */
|
|
69
|
+
pool_debug("AsciiRow: NULLMAP differ between master and %d th backend", i);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (pool_write(frontend, nullmap1, nbytes) < 0)
|
|
75
|
+
return POOL_END;
|
|
76
|
+
|
|
77
|
+
mask = 0;
|
|
78
|
+
|
|
79
|
+
for (i = 0;i<num_fields;i++)
|
|
80
|
+
{
|
|
81
|
+
if (mask == 0)
|
|
82
|
+
mask = 0x80;
|
|
83
|
+
|
|
84
|
+
/* NOT NULL? */
|
|
85
|
+
if (mask & nullmap[i/8])
|
|
86
|
+
{
|
|
87
|
+
/* field size */
|
|
88
|
+
if (pool_read(MASTER(backend), &size, sizeof(int)) < 0)
|
|
89
|
+
return POOL_END;
|
|
90
|
+
|
|
91
|
+
size1 = ntohl(size) - 4;
|
|
92
|
+
|
|
93
|
+
/* read and send actual data only when size > 0 */
|
|
94
|
+
if (size1 > 0)
|
|
95
|
+
{
|
|
96
|
+
sendbuf = pool_read2(MASTER(backend), size1);
|
|
97
|
+
if (sendbuf == NULL)
|
|
98
|
+
return POOL_END;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* forward to frontend */
|
|
102
|
+
pool_write(frontend, &size, sizeof(int));
|
|
103
|
+
pool_write(frontend, sendbuf, size1);
|
|
104
|
+
snprintf(msgbuf, Min(sizeof(msgbuf), size1+1), "%s", sendbuf);
|
|
105
|
+
pool_debug("AsciiRow: len: %d data: %s", size1, msgbuf);
|
|
106
|
+
|
|
107
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
108
|
+
{
|
|
109
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
110
|
+
{
|
|
111
|
+
/* field size */
|
|
112
|
+
if (pool_read(CONNECTION(backend, j), &size, sizeof(int)) < 0)
|
|
113
|
+
return POOL_END;
|
|
114
|
+
|
|
115
|
+
buf = NULL;
|
|
116
|
+
size = ntohl(size) - 4;
|
|
117
|
+
|
|
118
|
+
/* XXX: field size maybe different among
|
|
119
|
+
backends. If we were a paranoid, we have to treat
|
|
120
|
+
this as a fatal error. However in the real world
|
|
121
|
+
we'd better to adapt this situation. Just throw a
|
|
122
|
+
log... */
|
|
123
|
+
if (size != size1)
|
|
124
|
+
pool_debug("AsciiRow: %d th field size does not match between master(%d) and %d th backend(%d)",
|
|
125
|
+
i, ntohl(size), j, ntohl(size1));
|
|
126
|
+
|
|
127
|
+
/* read and send actual data only when size > 0 */
|
|
128
|
+
if (size > 0)
|
|
129
|
+
{
|
|
130
|
+
buf = pool_read2(CONNECTION(backend, j), size);
|
|
131
|
+
if (buf == NULL)
|
|
132
|
+
return POOL_END;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
mask >>= 1;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (pool_flush(frontend))
|
|
142
|
+
return POOL_END;
|
|
143
|
+
|
|
144
|
+
return POOL_CONTINUE;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
POOL_STATUS BinaryRow(POOL_CONNECTION *frontend,
|
|
148
|
+
POOL_CONNECTION_POOL *backend,
|
|
149
|
+
short num_fields)
|
|
150
|
+
{
|
|
151
|
+
static char nullmap[8192], nullmap1[8192];
|
|
152
|
+
int nbytes;
|
|
153
|
+
int i, j;
|
|
154
|
+
unsigned char mask;
|
|
155
|
+
int size, size1 = 0;
|
|
156
|
+
char *buf = NULL;
|
|
157
|
+
|
|
158
|
+
pool_write(frontend, "B", 1);
|
|
159
|
+
|
|
160
|
+
nbytes = (num_fields + 7)/8;
|
|
161
|
+
|
|
162
|
+
if (nbytes <= 0)
|
|
163
|
+
return POOL_CONTINUE;
|
|
164
|
+
|
|
165
|
+
/* NULL map */
|
|
166
|
+
pool_read(MASTER(backend), nullmap, nbytes);
|
|
167
|
+
if (pool_write(frontend, nullmap, nbytes) < 0)
|
|
168
|
+
return POOL_END;
|
|
169
|
+
memcpy(nullmap1, nullmap, nbytes);
|
|
170
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
171
|
+
{
|
|
172
|
+
if (VALID_BACKEND(i) && !IS_MASTER_NODE_ID(i))
|
|
173
|
+
{
|
|
174
|
+
pool_read(CONNECTION(backend, i), nullmap, nbytes);
|
|
175
|
+
if (memcmp(nullmap, nullmap1, nbytes))
|
|
176
|
+
{
|
|
177
|
+
/* XXX: NULLMAP maybe different among
|
|
178
|
+
backends. If we were a paranoid, we have to treat
|
|
179
|
+
this as a fatal error. However in the real world
|
|
180
|
+
we'd better to adapt this situation. Just throw a
|
|
181
|
+
log... */
|
|
182
|
+
pool_debug("BinaryRow: NULLMAP differ between master and %d th backend", i);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
mask = 0;
|
|
188
|
+
|
|
189
|
+
for (i = 0;i<num_fields;i++)
|
|
190
|
+
{
|
|
191
|
+
if (mask == 0)
|
|
192
|
+
mask = 0x80;
|
|
193
|
+
|
|
194
|
+
/* NOT NULL? */
|
|
195
|
+
if (mask & nullmap[i/8])
|
|
196
|
+
{
|
|
197
|
+
/* field size */
|
|
198
|
+
if (pool_read(MASTER(backend), &size, sizeof(int)) < 0)
|
|
199
|
+
return POOL_END;
|
|
200
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
201
|
+
{
|
|
202
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
203
|
+
{
|
|
204
|
+
/* field size */
|
|
205
|
+
if (pool_read(CONNECTION(backend, i), &size, sizeof(int)) < 0)
|
|
206
|
+
return POOL_END;
|
|
207
|
+
|
|
208
|
+
/* XXX: field size maybe different among
|
|
209
|
+
backends. If we were a paranoid, we have to treat
|
|
210
|
+
this as a fatal error. However in the real world
|
|
211
|
+
we'd better to adapt this situation. Just throw a
|
|
212
|
+
log... */
|
|
213
|
+
if (size != size1)
|
|
214
|
+
pool_debug("BinaryRow: %d th field size does not match between master(%d) and %d th backend(%d)",
|
|
215
|
+
i, ntohl(size), j, ntohl(size1));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
buf = NULL;
|
|
219
|
+
|
|
220
|
+
/* forward to frontend */
|
|
221
|
+
if (IS_MASTER_NODE_ID(j))
|
|
222
|
+
pool_write(frontend, &size, sizeof(int));
|
|
223
|
+
size = ntohl(size) - 4;
|
|
224
|
+
|
|
225
|
+
/* read and send actual data only when size > 0 */
|
|
226
|
+
if (size > 0)
|
|
227
|
+
{
|
|
228
|
+
buf = pool_read2(CONNECTION(backend, j), size);
|
|
229
|
+
if (buf == NULL)
|
|
230
|
+
return POOL_END;
|
|
231
|
+
|
|
232
|
+
if (IS_MASTER_NODE_ID(j))
|
|
233
|
+
{
|
|
234
|
+
pool_write(frontend, buf, size);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
mask >>= 1;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (pool_flush(frontend))
|
|
244
|
+
return POOL_END;
|
|
245
|
+
|
|
246
|
+
return POOL_CONTINUE;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
POOL_STATUS CompletedResponse(POOL_CONNECTION *frontend,
|
|
250
|
+
POOL_CONNECTION_POOL *backend)
|
|
251
|
+
{
|
|
252
|
+
int i;
|
|
253
|
+
char *string = NULL;
|
|
254
|
+
char *string1 = NULL;
|
|
255
|
+
int len, len1 = 0;
|
|
256
|
+
|
|
257
|
+
/* read command tag */
|
|
258
|
+
string = pool_read_string(MASTER(backend), &len, 0);
|
|
259
|
+
if (string == NULL)
|
|
260
|
+
return POOL_END;
|
|
261
|
+
else if (!strncmp(string, "BEGIN", 5))
|
|
262
|
+
TSTATE(backend, MASTER_NODE_ID) = 'T';
|
|
263
|
+
else if (!strncmp(string, "COMMIT", 6) || !strncmp(string, "ROLLBACK", 8))
|
|
264
|
+
TSTATE(backend, MASTER_NODE_ID) = 'I';
|
|
265
|
+
|
|
266
|
+
len1 = len;
|
|
267
|
+
string1 = strdup(string);
|
|
268
|
+
|
|
269
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
270
|
+
{
|
|
271
|
+
if (!VALID_BACKEND(i) || IS_MASTER_NODE_ID(i))
|
|
272
|
+
continue;
|
|
273
|
+
|
|
274
|
+
/* read command tag */
|
|
275
|
+
string = pool_read_string(CONNECTION(backend, i), &len, 0);
|
|
276
|
+
if (string == NULL)
|
|
277
|
+
return POOL_END;
|
|
278
|
+
else if (!strncmp(string, "BEGIN", 5))
|
|
279
|
+
TSTATE(backend, i) = 'T';
|
|
280
|
+
else if (!strncmp(string, "COMMIT", 6) || !strncmp(string, "ROLLBACK", 8))
|
|
281
|
+
TSTATE(backend, i) = 'I';
|
|
282
|
+
|
|
283
|
+
if (len != len1)
|
|
284
|
+
{
|
|
285
|
+
pool_debug("CompletedResponse: message length does not match between master(%d \"%s\",) and %d th server (%d \"%s\",)",
|
|
286
|
+
len, string, i, len1, string1);
|
|
287
|
+
|
|
288
|
+
/* we except INSERT, because INSERT response has OID */
|
|
289
|
+
if (strncmp(string1, "INSERT", 6))
|
|
290
|
+
{
|
|
291
|
+
free(string1);
|
|
292
|
+
return POOL_END;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/* forward to the frontend */
|
|
297
|
+
pool_write(frontend, "C", 1);
|
|
298
|
+
pool_debug("CompletedResponse: string: \"%s\"", string1);
|
|
299
|
+
if (pool_write(frontend, string1, len1) < 0)
|
|
300
|
+
{
|
|
301
|
+
free(string1);
|
|
302
|
+
return POOL_END;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
free(string1);
|
|
306
|
+
return pool_flush(frontend);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
POOL_STATUS CursorResponse(POOL_CONNECTION *frontend,
|
|
310
|
+
POOL_CONNECTION_POOL *backend)
|
|
311
|
+
{
|
|
312
|
+
char *string = NULL;
|
|
313
|
+
char *string1 = NULL;
|
|
314
|
+
int len, len1 = 0;
|
|
315
|
+
int i;
|
|
316
|
+
|
|
317
|
+
/* read cursor name */
|
|
318
|
+
string = pool_read_string(MASTER(backend), &len, 0);
|
|
319
|
+
if (string == NULL)
|
|
320
|
+
return POOL_END;
|
|
321
|
+
len1 = len;
|
|
322
|
+
string1 = strdup(string);
|
|
323
|
+
|
|
324
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
325
|
+
{
|
|
326
|
+
if (VALID_BACKEND(i) && !IS_MASTER_NODE_ID(i))
|
|
327
|
+
{
|
|
328
|
+
/* read cursor name */
|
|
329
|
+
string = pool_read_string(CONNECTION(backend, i), &len, 0);
|
|
330
|
+
if (string == NULL)
|
|
331
|
+
return POOL_END;
|
|
332
|
+
if (len != len1)
|
|
333
|
+
{
|
|
334
|
+
pool_error("CursorResponse: length does not match between master(%d) and %d th backend(%d)",
|
|
335
|
+
len, i, len1);
|
|
336
|
+
pool_error("CursorResponse: master(%s) %d th backend(%s)", string1, i, string);
|
|
337
|
+
free(string1);
|
|
338
|
+
return POOL_END;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/* forward to the frontend */
|
|
344
|
+
pool_write(frontend, "P", 1);
|
|
345
|
+
if (pool_write(frontend, string1, len1) < 0)
|
|
346
|
+
{
|
|
347
|
+
free(string1);
|
|
348
|
+
return POOL_END;
|
|
349
|
+
}
|
|
350
|
+
free(string1);
|
|
351
|
+
|
|
352
|
+
if (pool_flush(frontend))
|
|
353
|
+
return POOL_END;
|
|
354
|
+
|
|
355
|
+
return POOL_CONTINUE;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
POOL_STATUS EmptyQueryResponse(POOL_CONNECTION *frontend,
|
|
359
|
+
POOL_CONNECTION_POOL *backend)
|
|
360
|
+
{
|
|
361
|
+
char c;
|
|
362
|
+
int i;
|
|
363
|
+
|
|
364
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
365
|
+
{
|
|
366
|
+
if (VALID_BACKEND(i))
|
|
367
|
+
{
|
|
368
|
+
if (pool_read(CONNECTION(backend, i), &c, sizeof(c)) < 0)
|
|
369
|
+
return POOL_END;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
pool_write(frontend, "I", 1);
|
|
374
|
+
return pool_write_and_flush(frontend, "", 1);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
POOL_STATUS ErrorResponse(POOL_CONNECTION *frontend,
|
|
378
|
+
POOL_CONNECTION_POOL *backend)
|
|
379
|
+
{
|
|
380
|
+
char *string = NULL;
|
|
381
|
+
int len;
|
|
382
|
+
int i;
|
|
383
|
+
POOL_STATUS ret = POOL_CONTINUE;
|
|
384
|
+
|
|
385
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
386
|
+
{
|
|
387
|
+
if (VALID_BACKEND(i))
|
|
388
|
+
{
|
|
389
|
+
/* read error message */
|
|
390
|
+
string = pool_read_string(CONNECTION(backend, i), &len, 0);
|
|
391
|
+
if (string == NULL)
|
|
392
|
+
return POOL_END;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* forward to the frontend */
|
|
397
|
+
pool_write(frontend, "E", 1);
|
|
398
|
+
if (pool_write_and_flush(frontend, string, len) < 0)
|
|
399
|
+
return POOL_END;
|
|
400
|
+
|
|
401
|
+
/*
|
|
402
|
+
* check session context, because this function is called
|
|
403
|
+
* by pool_do_auth too.
|
|
404
|
+
*/
|
|
405
|
+
if (pool_get_session_context())
|
|
406
|
+
ret = raise_intentional_error_if_need(backend);
|
|
407
|
+
|
|
408
|
+
/* change transaction state */
|
|
409
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
410
|
+
{
|
|
411
|
+
if (VALID_BACKEND(i))
|
|
412
|
+
{
|
|
413
|
+
if (TSTATE(backend, i) == 'T')
|
|
414
|
+
TSTATE(backend, i) = 'E';
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return ret;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
POOL_STATUS FunctionResultResponse(POOL_CONNECTION *frontend,
|
|
422
|
+
POOL_CONNECTION_POOL *backend)
|
|
423
|
+
{
|
|
424
|
+
char dummy;
|
|
425
|
+
int len;
|
|
426
|
+
char *result = 0;
|
|
427
|
+
int i;
|
|
428
|
+
|
|
429
|
+
pool_write(frontend, "V", 1);
|
|
430
|
+
|
|
431
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
432
|
+
{
|
|
433
|
+
if (VALID_BACKEND(i))
|
|
434
|
+
{
|
|
435
|
+
if (pool_read(CONNECTION(backend, i), &dummy, 1) < 0)
|
|
436
|
+
return POOL_ERROR;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
pool_write(frontend, &dummy, 1);
|
|
440
|
+
|
|
441
|
+
/* non empty result? */
|
|
442
|
+
if (dummy == 'G')
|
|
443
|
+
{
|
|
444
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
445
|
+
{
|
|
446
|
+
if (VALID_BACKEND(i))
|
|
447
|
+
{
|
|
448
|
+
/* length of result in bytes */
|
|
449
|
+
if (pool_read(CONNECTION(backend, i), &len, sizeof(len)) < 0)
|
|
450
|
+
return POOL_ERROR;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
pool_write(frontend, &len, sizeof(len));
|
|
454
|
+
|
|
455
|
+
len = ntohl(len);
|
|
456
|
+
|
|
457
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
458
|
+
{
|
|
459
|
+
if (VALID_BACKEND(i))
|
|
460
|
+
{
|
|
461
|
+
/* result value itself */
|
|
462
|
+
if ((result = pool_read2(MASTER(backend), len)) == NULL)
|
|
463
|
+
return POOL_ERROR;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
pool_write(frontend, result, len);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
470
|
+
{
|
|
471
|
+
if (VALID_BACKEND(i))
|
|
472
|
+
{
|
|
473
|
+
/* unused ('0') */
|
|
474
|
+
if (pool_read(MASTER(backend), &dummy, 1) < 0)
|
|
475
|
+
return POOL_ERROR;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
pool_write(frontend, "0", 1);
|
|
479
|
+
|
|
480
|
+
return pool_flush(frontend);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
POOL_STATUS NoticeResponse(POOL_CONNECTION *frontend,
|
|
484
|
+
POOL_CONNECTION_POOL *backend)
|
|
485
|
+
{
|
|
486
|
+
char *string = NULL;
|
|
487
|
+
int len;
|
|
488
|
+
int i;
|
|
489
|
+
|
|
490
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
491
|
+
{
|
|
492
|
+
if (VALID_BACKEND(i))
|
|
493
|
+
{
|
|
494
|
+
/* read notice message */
|
|
495
|
+
string = pool_read_string(CONNECTION(backend, i), &len, 0);
|
|
496
|
+
if (string == NULL)
|
|
497
|
+
return POOL_END;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* forward to the frontend */
|
|
502
|
+
pool_write(frontend, "N", 1);
|
|
503
|
+
if (pool_write_and_flush(frontend, string, len) < 0)
|
|
504
|
+
{
|
|
505
|
+
return POOL_END;
|
|
506
|
+
}
|
|
507
|
+
return POOL_CONTINUE;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
POOL_STATUS NotificationResponse(POOL_CONNECTION *frontend,
|
|
511
|
+
POOL_CONNECTION_POOL *backend)
|
|
512
|
+
{
|
|
513
|
+
int pid, pid1;
|
|
514
|
+
char *condition, *condition1 = NULL;
|
|
515
|
+
int len, len1 = 0;
|
|
516
|
+
int i;
|
|
517
|
+
POOL_STATUS status;
|
|
518
|
+
|
|
519
|
+
pool_write(frontend, "A", 1);
|
|
520
|
+
|
|
521
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
522
|
+
{
|
|
523
|
+
if (VALID_BACKEND(i))
|
|
524
|
+
{
|
|
525
|
+
if (pool_read(CONNECTION(backend, i), &pid, sizeof(pid)) < 0)
|
|
526
|
+
return POOL_ERROR;
|
|
527
|
+
condition = pool_read_string(CONNECTION(backend, i), &len, 0);
|
|
528
|
+
if (condition == NULL)
|
|
529
|
+
return POOL_END;
|
|
530
|
+
|
|
531
|
+
if (IS_MASTER_NODE_ID(i))
|
|
532
|
+
{
|
|
533
|
+
pid1 = pid;
|
|
534
|
+
len1 = len;
|
|
535
|
+
condition1 = strdup(condition);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
pool_write(frontend, &pid1, sizeof(pid1));
|
|
541
|
+
status = pool_write_and_flush(frontend, condition1, len1);
|
|
542
|
+
free(condition1);
|
|
543
|
+
return status;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
int RowDescription(POOL_CONNECTION *frontend,
|
|
547
|
+
POOL_CONNECTION_POOL *backend,
|
|
548
|
+
short *result)
|
|
549
|
+
{
|
|
550
|
+
short num_fields, num_fields1 = 0;
|
|
551
|
+
int oid, mod;
|
|
552
|
+
int oid1, mod1;
|
|
553
|
+
short size, size1;
|
|
554
|
+
char *string;
|
|
555
|
+
int len, len1;
|
|
556
|
+
int i;
|
|
557
|
+
|
|
558
|
+
pool_read(MASTER(backend), &num_fields, sizeof(short));
|
|
559
|
+
num_fields1 = num_fields;
|
|
560
|
+
for (i=0;i<NUM_BACKENDS;i++)
|
|
561
|
+
{
|
|
562
|
+
if (VALID_BACKEND(i) && !IS_MASTER_NODE_ID(i))
|
|
563
|
+
{
|
|
564
|
+
/* # of fields (could be 0) */
|
|
565
|
+
pool_read(CONNECTION(backend, i), &num_fields, sizeof(short));
|
|
566
|
+
if (num_fields != num_fields1)
|
|
567
|
+
{
|
|
568
|
+
pool_error("RowDescription: num_fields does not match between backends master(%d) and %d th backend(%d)",
|
|
569
|
+
num_fields, i, num_fields1);
|
|
570
|
+
return POOL_FATAL;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/* forward it to the frontend */
|
|
576
|
+
pool_write(frontend, "T", 1);
|
|
577
|
+
pool_write(frontend, &num_fields, sizeof(short));
|
|
578
|
+
num_fields = ntohs(num_fields);
|
|
579
|
+
for (i = 0;i<num_fields;i++)
|
|
580
|
+
{
|
|
581
|
+
int j;
|
|
582
|
+
|
|
583
|
+
/* field name */
|
|
584
|
+
string = pool_read_string(MASTER(backend), &len, 0);
|
|
585
|
+
if (string == NULL)
|
|
586
|
+
return POOL_END;
|
|
587
|
+
len1 = len;
|
|
588
|
+
if (pool_write(frontend, string, len) < 0)
|
|
589
|
+
return POOL_END;
|
|
590
|
+
|
|
591
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
592
|
+
{
|
|
593
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
594
|
+
{
|
|
595
|
+
string = pool_read_string(CONNECTION(backend, j), &len, 0);
|
|
596
|
+
if (string == NULL)
|
|
597
|
+
return POOL_END;
|
|
598
|
+
|
|
599
|
+
if (len != len1)
|
|
600
|
+
{
|
|
601
|
+
pool_error("RowDescription: field length does not match between backends master(%d) and %d th backend(%d)",
|
|
602
|
+
ntohl(len), j, ntohl(len1));
|
|
603
|
+
return POOL_FATAL;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/* type oid */
|
|
609
|
+
pool_read(MASTER(backend), &oid, sizeof(int));
|
|
610
|
+
oid1 = oid;
|
|
611
|
+
pool_debug("RowDescription: type oid: %d", ntohl(oid));
|
|
612
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
613
|
+
{
|
|
614
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
615
|
+
{
|
|
616
|
+
pool_read(CONNECTION(backend, j), &oid, sizeof(int));
|
|
617
|
+
|
|
618
|
+
/* we do not regard oid mismatch as fatal */
|
|
619
|
+
if (oid != oid1)
|
|
620
|
+
{
|
|
621
|
+
pool_debug("RowDescription: field oid does not match between backends master(%d) and %d th backend(%d)",
|
|
622
|
+
ntohl(oid), j, ntohl(oid1));
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
if (pool_write(frontend, &oid1, sizeof(int)) < 0)
|
|
627
|
+
return POOL_END;
|
|
628
|
+
|
|
629
|
+
/* size */
|
|
630
|
+
pool_read(MASTER(backend), &size, sizeof(short));
|
|
631
|
+
size1 = size;
|
|
632
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
633
|
+
{
|
|
634
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
635
|
+
{
|
|
636
|
+
pool_read(CONNECTION(backend, j), &size, sizeof(short));
|
|
637
|
+
if (size1 != size1)
|
|
638
|
+
{
|
|
639
|
+
pool_error("RowDescription: field size does not match between backends master(%d) and %d th backend(%d)",
|
|
640
|
+
ntohs(size), j, ntohs(size1));
|
|
641
|
+
return POOL_FATAL;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
pool_debug("RowDescription: field size: %d", ntohs(size));
|
|
646
|
+
pool_write(frontend, &size1, sizeof(short));
|
|
647
|
+
|
|
648
|
+
/* modifier */
|
|
649
|
+
pool_read(MASTER(backend), &mod, sizeof(int));
|
|
650
|
+
pool_debug("RowDescription: modifier: %d", ntohs(mod));
|
|
651
|
+
mod1 = mod;
|
|
652
|
+
for (j=0;j<NUM_BACKENDS;j++)
|
|
653
|
+
{
|
|
654
|
+
if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
|
|
655
|
+
{
|
|
656
|
+
pool_read(CONNECTION(backend, j), &mod, sizeof(int));
|
|
657
|
+
if (mod != mod1)
|
|
658
|
+
{
|
|
659
|
+
pool_debug("RowDescription: modifier does not match between backends master(%d) and %d th backend(%d)",
|
|
660
|
+
ntohl(mod), j, ntohl(mod1));
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
if (pool_write(frontend, &mod1, sizeof(int)) < 0)
|
|
665
|
+
return POOL_END;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
*result = num_fields;
|
|
669
|
+
|
|
670
|
+
return pool_flush(frontend);
|
|
671
|
+
}
|