[PHP-dev 124] [patch] pgsql async query

Yasuo Ohgaki php-dev@php.gr.jp
Sun, 25 Nov 2001 16:21:23 +0900


This is a multi-part message in MIME format.
--------------040502020805090406040704
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

Since I didn't get much comment/request, so I changed it the way I
like. (I'll use zend_parse_parameter() later, since existing
functions are not using it yet)

 - get rid of some functions and made easier to use async query
 - garbage collection at request shutdown
 - pg_send_query() changes mode to nonblocking internally
 - pg_is_busy() calls PQconsumeInput() internally

It's much easier to use now.

Aync Query Functions:
 - pg_send_query() - send query
 - pg_get_result() - get async query result
 - pg_is_busy() - executing async query or not
 - pg_request_cancel() - candel currently executing query

Misc Functions:
 - pg_reset() - reconnect to server. Useful when backend is died.
 - pg_status() - current connection status.

README, patch and test script is attached. (Make sure you use CGI
bin, set output_buffering=Off and edit database connection
parameter. There are some limitations in libpq. You may not be
able to execute query asyncronously)

Comments are welcome.

--
Yasuo Ohgaki

--------------040502020805090406040704
Content-Type: text/plain;
 name="pgsql_async.diff"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="pgsql_async.diff"

SW5kZXg6IHBnc3FsLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvcGhw
NC9leHQvcGdzcWwvcGdzcWwuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMzAKZGlmZiAt
dSAtcjEuMTMwIHBnc3FsLmMKLS0tIHBnc3FsLmMJMTEgT2N0IDIwMDEgMjM6MzM6NDAgLTAw
MDAJMS4xMzAKKysrIHBnc3FsLmMJMjUgTm92IDIwMDEgMDY6Mjg6MzYgLTAwMDAKQEAgLTk0
LDYgKzk0LDEyIEBACiAJUEhQX0ZBTElBUyhwZ19jbGllbnRlbmNvZGluZywJCXBnX2NsaWVu
dF9lbmNvZGluZywJCQlOVUxMKQogCVBIUF9GQUxJQVMocGdfc2V0Y2xpZW50ZW5jb2Rpbmcs
CXBnX3NldF9jbGllbnRfZW5jb2RpbmcsCU5VTEwpCiAjZW5kaWYKKwlQSFBfRkUocGdfcmVz
ZXQsCQkJCSBOVUxMKQorCVBIUF9GRShwZ19zdGF0dXMsCQkJCSBOVUxMKQorCVBIUF9GRShw
Z19zZW5kX3F1ZXJ5LAkJCSBOVUxMKQorCVBIUF9GRShwZ19yZXF1ZXN0X2NhbmNlbCwJCSBO
VUxMKQorCVBIUF9GRShwZ19nZXRfcmVzdWx0LAkJCSBOVUxMKQorCVBIUF9GRShwZ19pc19i
dXN5LAkJCQkgTlVMTCkKIAl7TlVMTCwgTlVMTCwgTlVMTH0KIH07CiAvKiB9fX0gKi8KQEAg
LTE0Nyw3ICsxNTMsMTcgQEAKIHN0YXRpYyB2b2lkIF9jbG9zZV9wZ3NxbF9saW5rKHplbmRf
cnNyY19saXN0X2VudHJ5ICpyc3JjIFRTUk1MU19EQykKIHsKIAlQR2Nvbm4gKmxpbmsgPSAo
UEdjb25uICopcnNyYy0+cHRyOworCVBHcmVzdWx0ICpyZXM7CiAKKwlQUXNldG5vbmJsb2Nr
aW5nKGxpbmssMSk7CisJaWYgKFBRaXNCdXN5KGxpbmspKSB7CisJCWlmICghUFFyZXF1ZXN0
Q2FuY2VsKGxpbmspKSB7CisJCQlwaHBfZXJyb3IoRV9XQVJOSU5HLCJQb3N0Z3JlU1FMOiBm
YWlsZWQgdG8gY2FuY2VsIHFldXJ5LiAlcyIsIFBRZXJyb3JNZXNzYWdlKGxpbmspKTsKKwkJ
fQorCX0KKwl3aGlsZSAoKHJlcyA9IFBRZ2V0UmVzdWx0KGxpbmspKSkgeworCQlQUWNsZWFy
KHJlcyk7CisJfQogCVBRZmluaXNoKGxpbmspOwogCVBHRyhudW1fbGlua3MpLS07CiB9CkBA
IC0xNTgsNyArMTc0LDE3IEBACiBzdGF0aWMgdm9pZCBfY2xvc2VfcGdzcWxfcGxpbmsoemVu
ZF9yc3JjX2xpc3RfZW50cnkgKnJzcmMgVFNSTUxTX0RDKQogewogCVBHY29ubiAqbGluayA9
IChQR2Nvbm4gKilyc3JjLT5wdHI7CisJUEdyZXN1bHQgKnJlczsKIAorCVBRc2V0bm9uYmxv
Y2tpbmcobGluaywxKTsKKwlpZiAoUFFpc0J1c3kobGluaykpIHsKKwkJaWYgKCFQUXJlcXVl
c3RDYW5jZWwobGluaykpIHsKKwkJCXBocF9lcnJvcihFX1dBUk5JTkcsIlBvc3RncmVTUUw6
IGZhaWxlZCB0byBjYW5jZWwgcWV1cnkuICVzIiwgUFFlcnJvck1lc3NhZ2UobGluaykpOwor
CQl9CisJfQorCXdoaWxlICgocmVzID0gUFFnZXRSZXN1bHQobGluaykpKSB7CisJCVBRY2xl
YXIocmVzKTsKKwl9CiAJUFFmaW5pc2gobGluayk7CiAJUEdHKG51bV9wZXJzaXN0ZW50KS0t
OwogCVBHRyhudW1fbGlua3MpLS07CkBAIC0xODcsMTIgKzIxMywyMiBAQAogc3RhdGljIGlu
dCBfcm9sbGJhY2tfdHJhbnNhY3Rpb25zKHplbmRfcnNyY19saXN0X2VudHJ5ICpyc3JjIFRT
Uk1MU19EQykKIHsKIAlQR2Nvbm4gKmxpbms7CisJUEdyZXN1bHQgKnJlczsKIAogCWlmICha
X1RZUEVfUChyc3JjKSAhPSBsZV9wbGluaykgCiAJCXJldHVybiAwOwogCiAJbGluayA9IChQ
R2Nvbm4gKikgcnNyYy0+cHRyOwogCQorCVBRc2V0bm9uYmxvY2tpbmcobGluaywxKTsKKwlp
ZiAoUFFpc0J1c3kobGluaykpIHsKKwkJaWYgKCFQUXJlcXVlc3RDYW5jZWwobGluaykpIHsK
KwkJCXBocF9lcnJvcihFX1dBUk5JTkcsIlBvc3RncmVTUUw6IGZhaWxlZCB0byBjYW5jZWwg
cWV1cnkuICVzIiwgUFFlcnJvck1lc3NhZ2UobGluaykpOworCQl9CisJfQorCXdoaWxlICgo
cmVzID0gUFFnZXRSZXN1bHQobGluaykpKSB7CisJCVBRY2xlYXIocmVzKTsKKwl9CiAJUEdH
KGlnbm9yZV9ub3RpY2VzKSA9IDE7CiAJUFFleGVjKGxpbmssIkJFR0lOO1JPTExCQUNLOyIp
OwogCVBHRyhpZ25vcmVfbm90aWNlcykgPSAwOwpAQCAtMjI2LDcgKzI2Miw3IEBACiBQSFBf
SU5JX0JFR0lOKCkKIAlTVERfUEhQX0lOSV9CT09MRUFOKCJwZ3NxbC5hbGxvd19wZXJzaXN0
ZW50IiwJIjEiLAlQSFBfSU5JX1NZU1RFTSwJCU9uVXBkYXRlSW50LAkJYWxsb3dfcGVyc2lz
dGVudCwJcGhwX3Bnc3FsX2dsb2JhbHMsCQlwZ3NxbF9nbG9iYWxzKQogCVNURF9QSFBfSU5J
X0VOVFJZX0VYKCJwZ3NxbC5tYXhfcGVyc2lzdGVudCIsCSItMSIsCVBIUF9JTklfU1lTVEVN
LAkJT25VcGRhdGVJbnQsCQltYXhfcGVyc2lzdGVudCwJCXBocF9wZ3NxbF9nbG9iYWxzLAkJ
cGdzcWxfZ2xvYmFscywJZGlzcGxheV9saW5rX251bWJlcnMpCi0JU1REX1BIUF9JTklfRU5U
UllfRVgoInBnc3FsLm1heF9saW5rcyIsCQkiLTEiLAlQSFBfSU5JX1NZU1RFTSwJCQlPblVw
ZGF0ZUludCwJCW1heF9saW5rcywJCQlwaHBfcGdzcWxfZ2xvYmFscywJCXBnc3FsX2dsb2Jh
bHMsCWRpc3BsYXlfbGlua19udW1iZXJzKQorCVNURF9QSFBfSU5JX0VOVFJZX0VYKCJwZ3Nx
bC5tYXhfbGlua3MiLAkJIi0xIiwJUEhQX0lOSV9TWVNURU0sCQlPblVwZGF0ZUludCwJCW1h
eF9saW5rcywJCQlwaHBfcGdzcWxfZ2xvYmFscywJCXBnc3FsX2dsb2JhbHMsCWRpc3BsYXlf
bGlua19udW1iZXJzKQogUEhQX0lOSV9FTkQoKQogLyogfX19ICovCiAKQEAgLTI2Miw2ICsy
OTgsOSBAQAogCVJFR0lTVEVSX0xPTkdfQ09OU1RBTlQoIlBHU1FMX05VTSIsIFBHU1FMX05V
TSwgQ09OU1RfQ1MgfCBDT05TVF9QRVJTSVNURU5UKTsKIAlSRUdJU1RFUl9MT05HX0NPTlNU
QU5UKCJQR1NRTF9CT1RIIiwgUEdTUUxfQk9USCwgQ09OU1RfQ1MgfCBDT05TVF9QRVJTSVNU
RU5UKTsKIAorCVJFR0lTVEVSX0xPTkdfQ09OU1RBTlQoIlBHU1FMX0NPTk5FQ1RJT05fQkFE
IiwgQ09OTkVDVElPTl9CQUQsIENPTlNUX0NTIHwgQ09OU1RfUEVSU0lTVEVOVCk7CisJUkVH
SVNURVJfTE9OR19DT05TVEFOVCgiUEdTUUxfQ09OTkVDVElPTl9PSyIsIENPTk5FQ1RJT05f
T0ssIENPTlNUX0NTIHwgQ09OU1RfUEVSU0lTVEVOVCk7CisKIAlyZXR1cm4gU1VDQ0VTUzsK
IH0KIC8qIH19fSAqLwpAQCAtNzIxLDcgKzc2MCw3IEBACiAJUEdyZXN1bHQgKnBnc3FsX3Jl
c3VsdDsKIAlFeGVjU3RhdHVzVHlwZSBzdGF0dXM7CiAJcGdzcWxfcmVzdWx0X2hhbmRsZSAq
cGdfcmVzdWx0OwotCisJCiAJc3dpdGNoKFpFTkRfTlVNX0FSR1MoKSkgewogCQljYXNlIDE6
CiAJCQlpZiAoemVuZF9nZXRfcGFyYW1ldGVyc19leCgxLCAmcXVlcnkpPT1GQUlMVVJFKSB7
CkBAIC03NDMsNiArNzgyLDEwIEBACiAJWkVORF9GRVRDSF9SRVNPVVJDRTIocGdzcWwsIFBH
Y29ubiAqLCBwZ3NxbF9saW5rLCBpZCwgIlBvc3RncmVTUUwgbGluayIsIGxlX2xpbmssIGxl
X3BsaW5rKTsKIAogCWNvbnZlcnRfdG9fc3RyaW5nX2V4KHF1ZXJ5KTsKKwlpZiAoUFFpc0J1
c3kocGdzcWwpKSB7CisJCXBocF9lcnJvcihFX05PVElDRSwiUG9zdGdyZVNRTDogQ2Fubm90
IGV4ZWN1dGUgcXVlcnkgd2hpbGUgZXhlY3V0aW5nIGFzeW5jIHF1ZXJ5LiIpOworCQlSRVRV
Uk5fRkFMU0U7CisJfQogCXBnc3FsX3Jlc3VsdCA9IFBRZXhlYyhwZ3NxbCwgWl9TVFJWQUxf
UFAocXVlcnkpKTsKIAkKIAlpZiAocGdzcWxfcmVzdWx0KSB7CkBAIC03NTEsNyArNzk0LDYg
QEAKIAkJc3RhdHVzID0gKEV4ZWNTdGF0dXNUeXBlKSBQUXN0YXR1cyhwZ3NxbCk7CiAJfQog
CQotCQogCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgUEdSRVNfRU1QVFlfUVVFUlk6CiAJ
CWNhc2UgUEdSRVNfQkFEX1JFU1BPTlNFOgpAQCAtOTc5LDcgKzEwMjEsNyBAQAogCX0KIAly
ZXR1cm4gcmV0OwogfQotLyogfX19ICovCQkJCisvKiB9fX0gKi8KIAogI2RlZmluZSBQSFBf
UEdfRklFTERfTkFNRSAxCiAjZGVmaW5lIFBIUF9QR19GSUVMRF9TSVpFIDIKQEAgLTE5NjIs
NyArMjAwNCwyMzIgQEAKIH0KIC8qIH19fSAqLwogI2VuZGlmCisKKworLyoge3t7IHByb3Rv
IGxvbmcgcGdfc3RhdHVzKHJlc291cmNlIGNvbm4pCisgICBHZXQgY29ubmVjdGlvbiBzdGF0
dXMgKi8KK1BIUF9GVU5DVElPTihwZ19zdGF0dXMpCit7CisJenZhbCAqKnBnc3FsX2xpbmsg
PSBOVUxMOworCWludCBpZCA9IC0xOworCVBHY29ubiAqcGdzcWw7CisKKwlzd2l0Y2goWkVO
RF9OVU1fQVJHUygpKSB7CisJCWNhc2UgMDoKKwkJCWlkID0gUEdHKGRlZmF1bHRfbGluayk7
CisJCQlDSEVDS19ERUZBVUxUX0xJTksoaWQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJ
CWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZwZ3NxbF9saW5rKT09RkFJTFVSRSkg
eworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJ
V1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9CisKKwlaRU5EX0ZFVENIX1JFU09V
UkNFMihwZ3NxbCwgUEdjb25uICosIHBnc3FsX2xpbmssIGlkLCAiUG9zdGdyZVNRTCBsaW5r
IiwgbGVfbGluaywgbGVfcGxpbmspOworCVpfTFZBTF9QKHJldHVybl92YWx1ZSkgPSBQUXN0
YXR1cyhwZ3NxbCk7CisJWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX0xPTkc7Cit9CisK
Ky8qIH19fSAqLworCisvKiB7e3sgcHJvdG8gdm9pZCBwZ19yZXNldChyZXNvdXJjZSBjb25u
KQorICAgUmVzZXQgY29ubmVjdGlvbiAqLworUEhQX0ZVTkNUSU9OKHBnX3Jlc2V0KQorewor
CXp2YWwgKipwZ3NxbF9saW5rID0gTlVMTDsKKwlpbnQgaWQgPSAtMTsKKwlQR2Nvbm4gKnBn
c3FsOworCisJc3dpdGNoKFpFTkRfTlVNX0FSR1MoKSkgeworCQljYXNlIDA6CisJCQlpZCA9
IFBHRyhkZWZhdWx0X2xpbmspOworCQkJQ0hFQ0tfREVGQVVMVF9MSU5LKGlkKTsKKwkJCWJy
ZWFrOworCQljYXNlIDE6CisJCQlpZiAoemVuZF9nZXRfcGFyYW1ldGVyc19leCgxLCAmcGdz
cWxfbGluayk9PUZBSUxVUkUpIHsKKwkJCQlSRVRVUk5fRkFMU0U7CisJCQl9CisJCQlicmVh
azsKKwkJZGVmYXVsdDoKKwkJCVdST05HX1BBUkFNX0NPVU5UOworCQkJYnJlYWs7CisJfQor
CVpFTkRfRkVUQ0hfUkVTT1VSQ0UyKHBnc3FsLCBQR2Nvbm4gKiwgcGdzcWxfbGluaywgaWQs
ICJQb3N0Z3JlU1FMIGxpbmsiLCBsZV9saW5rLCBsZV9wbGluayk7CisJUFFyZXNldChwZ3Nx
bCk7IC8qIHN0YXR1cyBtYXkgYmUgY2hlY2tlZCB3aXRoIHBnX3N0YXR1cygpICovCit9CisK
Ky8qIH19fSAqLworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBmb3IgYXN5bmNyb25v
dXMgcXVlcnkKKyAqIFJlcG9ydCBidWdzIHRvIHlhc3VvX29oZ2FraUB5YWhvby5jb20KKyAq
LyAKKyNkZWZpbmUgUEhQX1BHX0FTWU5DX0lTX0JVU1kJCTEKKyNkZWZpbmUgUEhQX1BHX0FT
WU5DX1JFUVVFU1RfQ0FOQ0VMIDIKKworLyoge3t7IHBocF9wZ3NxbF9kb19hc3luYworICov
Cit2b2lkIHBocF9wZ3NxbF9kb19hc3luYyhJTlRFUk5BTF9GVU5DVElPTl9QQVJBTUVURVJT
LCBpbnQgZW50cnlfdHlwZSkgCit7CisJenZhbCAqKnBnc3FsX2xpbmsgPSBOVUxMOworCWlu
dCBpZCA9IC0xOworCVBHY29ubiAqcGdzcWw7CisKKwlzd2l0Y2goWkVORF9OVU1fQVJHUygp
KSB7CisJCWNhc2UgMDoKKwkJCWlkID0gUEdHKGRlZmF1bHRfbGluayk7CisJCQlDSEVDS19E
RUZBVUxUX0xJTksoaWQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICh6ZW5kX2dl
dF9wYXJhbWV0ZXJzX2V4KDEsICZwZ3NxbF9saW5rKT09RkFJTFVSRSkgeworCQkJCVJFVFVS
Tl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV1JPTkdfUEFSQU1f
Q09VTlQ7CisJCQlicmVhazsKKwl9CisKKwlaRU5EX0ZFVENIX1JFU09VUkNFMihwZ3NxbCwg
UEdjb25uICosIHBnc3FsX2xpbmssIGlkLCAiUG9zdGdyZVNRTCBsaW5rIiwgbGVfbGluaywg
bGVfcGxpbmspOworCisJc3dpdGNoKGVudHJ5X3R5cGUpIHsKKwkJY2FzZSBQSFBfUEdfQVNZ
TkNfSVNfQlVTWToKKwkJCVBRY29uc3VtZUlucHV0KHBnc3FsKTsKKwkJCVpfTFZBTF9QKHJl
dHVybl92YWx1ZSkgPSBQUWlzQnVzeShwZ3NxbCk7CisJCQlaX1RZUEVfUChyZXR1cm5fdmFs
dWUpID0gSVNfTE9ORzsKKwkJCWJyZWFrOworCQljYXNlIFBIUF9QR19BU1lOQ19SRVFVRVNU
X0NBTkNFTDoKKwkJCVpfTFZBTF9QKHJldHVybl92YWx1ZSkgPSBQUXJlcXVlc3RDYW5jZWwo
cGdzcWwpOworCQkJWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX0xPTkc7CisJCQlicmVh
azsKKwkJZGVmYXVsdDoKKwkJCXBocF9lcnJvcihFX0VSUk9SLCJQZ3NxbCBtb2R1bGUgZXJy
b3IuIFJlcG9ydCB0aGlzIGVycm9yIik7CisJCQlicmVhazsKKwl9CisJY29udmVydF90b19i
b29sZWFuX2V4KCZyZXR1cm5fdmFsdWUpOworfQorLyogfX19ICovCisKKy8qIHt7eyBwcm90
byBib29sIHBnX2FzeW5jX3JlcXVlc3RfY2FuY2VsKFtyZXNvdXJjZSBjb25uZWN0aW9uXSkK
KyAgIENhbmNlbCByZXF1ZXN0ICovCitQSFBfRlVOQ1RJT04ocGdfcmVxdWVzdF9jYW5jZWwp
Cit7CisJcGhwX3Bnc3FsX2RvX2FzeW5jKElOVEVSTkFMX0ZVTkNUSU9OX1BBUkFNX1BBU1NU
SFJVLCBQSFBfUEdfQVNZTkNfUkVRVUVTVF9DQU5DRUwpOworfQorLyogfX19ICovCisKKy8q
IHt7eyBwcm90byBxdWVyeSBib29sIHBnX2lzYnVzeShbcmVzb3VyY2UgY29ubmVjdGlvbl0p
CisgICBHZXQgY29ubmVjdGlvbiBpcyBidXN5IG9yIG5vdCAqLworUEhQX0ZVTkNUSU9OKHBn
X2lzX2J1c3kpCit7CisJcGhwX3Bnc3FsX2RvX2FzeW5jKElOVEVSTkFMX0ZVTkNUSU9OX1BB
UkFNX1BBU1NUSFJVLCBQSFBfUEdfQVNZTkNfSVNfQlVTWSk7Cit9CisvKiB9fX0gKi8KKwor
Lyoge3t7IHByb3RvIGJvb2wgcGdfYXN5bmNfZXhlYyhbcmVzb3VyY2UgY29ubmVjdGlvbl0s
IHN0cmluZyBxZXVyeSkKKyAgIFNlbmQgYXN5bmNocm9ub3VzIHF1ZXJ5ICovCitQSFBfRlVO
Q1RJT04ocGdfc2VuZF9xdWVyeSkKK3sKKwl6dmFsICoqcXVlcnksICoqcGdzcWxfbGluayA9
IE5VTEw7CisJaW50IGlkID0gLTE7CisJUEdjb25uICpwZ3NxbDsKKwlQR3Jlc3VsdCAqcmVz
OworCWludCBsZWZ0b3ZlciA9IDA7CisKKwlzd2l0Y2goWkVORF9OVU1fQVJHUygpKSB7CisJ
CWNhc2UgMToKKwkJCWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZxdWVyeSk9PUZB
SUxVUkUpIHsKKwkJCQlSRVRVUk5fRkFMU0U7CisJCQl9CisJCQlpZCA9IFBHRyhkZWZhdWx0
X2xpbmspOworCQkJQ0hFQ0tfREVGQVVMVF9MSU5LKGlkKTsKKwkJCWJyZWFrOworCQljYXNl
IDI6CisJCQlpZiAoemVuZF9nZXRfcGFyYW1ldGVyc19leCgyLCAmcGdzcWxfbGluaywgJnF1
ZXJ5KT09RkFJTFVSRSkgeworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwor
CQlkZWZhdWx0OgorCQkJV1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9CiAJCisJ
WkVORF9GRVRDSF9SRVNPVVJDRTIocGdzcWwsIFBHY29ubiAqLCBwZ3NxbF9saW5rLCBpZCwg
IlBvc3RncmVTUUwgbGluayIsIGxlX2xpbmssIGxlX3BsaW5rKTsKKworCWNvbnZlcnRfdG9f
c3RyaW5nX2V4KHF1ZXJ5KTsKKwlpZiAoUFFzZXRub25ibG9ja2luZyhwZ3NxbCwgMSkpIHsK
KwkJcGhwX2Vycm9yKEVfTk9USUNFLCJQb3N0Z3JlU1FMOiBDYW5ub3Qgc2V0IGNvbm5lY3Rp
b24gdG8gbm9uYmxvY2tpbmcgbW9kZSBpbiBwZ19zZW5kX3F1ZXJ5KCkiKTsKKwl9CisJaWYg
KFBRaXNCdXN5KHBnc3FsKSkgeworCQlwaHBfZXJyb3IoRV9XQVJOSU5HLCJQb3N0Z3JlU1FM
OiBDYW5ub3Qgc2VuZCBtdWx0aXBsZSBxdWVyeSB1c2luZyBwZ19zZW5kX3F1ZXJ5KCkiKTsK
KwkJUkVUVVJOX0ZBTFNFOworCX0KKwl3aGlsZSAoKHJlcyA9IFBRZ2V0UmVzdWx0KHBnc3Fs
KSkpIHsKKwkJUFFjbGVhcihyZXMpOworCQlsZWZ0b3ZlciA9IDE7CisJfQorCWlmIChsZWZ0
b3ZlcikgeworCQlwaHBfZXJyb3IoRV9OT1RJQ0UsIlBvc3RncmVTUUw6IFRoZXJlIGFyZSBy
ZXN1bHRzIG9uIHRoaXMgY29ubmVjdGlvbi4iKTsKKwl9CisJaWYgKCFQUXNlbmRRdWVyeShw
Z3NxbCwgWl9TVFJWQUxfUFAocXVlcnkpKSkgeworCQlSRVRVUk5fRkFMU0U7CisJfQorCWlm
IChQUXNldG5vbmJsb2NraW5nKHBnc3FsLCAwKSkgeworCQlwaHBfZXJyb3IoRV9OT1RJQ0Us
IlBvc3RncmVTUUw6IENhbm5vdCBzZXQgY29ubmVjdGlvbiB0byBibG9ja2luZyBtb2RlIGlu
IHBnX3NlbmRfcXVlcnkoKSIpOworCX0KKwlSRVRVUk5fVFJVRTsKK30KKy8qIH19fSAqLwor
CisKKy8qIHt7eyBwcm90byBxdWVyeSByZXNvdWNlIHBnX2FyeW5jX3Jlc3VsdChbcmVzb3Vy
Y2UgY29ubmVjdGlvbl0pCisgICBHZXQgYXN5bmNocm9ub3VzIHF1ZXJ5IHJlc3VsdCAqLwor
UEhQX0ZVTkNUSU9OKHBnX2dldF9yZXN1bHQpCit7CisJenZhbCAqKnBnc3FsX2xpbmsgPSBO
VUxMOworCWludCBpZCA9IC0xOworCVBHY29ubiAqcGdzcWw7CisJUEdyZXN1bHQgKnBnc3Fs
X3Jlc3VsdDsKKwlwZ3NxbF9yZXN1bHRfaGFuZGxlICpwZ19yZXN1bHQ7CisKKwlzd2l0Y2go
WkVORF9OVU1fQVJHUygpKSB7CisJCWNhc2UgMDoKKwkJCWlkID0gUEdHKGRlZmF1bHRfbGlu
ayk7CisJCQlDSEVDS19ERUZBVUxUX0xJTksoaWQpOworCQkJYnJlYWs7CisJCWNhc2UgMToK
KwkJCWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZwZ3NxbF9saW5rKT09RkFJTFVS
RSkgeworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0Ogor
CQkJV1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9CisKKwlaRU5EX0ZFVENIX1JF
U09VUkNFMihwZ3NxbCwgUEdjb25uICosIHBnc3FsX2xpbmssIGlkLCAiUG9zdGdyZVNRTCBs
aW5rIiwgbGVfbGluaywgbGVfcGxpbmspOworCWlmIChQUXNldG5vbmJsb2NraW5nKHBnc3Fs
LCAxKSkgeworCQlwaHBfZXJyb3IoRV9OT1RJQ0UsIlBvc3RncmVTUUw6IENhbm5vdCBzZXQg
Y29ubmVjdGlvbiB0byBub25ibG9ja2luZyBtb2RlIGluIHBnX2dldF9yZXN1bHQoKSIpOwor
CX0KKwlwZ3NxbF9yZXN1bHQgPSBQUWdldFJlc3VsdChwZ3NxbCk7CisJaWYgKCFwZ3NxbF9y
ZXN1bHQpIHsKKwkJLyogbm8gcmVzdWx0ICovCisJCVJFVFVSTl9GQUxTRTsKKwl9CisJaWYg
KFBRc2V0bm9uYmxvY2tpbmcocGdzcWwsIDApKSB7CisJCXBocF9lcnJvcihFX05PVElDRSwi
UG9zdGdyZVNRTDogQ2Fubm90IHNldCBjb25uZWN0aW9uIHRvIGJsb2NraW5nIG1vZGUgaW4g
cGdfZ2V0X3Jlc3VsdCgpIik7CisJfQorCXBnX3Jlc3VsdCA9IChwZ3NxbF9yZXN1bHRfaGFu
ZGxlICopIGVtYWxsb2Moc2l6ZW9mKHBnc3FsX3Jlc3VsdF9oYW5kbGUpKTsKKwlwZ19yZXN1
bHQtPmNvbm4gPSBwZ3NxbDsKKwlwZ19yZXN1bHQtPnJlc3VsdCA9IHBnc3FsX3Jlc3VsdDsK
KwlwZ19yZXN1bHQtPnJvdyA9IC0xOworCVpFTkRfUkVHSVNURVJfUkVTT1VSQ0UocmV0dXJu
X3ZhbHVlLCBwZ19yZXN1bHQsIGxlX3Jlc3VsdCk7Cit9CisvKiB9fX0gKi8KKwogI2VuZGlm
CiAKIC8qCkluZGV4OiBwaHBfcGdzcWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVw
b3NpdG9yeS9waHA0L2V4dC9wZ3NxbC9waHBfcGdzcWwuaCx2CnJldHJpZXZpbmcgcmV2aXNp
b24gMS4zMwpkaWZmIC11IC1yMS4zMyBwaHBfcGdzcWwuaAotLS0gcGhwX3Bnc3FsLmgJMjYg
U2VwIDIwMDEgMjE6NDQ6NDggLTAwMDAJMS4zMworKysgcGhwX3Bnc3FsLmgJMjUgTm92IDIw
MDEgMDY6Mjg6MzcgLTAwMDAKQEAgLTk0LDYgKzk0LDEyIEBACiBQSFBfRlVOQ1RJT04ocGdf
Y2xpZW50X2VuY29kaW5nKTsKIFBIUF9GVU5DVElPTihwZ19zZXRfY2xpZW50X2VuY29kaW5n
KTsKICNlbmRpZgorUEhQX0ZVTkNUSU9OKHBnX3Jlc2V0KTsKK1BIUF9GVU5DVElPTihwZ19z
dGF0dXMpOworUEhQX0ZVTkNUSU9OKHBnX3NlbmRfcXVlcnkpOworUEhQX0ZVTkNUSU9OKHBn
X3JlcXVlc3RfY2FuY2VsKTsKK1BIUF9GVU5DVElPTihwZ19nZXRfcmVzdWx0KTsKK1BIUF9G
VU5DVElPTihwZ19pc19idXN5KTsKIAogdm9pZCBwaHBfcGdzcWxfZG9fY29ubmVjdChJTlRF
Uk5BTF9GVU5DVElPTl9QQVJBTUVURVJTLGludCBwZXJzaXN0ZW50KTsKIGludCBwaHBfcGdz
cWxfZ2V0X2RlZmF1bHRfbGluayhJTlRFUk5BTF9GVU5DVElPTl9QQVJBTUVURVJTKTsKQEAg
LTEwMiw3ICsxMDgsNyBAQAogY2hhciAqZ2V0X2ZpZWxkX25hbWUoUEdjb25uICpwZ3NxbCwg
T2lkIG9pZCwgSGFzaFRhYmxlICpsaXN0KTsKIHZvaWQgcGhwX3Bnc3FsX2dldF9maWVsZF9p
bmZvKElOVEVSTkFMX0ZVTkNUSU9OX1BBUkFNRVRFUlMsIGludCBlbnRyeV90eXBlKTsKIHZv
aWQgcGhwX3Bnc3FsX2RhdGFfaW5mbyhJTlRFUk5BTF9GVU5DVElPTl9QQVJBTUVURVJTLCBp
bnQgZW50cnlfdHlwZSk7Ci0KK3ZvaWQgcGhwX3Bnc3FsX2RvX2FzeW5jKElOVEVSTkFMX0ZV
TkNUSU9OX1BBUkFNRVRFUlMsaW50IGVudHJ5X3R5cGUpOwogCiB0eXBlZGVmIHN0cnVjdCBw
Z0xvZnAgewogICAgICAgICBQR2Nvbm4gKmNvbm47Cg==
--------------040502020805090406040704
Content-Type: text/plain;
 name="pgsql_test.php"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="pgsql_test.php"

PD9waHAKLyoqCiAqIFBvc3RncmVTUUwgYXN5bmMgcXVlcnkgZnVuY3Rpb24gdGVzdCBzY3Jp
cHQuCiAqCiAqIFRoZXJlIGFyZSBudW1iZXIgb2YgcmVzdHJpY3Rpb25zIHRvIG1ha2UgYXN5
bmMgcXVlcnkgd29yay4KICogUmVmZXIgdG8gbGlicHEgbWFudWFsIGZvciBkZXRhaWxzLgog
KgogKiBwZ19zZW5kX3F1ZXJ5IGRvZXMgbm90IE11bHRpcGxlIHF1ZXJ5LCBob3dldmVyIHVz
ZXIKICogbWF5IHJldHJpdmUgcmVzdWx0IHNlcGFyYXRlbHkuCiAqCiAqIFRoaXMgc2NyaXB0
IGlzIGZvciBwaHAgYmluYXJ5LiBEaXNhYmxlIG91dHB1dCBidWZmZXJpbmcKICogdG8gc2Vl
IHRoZSBkaWZmZXJlbmNlLgogKgogKiB5YXN1b19vaGdha2lAeWFob28uY29tCiAqLwoKLyoq
KioqIENPTkZJRyAqKioqKiovCiR0YWJsZSA9ICdwZ3NxbF9hc3luY19mdW5jX3Rlc3QnOyAg
Ly8gVGVzdCB0YWJsZSBuYW1lIHRvIGNyZWF0ZQokbnVtcmVjID0gNTAwMDA7ICAgICAgICAg
ICAgICAgICAgIC8vIE51bWJlciBvZiByZWNvcmRzIHRvIGNyZWF0ZQokY29ubnN0ciA9ICdo
b3N0PWRldiBkYm5hbWU9eW9oZ2FraSB1c2VyPXlvaGdha2knOyAvLyBEYXRhYmFzZSB0byBj
b25uZWN0CgoKLyoqKioqKioqIHRlc3QgZnVuY2l0b25zICoqKioqKioqLwpmdW5jdGlvbiBj
cmVhdGVfdGVzdF90YWJsZSgkZGIpIAp7CglnbG9iYWwgJHRhYmxlOwkKCSRzcWw9IgpTRUxF
Q1QKCWEuYXR0bmFtZSwKCWEuYXR0bnVtLAoJdC50eXBuYW1lLAoJYS5hdHRsZW4sCglhLmF0
dHR5cG1vZCwKCWEuYXR0bm90TlVMTCwKCWEuYXR0aGFzZGVmCkZST00KCXBnX2NsYXNzIGFz
IGMsCglwZ19hdHRyaWJ1dGUgYSwKCXBnX3R5cGUgdApXSEVSRQoJYS5hdHRudW0gPiAwIEFO
RAoJYS5hdHRyZWxpZCA9IGMub2lkIEFORAoJYy5yZWxuYW1lID0gJyR0YWJsZScgQU5ECglh
LmF0dHR5cGlkID0gdC5vaWQKT1JERVIgQlkKCWEuYXR0bnVtOwoKIjsKCSRyZXMgPSBwZ19l
eGVjKCRkYiwkc3FsKTsKCWlmICghcGdfbnVtcm93cygkcmVzKSkgewoJCWVjaG8gIkNyZWF0
aW5nIHRlc3QgdGFibGUuLlxuIjsKCQkkc3FsID0gIkNSRUFURSBUQUJMRSAkdGFibGUgKHN0
ciB0ZXh0KTsiOwoJCWlmIChwZ19leGVjKCRkYiwkc3FsKSAhPT0gRkFMU0UpCgkJewoJCQkk
dmFsID0gJ0FzeW5jIHF1ZXJ5IGNhbiBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNl
IHNpZ25pZmljYW50bHkuIFBsZWFzZSB0ZXN0IGFuZCByZXBvcnQgYW55IGZhaWx1cmUgdG8g
eWFzdW9fb2hnYWtpQHlhaG9vLmNvbS4gVGhlcmUgYXJlIGNhc2VzIHRoYXQgYXN5bmMgcXVl
cnkgZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZC4gUmVmZXIgdG8gbGlicHEgbWFudWFsIGZv
ciBkZXRhaWxzLiBJIGFsc28gaW1wbGVtZW50ZWQgZnVuY3Rpb25zIHRoYXQgSSBuZWVkIHBn
X3N0YXR1cygpIC0gcmV0dXJucyBjb25uZWN0aW9uIHN0YXV0cyBhbmQgcGdfcmVzZXQoKSAt
IHJlc2V0IGNvbm5lY3Rpb24uIChVc2VmdWwgd2hlbiBjb25uZWN0aW9uIGlzIGJyb2tlbiBm
b3Igc29tZSByZWFzb24gLSBtb3N0IGxpa2VseSBiYWNrZW5kIGlzIGRpZWQpJzsKCQkJZm9y
ICgkaT0wOyAkaSA8IDUwMDAwOyAkaSsrKSB7CgkJCQlwZ19leGVjKCRkYiwiSU5TRVJUIElO
VE8gJHRhYmxlIChzdHIpIFZBTFVFUyAoJyR2YWwnKTsiKTsKCQkJCWlmICghKCRpICUgMTAw
KSkgewoJCQkJCWVjaG8gJy4nOwoJCQkJfQoJCQl9CgkJCWVjaG8gIlxuIjsKCQkJJHZhbCA9
ICcgICAgIFhZWiAgICAgICAgICc7IC8vIFRvIG1ha2Ugc2VsZWN0IGFjdHVhbGx5IHJldHVy
biBhIHJvdy4gJ1hZWicgaXMgc2VhcmNoIHBhdHRlcm4uCgkJCXBnX2V4ZWMoJGRiLCJJTlNF
UlQgSU5UTyAkdGFibGUgKHN0cikgVkFMVUVTICgnJHZhbCcpOyIpOwoJCX0KCQllbHNlIHsK
CQkJZGllKCJFUlI6IEZhaWxlZCBjcmVhdGluZyB0ZXN0IHRhYmxlLiIucGdfZXJyb3JtZXNz
YWdlKCkuIlxuXG5cblxuXG5cbiIpOwoJCX0KCX0KCWVsc2UgewoJCWVjaG8gIlRlc3QgdGFi
bGUgZXhpc3RzXG4iOwoJfQp9CgpmdW5jdGlvbiBjaGVja19zdGF0dXMoJGRiKSAKewoJJHN0
YXR1cyA9IHBnX3N0YXR1cygkZGIpOwoKCXN3aXRjaCAoJHN0YXR1cykgewoJCWNhc2UgUEdT
UUxfQ09OTkVDVElPTl9PSzoKCQkJZWNobyAiU3RhdHVzOiBDb25uZWN0aW9uIGlzIHJlYWR5
XG4iOwoJCQlicmVhazsKCQljYXNlIFBHU1FMX0NPTk5FQ1RJT05fQkFEOgoJCQllY2hvICJT
dGF0dXM6IENvbm5lY3RpbiBpcyBCQURcbiI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVj
aG8gIlN0YXR1czogVW5rb253biAoJHN0YXR1cylcbiI7CgkJCWJyZWFrOwoJfQoJcmV0dXJu
ICRzdGF0dXM7Cn0KCmZ1bmN0aW9uIGV4ZWN1dGVfcXVlcnkoJGRiLCRhc3luYyA9IFRSVUUp
IAp7CglnbG9iYWwgJHRhYmxlOwoJZWNobyAiRXhlY3V0aW5nIHF1ZXJ5Li4iOwoJJHJldCA9
IG51bGw7Cgkkc3FsID0gIgpTRUxFQ1QgKiBGUk9NICR0YWJsZSBXSEVSRSBzdHIgbGlrZSAn
JVhZWiUnOwoiOwoJaWYgKCRhc3luYykgewoJCXJldHVybiBwZ19zZW5kX3F1ZXJ5KCRkYiwk
c3FsKTsKCX0KCWlmICghKCRyZXQgPSBwZ19leGVjKCRkYiwkc3FsKSkpIHsKCQllY2hvICJR
dWVyeSBmYWlsZWQuLlxuIjsKCX0KCXJldHVybiAkcmV0Owp9CgpmdW5jdGlvbiBjaGVja19y
ZXN1bHQoJHJlc3VsdCkgCnsKCWlmICghJHJlc3VsdCl7CgkJZWNobyAiQ2hlY2sgcmVzdWx0
OiBOR1xuIjsKCQlyZXR1cm4gZmFsc2U7Cgl9CgllY2hvICJDaGVjayByZXN1bHQ6IE9rXG4i
OwoJcmV0dXJuIHRydWU7Cn0KCgpmdW5jdGlvbiBkdW1wX3Jlc3VsdCgkcmVzdWx0KSAKewoJ
aWYgKGNoZWNrX3Jlc3VsdCgkcmVzdWx0KSkgewoJCSRjbnQgPSBwZ19udW1yb3dzKCRyZXN1
bHQpOwoJCWZvcigkaT0wOyAkaSA8ICRjbnQ7ICRpKyspIHsKCQkJJHJlYyA9IHBnX2ZldGNo
X2FycmF5KCRyZXN1bHQsJGksUEdTUUxfQVNTT0MpOwoJCQlwcmludF9yKCRyZWMpOwoJCX0K
CX0KfQoKLyoqKioqKioqICBNQUlOICoqKioqKioqKiovCiRkYiA9IHBnX2Nvbm5lY3QoJGNv
bm5zdHIpOwpjcmVhdGVfdGVzdF90YWJsZSgkZGIpOwoKLy8vLy8vLy8vLy8vLy8gbm9uYmxv
Y2tlZCBxdWVyeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KZWNobyAiXG4gKioqIG5vbi1ibG9j
a2luZyBxZXVyeSAqKiogXG5cbiI7CgpjaGVja19zdGF0dXMoJGRiKTsKZXhlY3V0ZV9xdWVy
eSgkZGIpOwp3aGlsZSAocGdfaXNfYnVzeSgkZGIpKSAKewoJZWNobyAiLiI7CglzbGVlcCgx
KTsKfQplY2hvICJcbiI7CgokcmVzdWx0ID0gcGdfZ2V0X3Jlc3VsdCgkZGIpOwpkdW1wX3Jl
c3VsdCgkcmVzdWx0KTsKCi8vLy8vLy8vLy8vLy8vLyBibG9ja2VkIHF1ZXJ5IC8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8KZWNobyAiXG4gKioqIGJsb2NraW5nIHFldXJ5ICoqKiBcblxu
IjsKCmNoZWNrX3N0YXR1cygkZGIpOwokcmVzdWx0ID0gZXhlY3V0ZV9xdWVyeSgkZGIsIGZh
bHNlKTsKZWNobyAiXG4iOwoKZHVtcF9yZXN1bHQoJHJlc3VsdCk7Cgo/PgoKCgoKCgoKCgoK
Cgo=
--------------040502020805090406040704--

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/