a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
b7ae0e | 2017-06-29 | Stephen R. van den Berg | |
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | Stephen R. van den Berg | |
|
1f3381 | 2017-11-21 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
63fcae | 2017-11-22 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
#pike __REAL_VERSION__
|
5a4c01 | 2016-11-08 | Stephen R. van den Berg | | #pragma dynamic_dot
|
5691e4 | 2014-11-10 | Stephen R. van den Berg | | #require constant(Thread.Thread)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #include "pgsql.h"
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e22cab | 2008-07-14 | Stephen R. van den Berg | | #define ERROR(X ...) predef::error(X)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
b52b45 | 2017-03-15 | Henrik Grubbström (Grubba) | | inherit __builtin.Sql.Connection;
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | private .pgsql_util.proxy proxy;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private int pstmtcount;
|
32eee7 | 2015-12-09 | Stephen R. van den Berg | | private int ptstmtcount;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_STATS
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | private int skippeddescribe;
private int portalsopened;
private int prepstmtused;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | private int cachedepth = STATEMENTCACHEDEPTH;
private int portalbuffersize = PORTALBUFFERSIZE;
private int timeout = QUERYTIMEOUT;
|
aa8177 | 2018-01-26 | Stephen R. van den Berg | | private array connparmcache;
private int reconnected;
|
a55b44 | 2018-08-08 | Stephen R. van den Berg | | private int lastping = time(1);
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | private Thread.Condition resynced;
private Thread.Mutex resyncmux;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
67879d | 2017-11-10 | Stephen R. van den Berg | | protected string _sprintf(int type) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string res;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(type) {
case 'O':
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | res = sprintf(DRIVERNAME"(%s@%s:%d/%s,%d,%d)",
proxy.user, proxy.host, proxy.port, proxy.database,
|
4258a9 | 2019-11-02 | Peter Bortas | | proxy.c->?socket && proxy.c->socket->query_fd(), proxy.backendpid);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
return res;
}
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
aa8177 | 2018-01-26 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | |
|
4d5354 | 2014-11-24 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
6e598e | 2020-03-04 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
6e598e | 2020-03-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
1824a0 | 2009-04-10 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
4d5354 | 2014-11-24 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
63fcae | 2017-11-22 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | | protected void create(void|string host, void|string database,
void|string user, void|string pass,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void|mapping(string:mixed) options) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string spass = pass && pass != "" ? Standards.IDNA.to_ascii(pass) : pass;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(pass) {
|
334f37 | 2008-08-12 | Stephen R. van den Berg | | String.secure(pass);
|
11b13b | 2014-08-16 | Martin Nilsson | | pass = "CENSORED";
}
|
aa8177 | 2018-01-26 | Stephen R. van den Berg | | connparmcache = ({ host, database,
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | user && user != "" ? Standards.IDNA.to_ascii(user, 1) : user,
|
aa8177 | 2018-01-26 | Stephen R. van den Berg | | spass, options || ([])});
proxy = .pgsql_util.proxy(@connparmcache);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
ac824b | 2014-11-24 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
be0739 | 2009-02-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string error(void|int clear) {
|
3d6e3c | 2020-02-22 | Stephen R. van den Berg | | mixed err = catch(throwdelayederror(proxy));
if (!clear && err)
throw(err);
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return proxy.geterror(clear);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string host_info() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return proxy.host_info();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int is_open() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return proxy.is_open();
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | }
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int ping() {
|
a55b44 | 2018-08-08 | Stephen R. van den Berg | | int t, ret;
|
e1963e | 2017-11-15 | Stephen R. van den Berg | | waitauthready();
|
a55b44 | 2018-08-08 | Stephen R. van den Berg | | if ((ret = is_open())
&& (t = time(1)) - lastping > MINPINGINTERVAL
&& (ret = !catch(proxy.c->start()->sendcmd(FLUSHSEND))))
lastping = t;
return ret ? !!reconnected : -1;
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void cancelquery() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.cancelquery();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | |
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void set_charset(string charset) {
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | if(charset)
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | textquery(sprintf("SET CLIENT_ENCODING TO '%s'", quote(charset)));
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string get_charset() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return getruntimeparameters()[CLIENT_ENCODING];
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
1824a0 | 2009-04-10 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
cbe276 | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final mapping(string:string) getruntimeparameters() {
|
571622 | 2014-11-09 | Stephen R. van den Berg | | waitauthready();
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return proxy.runtimeparameter + ([]);
|
cbe276 | 2008-08-01 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
ae952f | 2014-11-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
aebf35 | 2014-11-26 | Stephen R. van den Berg | |
|
ae952f | 2014-11-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
ae952f | 2014-11-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final mapping(string:mixed) getstatistics() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | mapping(string:mixed) stats = ([
"warnings_dropped":proxy.warningsdropcount,
"current_prepared_statements":sizeof(proxy.prepareds),
"current_prepared_statement_hits":proxy.totalhits,
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | "prepared_statement_count":pstmtcount,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_STATS
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | "used_prepared_statements":prepstmtused,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | "skipped_describe_count":skippeddescribe,
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | "portals_opened_count":portalsopened,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | "messages_received":proxy.msgsreceived,
"bytes_received":proxy.bytesreceived,
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | ]);
return stats;
}
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setcachedepth(void|int newdepth) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | int olddepth = cachedepth;
if (!undefinedp(newdepth) && newdepth >= 0)
cachedepth = newdepth;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return olddepth;
}
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int settimeout(void|int newtimeout) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | int oldtimeout = timeout;
if (!undefinedp(newtimeout) && newtimeout > 0)
timeout = newtimeout;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return oldtimeout;
}
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setportalbuffersize(void|int newportalbuffersize) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | int oldportalbuffersize = portalbuffersize;
if (!undefinedp(newportalbuffersize) && newportalbuffersize>0)
portalbuffersize = newportalbuffersize;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return oldportalbuffersize;
}
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setfetchlimit(void|int newfetchlimit) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | int oldfetchlimit = proxy._fetchlimit;
if (!undefinedp(newfetchlimit) && newfetchlimit >= 0)
proxy._fetchlimit = newfetchlimit;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return oldfetchlimit;
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string glob2reg(string glob) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (!glob || !sizeof(glob))
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return "%";
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return replace(glob, ({"*", "?", "\\", "%", "_"}),
({"%", "_", "\\\\", "\\%", "\\_"}));
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void waitauthready() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (proxy.waitforauthready) {
|
60f4ad | 2016-02-17 | Stephen R. van den Berg | | PD("%d Wait for auth ready %O\n",
|
4258a9 | 2019-11-02 | Peter Bortas | | proxy.c->?socket && proxy.c->socket->query_fd(), backtrace()[-2]);
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | Thread.MutexKey lock = proxy.shortmux->lock();
catch(PT(proxy.waitforauthready->wait(lock)));
PD("%d Wait for auth ready released.\n",
|
4258a9 | 2019-11-02 | Peter Bortas | | proxy.c->?socket && proxy.c->socket->query_fd());
|
571622 | 2014-11-09 | Stephen R. van den Berg | | }
}
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void close() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.close();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
c071bc | 2017-11-05 | Henrik Grubbström (Grubba) | | protected void _destruct() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | destruct(proxy);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
|
e7621f | 2009-02-02 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void reload() {
|
11b13b | 2014-08-16 | Martin Nilsson | | resync();
|
e7621f | 2009-02-02 | Stephen R. van den Berg | | }
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | private void textquery(string q) {
#if 1
foreach (q / ";"; ; string sq)
big_query(sq);
#else // textqueries and portals do not mix well
big_query(q, (["_text":1]));
#endif
}
private void resyncdone() {
Thread.MutexKey lock = resyncmux->lock();
resynced.signal();
}
|
0fb574 | 2014-11-13 | Stephen R. van den Berg | | private void reset_dbsession() {
|
dc915d | 2018-06-05 | Stephen R. van den Berg | | proxy.statementsinflight->wait_till_drained();
error(1);
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | textquery("ROLLBACK;RESET ALL;CLOSE ALL;DISCARD TEMP");
resyncdone();
|
0fb574 | 2014-11-13 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void resync_cb() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | switch (proxy.backendstatus) {
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | default:
resyncdone();
break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 'T':case 'E':
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | foreach (proxy.prepareds; ; mapping tp) {
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | m_delete(tp, "datatypeoid");
m_delete(tp, "datarowdesc");
m_delete(tp, "datarowtypes");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
0fb574 | 2014-11-13 | Stephen R. van den Berg | | Thread.Thread(reset_dbsession);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
}
|
e7621f | 2009-02-02 | Stephen R. van den Berg | |
|
aebf35 | 2014-11-26 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void resync() {
|
11b13b | 2014-08-16 | Martin Nilsson | | mixed err;
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (is_open()) {
|
878197 | 2014-11-21 | Stephen R. van den Berg | | err = catch {
|
2e28a9 | 2017-06-18 | Stephen R. van den Berg | | PD("Statementsinflight: %d Portalsinflight: %d\n",
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.statementsinflight, proxy.portalsinflight);
if(!proxy.waitforauthready) {
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | if (!resynced) {
resynced = Thread.Condition();
resyncmux = Thread.Mutex();
}
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.readyforquery_cb = resync_cb;
proxy.sendsync();
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | if (proxy.readyforquery_cb) {
Thread.MutexKey lock = resyncmux->lock();
resynced.wait(lock);
}
|
878197 | 2014-11-21 | Stephen R. van den Berg | | }
return;
};
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | PD("%O\n", err);
|
878197 | 2014-11-21 | Stephen R. van den Berg | | }
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (sizeof(proxy.lastmessage))
ERROR(proxy.a2nls(proxy.lastmessage));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
e1963e | 2017-11-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void select_db(string dbname) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (proxy.database != dbname)
|
e1963e | 2017-11-15 | Stephen R. van den Berg | | ERROR("Cannot switch databases from %O to %O"
" in an already established connection\n",
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.database, dbname);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | |
|
e1963e | 2017-11-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void set_notify_callback(string condition,
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | void|function(int,string,string,mixed ...:void) notify_cb, void|int selfnotify,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mixed ... args) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (!notify_cb)
m_delete(proxy.notifylist, condition);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | else {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | array old = proxy.notifylist[condition];
if (!old)
old = ({notify_cb});
if (selfnotify || args)
old += ({selfnotify});
if (args)
old += args;
proxy.notifylist[condition] = old;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
}
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string quote(string s) {
|
571622 | 2014-11-09 | Stephen R. van den Berg | | waitauthready();
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string r = proxy.runtimeparameter.standard_conforming_strings;
if (r && r == "on")
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return replace(s, "'", "''");
return replace(s, ({ "'", "\\" }), ({ "''", "\\\\" }) );
}
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string quotebinary(string s) {
|
11b13b | 2014-08-16 | Martin Nilsson | | return replace(s, ({ "'", "\\", "\0" }), ({ "''", "\\\\", "\\000" }) );
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void create_db(string db) {
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | textquery(sprintf("CREATE DATABASE %s", db));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
9a3d00 | 2011-01-09 | Henrik Grubbström (Grubba) | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void drop_db(string db) {
|
6476a4 | 2020-05-12 | Stephen R. van den Berg | | textquery(sprintf("DROP DATABASE %s", db));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string server_info () {
|
571622 | 2014-11-09 | Stephen R. van den Berg | | waitauthready();
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return DRIVERNAME"/" + (proxy.runtimeparameter.server_version || "unknown");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final array(string) list_dbs (void|string glob) {
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | array row, ret = ({});
|
63fcae | 2017-11-22 | Stephen R. van den Berg | | .pgsql_util.Result res=big_query("SELECT d.datname "
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | "FROM pg_database d "
"WHERE d.datname ILIKE :glob "
"ORDER BY d.datname",
([":glob":glob2reg(glob)]));
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | while(row = res->fetch_row())
ret += ({row[0]});
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | return ret;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final array(string) list_tables (void|string glob) {
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | array row, ret = ({});
|
63fcae | 2017-11-22 | Stephen R. van den Berg | | .pgsql_util.Result res = big_query(
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | "SELECT CASE WHEN 'public'=n.nspname THEN '' ELSE n.nspname||'.' END "
" ||c.relname AS name "
"FROM pg_catalog.pg_class c "
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace "
"WHERE c.relkind IN ('r','v') AND n.nspname<>'pg_catalog' "
" AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) "
" AND c.relname ILIKE :glob "
" ORDER BY 1",
([":glob":glob2reg(glob)]));
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | while(row = res->fetch_row())
ret += ({row[0]});
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | return ret;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final array(mapping(string:mixed)) list_fields(void|string table,
void|string glob) {
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | array row, ret = ({});
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string schema;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
sscanf(table||"*", "%s.%s", schema, table);
|
63fcae | 2017-11-22 | Stephen R. van den Berg | | .pgsql_util.Result res = big_typed_query(
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | "SELECT a.attname, a.atttypid, t.typname, a.attlen, "
|
98a776 | 2009-02-22 | Stephen R. van den Berg | | " c.relhasindex, c.relhaspkey, CAST(c.reltuples AS BIGINT) AS reltuples, "
" (c.relpages "
" +COALESCE( "
" (SELECT SUM(tst.relpages) "
" FROM pg_catalog.pg_class tst "
" WHERE tst.relfilenode=c.reltoastrelid) "
" ,0) "
" )*8192::BIGINT AS datasize, "
" (COALESCE( "
" (SELECT SUM(pin.relpages) "
" FROM pg_catalog.pg_index pi "
" JOIN pg_catalog.pg_class pin ON pin.relfilenode=pi.indexrelid "
" WHERE pi.indrelid IN (c.relfilenode,c.reltoastrelid)) "
" ,0) "
" )*8192::BIGINT AS indexsize, "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | " c.relisshared, t.typdefault, "
" n.nspname, c.relname, "
" CASE c.relkind "
" WHEN 'r' THEN 'table' "
" WHEN 'v' THEN 'view' "
" WHEN 'i' THEN 'index' "
" WHEN 'S' THEN 'sequence' "
" WHEN 's' THEN 'special' "
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | " WHEN 't' THEN 'toastable' "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | " WHEN 'c' THEN 'composite' "
" ELSE c.relkind::TEXT END AS relkind, "
" r.rolname "
|
98a776 | 2009-02-22 | Stephen R. van den Berg | | "FROM pg_catalog.pg_class c "
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace "
" JOIN pg_catalog.pg_roles r ON r.oid=c.relowner "
" JOIN pg_catalog.pg_attribute a ON c.oid=a.attrelid "
" JOIN pg_catalog.pg_type t ON a.atttypid=t.oid "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | "WHERE c.relname ILIKE :table AND "
" (n.nspname ILIKE :schema OR "
" :schema IS NULL "
|
98a776 | 2009-02-22 | Stephen R. van den Berg | | " AND n.nspname<>'pg_catalog' AND n.nspname !~ '^pg_toast') "
|
2c228b | 2009-02-15 | Stephen R. van den Berg | | " AND a.attname ILIKE :glob "
" AND (a.attnum>0 OR '*'=:realglob) "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | "ORDER BY n.nspname,c.relname,a.attnum,a.attname",
([":schema":glob2reg(schema),":table":glob2reg(table),
|
11b13b | 2014-08-16 | Martin Nilsson | | ":glob":glob2reg(glob),":realglob":glob]));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
array colnames=res->fetch_fields();
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | mapping(string:string) renames = ([
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | "attname":"name",
"nspname":"schema",
"relname":"table",
"rolname":"owner",
"typname":"type",
"attlen":"length",
"typdefault":"default",
"relisshared":"is_shared",
"atttypid":"typeoid",
"relkind":"kind",
"relhasindex":"has_index",
"relhaspkey":"has_primarykey",
"reltuples":"rowcount",
]);
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | foreach(colnames; int i; mapping m) {
string nf, field=m.name;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(nf=renames[field])
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | field=nf;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | colnames[i]=field;
}
}
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | #define delifzero(m, field) if(!(m)[field]) m_delete(m, field)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | while(row=res->fetch_row()) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | mapping m=mkmapping(colnames, row);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | delifzero(m,"is_shared");
delifzero(m,"has_index");
delifzero(m,"has_primarykey");
delifzero(m,"default");
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | ret += ({m});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
return ret;
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string trbackendst(int c) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(c) {
case 'I': return "idle";
case 'T': return "intransaction";
case 'E': return "infailedtransaction";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
928713 | 2008-09-03 | Stephen R. van den Berg | | return "";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
f0ce5e | 2017-11-16 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final string status_commit() {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return trbackendst(proxy.backendstatus);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private inline void closestatement(
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | .pgsql_util.bufcon|.pgsql_util.conxsess plugbuffer, string oldprep) {
.pgsql_util.closestatement(plugbuffer, oldprep);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private inline string int2hex(int i) {
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | return String.int2hex(i);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private inline void throwdelayederror(object parent) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | .pgsql_util.throwdelayederror(parent);
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | }
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | private void startquery(int forcetext, .pgsql_util.Result portal, string q,
mapping(string:mixed) tp, string preparedname) {
.pgsql_util.conxion c = proxy.c;
|
aa8177 | 2018-01-26 | Stephen R. van den Berg | | if (!c && (proxy.options["reconnect"]
|| zero_type(proxy.options["reconnect"]))) {
sleep(BACKOFFDELAY);
if (!proxy.c) {
reconnected++;
proxy = .pgsql_util.proxy(@connparmcache);
}
c = proxy.c;
}
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | if (forcetext) {
portal._unnamedportalkey = proxy.unnamedportalmux->lock(1);
portal._portalname = "";
portal->_parseportal(); portal->_bindportal();
proxy.readyforquerycount++;
{
Thread.MutexKey lock = proxy.unnamedstatement->lock(1);
.pgsql_util.conxsess cs = c->start(1);
CHAIN(cs)->add_int8('Q')->add_hstring(({q, 0}), 4, 4);
cs->sendcmd(FLUSHLOGSEND, portal);
}
PD("Simple query: %O\n", q);
} else {
object plugbuffer;
portal->_parseportal();
if (!sizeof(preparedname) || !tp || !tp.preparedname) {
if (!sizeof(preparedname))
preparedname =
|
6e598e | 2020-03-04 | Stephen R. van den Berg | | (portal._unnamedstatementkey =
(proxy.options.cache_autoprepared_statements
? proxy.unnamedstatement->trylock
: proxy.unnamedstatement->lock)(1))
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | ? "" : PTSTMTPREFIX + int2hex(ptstmtcount++);
PD("Parse statement %O=%O\n", preparedname, q);
plugbuffer = c->start();
CHAIN(plugbuffer)->add_int8('P')
->add_hstring(({preparedname, 0, q, "\0\0\0"}), 4, 4)
#if 0
->add(PGFLUSH)
#endif
;
} else {
preparedname = tp.preparedname;
PD("Using prepared statement %s for %O\n", preparedname, q);
}
portal._preparedname = preparedname;
if (!tp || !tp.datatypeoid) {
PD("Describe statement %O\n", preparedname);
if (!plugbuffer)
plugbuffer = c->start();
CHAIN(plugbuffer)->add_int8('D')
->add_hstring(({'S', preparedname, 0}), 4, 4);
plugbuffer->sendcmd(FLUSHSEND, portal);
} else {
if (plugbuffer)
plugbuffer->sendcmd(KEEP);
#ifdef PG_STATS
skippeddescribe++;
#endif
portal->_setrowdesc(tp.datarowdesc, tp.datarowtypes);
}
if ((portal._tprepared=tp) && tp.datatypeoid) {
mixed e = catch(portal->_preparebind(tp.datatypeoid));
|
71b299 | 2020-01-22 | Stephen R. van den Berg | | if (!this)
throw(e);
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | if (e && !portal.delayederror) {
portal._unnamedstatementkey = 0;
throw(e);
}
}
if (!proxy.unnamedstatement)
portal._unnamedstatementkey = 0;
}
}
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | |
|
842f4e | 2012-04-10 | Stephen R. van den Berg | |
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | |
|
ac824b | 2014-11-24 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
b33f1b | 2014-11-15 | Stephen R. van den Berg | |
|
d2e634 | 2017-12-22 | Stephen R. van den Berg | |
|
b33f1b | 2014-11-15 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
63fcae | 2017-11-22 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
17b753 | 2008-07-30 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | |
|
17b753 | 2008-07-30 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | |
|
57fdb2 | 2017-11-21 | Stephen R. van den Berg | |
|
17b753 | 2008-07-30 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
63fcae | 2017-11-22 | Stephen R. van den Berg | |
|
7ae250 | 2017-11-24 | Stephen R. van den Berg | | final variant .pgsql_util.Result big_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings,
void|int _alltyped) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string preparedname = "";
mapping(string:mixed) options = proxy.options;
.pgsql_util.conxion c = proxy.c;
int forcecache = -1, forcetext = options.text_query;
int syncparse = zero_type(options.sync_parse)
? -1 : options.sync_parse;
if (proxy.waitforauthready)
|
571622 | 2014-11-09 | Stephen R. van den Berg | | waitauthready();
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | string cenc = proxy.runtimeparameter[CLIENT_ENCODING];
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(cenc) {
case UTF8CHARSET:
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | q = string_to_utf8(q);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
default:
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (String.width(q) > 8)
ERROR("Don't know how to convert %O to %s encoding\n", q, cenc);
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | array(string|int) paramValues;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | array from;
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (bindings) {
if (forcetext)
q = .sql_util.emulate_bindings(q, bindings, this),
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | paramValues = ({});
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | else {
|
bea3fb | 2018-05-26 | Stephen R. van den Berg | | int pi = 0;
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | paramValues = allocate(sizeof(bindings));
from = allocate(sizeof(bindings));
|
bea3fb | 2018-05-26 | Stephen R. van den Berg | | array(string) litfrom, litto, to = allocate(sizeof(bindings));
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | litfrom = ({}); litto = ({});
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | foreach (bindings; mixed name; mixed value) {
if (stringp(name)) {
if (name[0] != ':')
name = ":" + name;
if (name[1] == '_') {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | switch(name) {
case ":_cache":
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | forcecache = (int)value;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | break;
case ":_text":
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | forcetext = (int)value;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | break;
|
d1e1c0 | 2014-11-10 | Stephen R. van den Berg | | case ":_sync":
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | syncparse = (int)value;
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | | break;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | }
continue;
}
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (!has_value(q, name))
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | continue;
}
|
bea3fb | 2018-05-26 | Stephen R. van den Berg | | if (multisetp(value)) {
litto += ({indices(value)*","});
litfrom += ({name});
} else {
paramValues[pi] = value;
to[pi] = sprintf("$%d", pi + 1);
from[pi++] = name;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
bea3fb | 2018-05-26 | Stephen R. van den Berg | | if (pi--) {
paramValues = paramValues[.. pi];
q = replace(q, litfrom += from = from[.. pi], litto += to = to[.. pi]);
} else {
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | paramValues = ({});
|
bea3fb | 2018-05-26 | Stephen R. van den Berg | | if (sizeof(litfrom))
q = replace(q, litfrom, litto);
}
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | from = ({from, to, paramValues});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
3d6cb0 | 2020-02-23 | Stephen R. van den Berg | | paramValues = ({});
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (String.width(q) > 8)
ERROR("Wide string literals in %O not supported\n", q);
if (has_value(q, "\0"))
ERROR("Querystring %O contains invalid literal nul-characters\n", q);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | mapping(string:mixed) tp;
|
55a08b | 2017-06-25 | Stephen R. van den Berg | | |
66d6ff | 2017-06-27 | Stephen R. van den Berg | | * The primary function of this detection is to ensure a SYNC
* right after a COMMIT, and no SYNC after a BEGIN.
|
55a08b | 2017-06-25 | Stephen R. van den Berg | | */
int transtype = .pgsql_util.transendprefix->match(q) ? TRANSEND
: .pgsql_util.transbeginprefix->match(q) ? TRANSBEGIN : NOTRANS;
|
3d6e3c | 2020-02-22 | Stephen R. van den Berg | | {
int inerror = proxy.backendstatus == 'E';
if (inerror && transtype == TRANSEND)
proxy.sendsync();
throwdelayederror(proxy);
if (inerror && transtype != TRANSEND)
ERROR("Current transaction is aborted, "
"commands ignored until end of transaction");
}
|
2aeb8a | 2017-06-27 | Stephen R. van den Berg | | if (transtype != NOTRANS)
tp = .pgsql_util.describenodata;
else if (!forcetext && forcecache == 1
|| forcecache && sizeof(q) >= MINPREPARELENGTH) {
|
e1963e | 2017-11-15 | Stephen R. van den Berg | | object plugbuffer = c->start();
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (tp = proxy.prepareds[q]) {
if (tp.preparedname) {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #ifdef PG_STATS
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | prepstmtused++;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | preparedname = tp.preparedname;
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | } else if(tp.trun && tp.tparse*FACTORPLAN >= tp.trun
|
6e598e | 2020-03-04 | Stephen R. van den Berg | | && options.cache_autoprepared_statements)
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | preparedname = PREPSTMTPREFIX + int2hex(pstmtcount++);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (proxy.totalhits >= cachedepth)
foreach (proxy.prepareds; string ind; tp) {
int oldhits = tp.hits;
proxy.totalhits -= oldhits-(tp.hits = oldhits >> 1);
if (oldhits <= 1) {
closestatement(plugbuffer, tp.preparedname);
m_delete(proxy.prepareds, ind);
}
}
if (forcecache != 1 && .pgsql_util.createprefix->match(q)) {
|
662374 | 2017-06-17 | Stephen R. van den Berg | | PD("Invalidate cache\n");
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.invalidatecache = 1;
|
2aeb8a | 2017-06-27 | Stephen R. van den Berg | | tp = 0;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.prepareds[q] = tp = ([]);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (proxy.invalidatecache) {
proxy.invalidatecache = 0;
foreach (proxy.prepareds; ; mapping np) {
closestatement(plugbuffer, np.preparedname);
m_delete(np, "preparedname");
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | }
}
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | if (sizeof(CHAIN(plugbuffer))) {
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | PD("%O\n", (string)CHAIN(plugbuffer));
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | plugbuffer->sendcmd(FLUSHSEND);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | plugbuffer->sendcmd(KEEP);
|
63fcae | 2017-11-22 | Stephen R. van den Berg | | } else
|
2aeb8a | 2017-06-27 | Stephen R. van den Berg | | tp = 0;
|
63fcae | 2017-11-22 | Stephen R. van den Berg | | .pgsql_util.Result portal;
portal = .pgsql_util.Result(proxy, c, q, portalbuffersize, _alltyped,
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | from, forcetext, timeout, syncparse, transtype);
portal._tprepared = tp;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_STATS
portalsopened++;
#endif
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | proxy.clearmessage = 1;
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | |
if (Thread.this_thread() == .pgsql_util.local_backend.executing_thread())
|
6e4105 | 2017-11-30 | Stephen R. van den Berg | | Thread.Thread(startquery, forcetext, portal, q, tp, preparedname);
|
1a2da9 | 2017-11-30 | Stephen R. van den Berg | | else
startquery(forcetext, portal, q, tp, preparedname);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | throwdelayederror(portal);
return portal;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
d62e94 | 2018-05-16 | Stephen R. van den Berg | |
|
7ae250 | 2017-11-24 | Stephen R. van den Berg | | final variant inline .pgsql_util.Result streaming_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return big_query(q, bindings);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
b15672 | 2008-08-25 | Stephen R. van den Berg | |
|
63fcae | 2017-11-22 | Stephen R. van den Berg | |
|
7ae250 | 2017-11-24 | Stephen R. van den Berg | | final variant inline .pgsql_util.Result big_typed_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings) {
|
f66d60 | 2017-11-18 | Stephen R. van den Berg | | return big_query(q, bindings, 1);
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | }
|
d62e94 | 2018-05-16 | Stephen R. van den Berg | |
final variant inline .pgsql_util.Result streaming_typed_query(string q,
void|mapping(string|int:mixed) bindings) {
return big_query(q, bindings, 1);
}
|