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 | |
|
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 | |
|
4e1d1f | 2008-08-01 | 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 | |
|
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 | |
#pike __REAL_VERSION__
|
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 | |
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final int _fetchlimit=FETCHLIMIT;
final Thread.Mutex _unnamedportalmux;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private Thread.Mutex unnamedstatement;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final int _portalsinflight;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | private .pgsql_util.conxion c;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string cancelsecret;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | private int backendpid, backendstatus;
final mapping(string:mixed) _options;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private array(string) lastmessage=({});
private int clearmessage;
private mapping(string:array(mixed)) notifylist=([]);
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final mapping(string:string) _runtimeparameter;
final mapping(string:mapping(string:mixed)) _prepareds=([]);
|
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 | |
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final int _pportalcount;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private int totalhits;
private int cachedepth=STATEMENTCACHEDEPTH;
private int timeout=QUERYTIMEOUT;
private int portalbuffersize=PORTALBUFFERSIZE;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | private int reconnected;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private int reconnectdelay;
|
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
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final int _msgsreceived;
final int _bytesreceived;
private int warningsdropcount;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private int warningscollected;
private int invalidatecache;
private Thread.Queue qportals;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final mixed _delayederror;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private function (:void) readyforquery_cb;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final string _host;
final int _port;
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string database, user, pass;
private Thread.Condition waitforauthready;
|
03dfca | 2014-11-18 | Stephen R. van den Berg | | final Thread.Mutex _shortmux;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | final Thread.Condition _readyforcommit;
final int _waittocommit, _readyforquerycount;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
74b59e | 2015-12-20 | Martin Nilsson | | private string _sprintf(int type) {
|
443c1f | 2014-08-21 | Stephen R. van den Berg | | string res=UNDEFINED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(type) {
case 'O':
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | res=sprintf(DRIVERNAME"(%s@%s:%d/%s,%d,%d)",
|
3ac53f | 2015-07-07 | Arne Goedeke | | user,_host,_port,database,c?->socket&&c->socket->query_fd(),backendpid);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
return res;
}
|
f39097 | 2009-02-12 | 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 | |
|
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 | |
|
23914b | 2012-04-02 | Stephen R. van den Berg | |
|
bbf653 | 2012-04-13 | 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 | |
|
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 | |
|
e6d620 | 2012-04-16 | 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) | |
|
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 | |
|
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 | |
|
4d5354 | 2014-11-24 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
4d5354 | 2014-11-24 | 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) {
|
8e06a3 | 2014-09-30 | Martin Nilsson | | this::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";
}
|
8e06a3 | 2014-09-30 | Martin Nilsson | | this::user = user;
this::database = database;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | _options = options || ([]);
|
11b13b | 2014-08-16 | Martin Nilsson | |
if(!host) host = PGSQL_DEFAULT_HOST;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(has_value(host,":") && sscanf(host,"%s:%d",host,_port)!=2)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | ERROR("Error in parsing the hostname argument\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | this::_host = host;
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!_port)
_port = PGSQL_DEFAULT_PORT;
.pgsql_util.register_backend();
|
03dfca | 2014-11-18 | Stephen R. van den Berg | | _shortmux=Thread.Mutex();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | reconnect();
}
|
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) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | throwdelayederror(this);
|
11b13b | 2014-08-16 | Martin Nilsson | | string s=lastmessage*"\n";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(clear)
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage=({});
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | warningscollected=0;
|
f11ef7 | 2009-02-01 | Stephen R. van den Berg | | return sizeof(s) && s;
|
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 host_info() {
|
11b13b | 2014-08-16 | Martin Nilsson | | return sprintf("fd:%d TCP/IP %s:%d PID %d",
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | c?c->socket->query_fd():-1,_host,_port,backendpid);
|
a2014e | 2008-07-14 | 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() {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | catch {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | return c->socket->is_open();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | };
return 0;
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | 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 ping() {
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | return is_open() && !catch(c->start()->sendcmd(FLUSHSEND))
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | ? !!reconnected : -1;
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | }
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | private .pgsql_util.conxion getsocket(void|int nossl) {
|
72d9bf | 2014-11-18 | Stephen R. van den Berg | | return .pgsql_util.conxion(this,qportals,(int)nossl);
|
a2014e | 2008-07-14 | 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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void cancelquery() {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("CancelRequest\n");
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.conxion lcon=getsocket(1);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | lcon->add_int32(16)->add_int32(PG_PROTOCOL(1234,5678))
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | ->add_int32(backendpid)->add(cancelsecret)->sendcmd(FLUSHSEND);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | lcon->close();
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | #ifdef PG_DEBUGMORE
PD("Closetrace %O\n",backtrace());
#endif
|
d88e73 | 2014-11-14 | Stephen R. van den Berg | | if(c) {
|
c395a7 | 2015-12-09 | Stephen R. van den Berg | | .pgsql_util.conxion plugbuffer;
if(!catch(plugbuffer=c->start(1))) {
foreach(qportals->peek_array();;int|.pgsql_util.sql_result portal)
if(objectp(portal))
portal->_closeportal(plugbuffer);
plugbuffer->sendcmd(SENDOUT);
}
|
d88e73 | 2014-11-14 | Stephen R. van den Berg | | }
|
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 | |
|
e6d620 | 2012-04-16 | 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)
big_query(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 | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final string get_charset() {
|
571622 | 2014-11-09 | Stephen R. van den Berg | | waitauthready();
|
11b13b | 2014-08-16 | Martin Nilsson | | return _runtimeparameter[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 | |
|
4d5354 | 2014-11-24 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cbe276 | 2008-08-01 | 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();
|
11b13b | 2014-08-16 | Martin Nilsson | | return _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 | |
|
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 | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final mapping(string:mixed) getstatistics() {
|
11b13b | 2014-08-16 | Martin Nilsson | | mapping(string:mixed) stats=([
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | "warnings_dropped":warningsdropcount,
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | "current_prepared_statements":sizeof(_prepareds),
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | "current_prepared_statement_hits":totalhits,
"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
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | "messages_received":_msgsreceived,
"bytes_received":_bytesreceived,
"reconnect_count":reconnected,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | "portals_in_flight":_portalsinflight,
|
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setcachedepth(void|int newdepth) {
|
11b13b | 2014-08-16 | Martin Nilsson | | int olddepth=cachedepth;
|
65340d | 2014-08-15 | Martin Nilsson | | if(!undefinedp(newdepth) && newdepth>=0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | cachedepth=newdepth;
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int settimeout(void|int newtimeout) {
|
11b13b | 2014-08-16 | Martin Nilsson | | int oldtimeout=timeout;
|
5cb4f2 | 2014-11-28 | Stephen R. van den Berg | | if(!undefinedp(newtimeout) && newtimeout>0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | timeout=newtimeout;
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setportalbuffersize(void|int newportalbuffersize) {
|
11b13b | 2014-08-16 | Martin Nilsson | | int oldportalbuffersize=portalbuffersize;
|
65340d | 2014-08-15 | Martin Nilsson | | if(!undefinedp(newportalbuffersize) && newportalbuffersize>0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | portalbuffersize=newportalbuffersize;
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final int setfetchlimit(void|int newfetchlimit) {
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | int oldfetchlimit=_fetchlimit;
|
65340d | 2014-08-15 | Martin Nilsson | | if(!undefinedp(newfetchlimit) && newfetchlimit>=0)
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | _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) {
|
11b13b | 2014-08-16 | Martin Nilsson | | if(!glob||!sizeof(glob))
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return "%";
return replace(glob,({"*","?","\\","%","_"}),({"%","_","\\\\","\\%","\\_"}));
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string a2nls(array(string) msg) {
|
11b13b | 2014-08-16 | Martin Nilsson | | return msg*"\n"+"\n";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private string pinpointerror(void|string query,void|string offset) {
|
11b13b | 2014-08-16 | Martin Nilsson | | if(!query)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return "";
int k=(int)offset;
if(k<=0)
return MARKSTART+query+MARKEND;
return MARKSTART+(k>1?query[..k-2]:"")+MARKERROR+query[k-1..]+MARKEND;
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void connect_cb() {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("%O\n",_runtimeparameter);
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void reconnect_cb() {
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | lastmessage+=({sprintf("Reconnected to database %s",host_info())});
runcallback(backendpid,"_reconnect","");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | private array(string) showbindings(.pgsql_util.sql_result portal) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | array(string) msgs=({});
array from;
if(portal && (from = portal._params)) {
array to,paramValues;
[from,to,paramValues] = from;
if(sizeof(paramValues)) {
string val;
int i;
string fmt=sprintf("%%%ds %%3s %%.61s",max(@map(from,sizeof)));
foreach(paramValues;i;val)
msgs+=({sprintf(fmt,from[i],to[i],sprintf("%O",val))});
|
bac80c | 2010-02-15 | Stephen R. van den Berg | | }
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | return msgs;
|
bac80c | 2010-02-15 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void preplastmessage(mapping(string:string) msgresponse) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | lastmessage=({
sprintf("%s %s:%s %s\n (%s:%s:%s)",
msgresponse.S,msgresponse.C,msgresponse.P||"",
msgresponse.M,msgresponse.F||"",msgresponse.R||"",
msgresponse.L||"")});
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void waitauthready() {
|
571622 | 2014-11-09 | Stephen R. van den Berg | | if(waitforauthready) {
|
60f4ad | 2016-02-17 | Stephen R. van den Berg | | PD("%d Wait for auth ready %O\n",
c?->socket&&c->socket->query_fd(),backtrace()[-2]);
|
03dfca | 2014-11-18 | Stephen R. van den Berg | | Thread.MutexKey lock=_shortmux->lock();
|
d4ef20 | 2014-12-01 | Stephen R. van den Berg | | catch(PT(waitforauthready->wait(lock)));
|
571622 | 2014-11-09 | Stephen R. van den Berg | | lock=0;
|
3ac53f | 2015-07-07 | Arne Goedeke | | PD("%d Wait for auth ready released.\n",c?->socket&&c->socket->query_fd());
|
571622 | 2014-11-09 | Stephen R. van den Berg | | }
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private inline mixed callout(function(mixed ...:void) f,
|
2c9800 | 2014-11-10 | Stephen R. van den Berg | | float|int delay,mixed ... args) {
return .pgsql_util.local_backend->call_out(f,delay,@args);
}
|
7f73f4 | 2014-12-16 | Stephen R. van den Berg | | private int|.pgsql_util.sql_result portal;
#ifdef PG_DEBUG
private string datarowdebug;
private int datarowdebugcount;
#endif
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | final void _processloop(.pgsql_util.conxion ci) {
|
7f73f4 | 2014-12-16 | Stephen R. van den Berg | | (c=ci)->socket->set_id(procmessage);
cancelsecret=0;
portal=0;
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | Stdio.Buffer plugbuffer=Stdio.Buffer()->add_int32(PG_PROTOCOL(3,0));
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(user)
|
c9c7fc | 2014-11-26 | Stephen R. van den Berg | | plugbuffer->add("user\0",user,0);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(database)
|
c9c7fc | 2014-11-26 | Stephen R. van den Berg | | plugbuffer->add("database\0",database,0);
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | _options.reconnect=undefinedp(_options.reconnect) || _options.reconnect;
|
b840fa | 2014-11-19 | Stephen R. van den Berg | | foreach(_options-.pgsql_util.censoroptions; string name; mixed value)
|
c9c7fc | 2014-11-26 | Stephen R. van den Berg | | plugbuffer->add(name,0,(string)value,0);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | plugbuffer->add_int8(0);
PD("%O\n",(string)plugbuffer);
|
3c1381 | 2014-11-19 | Stephen R. van den Berg | | if(catch(ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(SENDOUT))) {
|
878197 | 2014-11-21 | Stephen R. van den Berg | | #ifdef PG_DEBUG
if(!_options)
PD("_options is zero, %O\n",this);
#endif
if(_options && _options.reconnect)
|
3c1381 | 2014-11-19 | Stephen R. van den Berg | | _connectfail();
else
|
3a04a2 | 2014-12-16 | Stephen R. van den Berg | | destruct(waitforauthready);
} else
procmessage();
}
|
7f73f4 | 2014-12-16 | Stephen R. van den Berg | | }
private void procmessage() {
int terminating=0;
.pgsql_util.conxion ci=c;
.pgsql_util.conxiin cr=ci->i;
mixed err;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | PD("Processloop\n");
void showportal(int msgtype) {
if(objectp(portal))
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | PD("%d<%O %d %c switch portal\n",
ci->socket->query_fd(),portal._portalname,++ci->queueinidx,msgtype);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | else if(portal>0)
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | PD("%d<Sync %d %d %c portal\n",
ci->socket->query_fd(),++ci->queueinidx,portal,msgtype);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | };
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | for(;;) {
err=catch {
#ifdef PG_DEBUG
if(!portal && datarowdebug) {
PD("%s rows %d\n",datarowdebug,datarowdebugcount);
datarowdebug=0; datarowdebugcount=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
7f73f4 | 2014-12-16 | Stephen R. van den Berg | | if(!sizeof(cr)) {
Thread.MutexKey lock=cr->fillreadmux->lock();
if(!sizeof(cr)) {
cr->procmsg=1;
lock=0;
return;
}
lock=0;
}
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int msgtype=cr->read_int8();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!portal) {
portal=qportals->try_read();
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #ifdef PG_DEBUG
showportal(msgtype);
#endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int msglen=cr->read_int32();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _msgsreceived++;
_bytesreceived+=1+msglen;
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | int errtype=NOERROR;
|
531835 | 2014-11-22 | Stephen R. van den Berg | | PD("%d<",ci->socket->query_fd());
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(msgtype) {
|
805925 | 2014-11-25 | Stephen R. van den Berg | | array getcols() {
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int bintext=cr->read_int8();
int cols=cr->read_int16();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
array a;
msglen-=4+1+2+2*cols;
foreach(a=allocate(cols,([]));;mapping m)
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | m.type=cr->read_int16();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #else
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | cr->consume(cols<<1);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif // Discard column info, and make it line oriented
|
805925 | 2014-11-25 | Stephen R. van den Berg | | return ({ ({(["name":"line"])}), ({bintext?BYTEAOID:TEXTOID}) });
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | };
array(string) reads() {
#ifdef PG_DEBUG
if(msglen<1)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
array ret=({}),aw=({0});
do {
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | string w=cr->read_cstring();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=sizeof(w)+1; aw[0]=w; ret+=aw;
} while(msglen);
return ret;
};
mapping(string:string) getresponse() {
mapping(string:string) msgresponse=([]);
msglen-=4;
foreach(reads();;string f)
if(sizeof(f))
msgresponse[f[..0]]=f[1..];
PD("%O\n",msgresponse);
return msgresponse;
};
case 'R': {
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("Authentication ");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string sendpass;
msglen-=4+4;
|
907a7a | 2014-11-20 | Stephen R. van den Berg | | int authtype=cr->read_int32();
switch(authtype) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 0:
PD("Ok\n");
.pgsql_util.local_backend->remove_call_out(reconnect);
reconnectdelay=0;
cancelsecret="";
break;
case 2:
PD("KerberosV5\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 3:
PD("ClearTextPassword\n");
sendpass=pass;
break;
case 4:
PD("CryptPassword\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 5:
PD("MD5Password\n");
#ifdef PG_DEBUG
if(msglen<4)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
#define md5hex(x) String.string2hex(Crypto.MD5.hash(x))
sendpass=md5hex(pass+user);
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | sendpass="md5"+md5hex(sendpass+cr->read(msglen));
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen=0;
#endif
break;
case 6:
PD("SCMCredential\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 7:
PD("GSS\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 9:
PD("SSPI\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 8:
PD("GSSContinue\n");
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | cancelsecret=cr->read(msglen);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
if(msglen<1)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen=0;
#endif
break;
default:
PD("Unknown Authentication Method %c\n",authtype);
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
}
switch(errtype) {
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | case NOERROR:
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(cancelsecret!="")
|
c9c7fc | 2014-11-26 | Stephen R. van den Berg | | ci->start()->add_int8('p')->add_hstring(({sendpass,0}),4,4)
->sendcmd(SENDOUT);
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | default:
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | case PROTOCOLUNSUPPORTED:
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | ERROR("Unsupported authenticationmethod %c\n",authtype);
break;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | }
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case 'K':
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | msglen-=4+4;backendpid=cr->read_int32();
cancelsecret=cr->read(msglen);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("BackendKeyData %O\n",cancelsecret);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen=0;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 'S': {
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("ParameterStatus ");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
array(string) ts=reads();
#ifdef PG_DEBUG
if(sizeof(ts)==2) {
#endif
_runtimeparameter[ts[0]]=ts[1];
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | PD("%O=%O\n",ts[0],ts[1]);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case '3':
#ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("CloseComplete\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 'Z':
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | backendstatus=cr->read_int8();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen-=4+1;
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("ReadyForQuery %c\n",backendstatus);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | | for(;objectp(portal);portal=qportals->read()) {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #ifdef PG_DEBUG
showportal(msgtype);
#endif
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_purgeportal();
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | }
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | foreach(qportals->peek_array();;.pgsql_util.sql_result qp) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(objectp(qp) && qp._synctransact && qp._synctransact<=portal) {
PD("Checking portal %O %d<=%d\n",
qp._portalname,qp._synctransact,portal);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | qp->_purgeportal();
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | }
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | }
portal=0;
_readyforquerycount--;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(readyforquery_cb)
readyforquery_cb(),readyforquery_cb=0;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | destruct(waitforauthready);
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case '1':
#ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("ParseComplete\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 't': {
array a;
#ifdef PG_DEBUG
|
805925 | 2014-11-25 | Stephen R. van den Berg | | int cols=cr->read_int16();
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O ParameterDescription %d values\n",portal._query,cols);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4+2+4*cols;
|
805925 | 2014-11-25 | Stephen R. van den Berg | | a=cr->read_ints(cols,4);
#else
a=cr->read_ints(cr->read_int16(),4);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
#ifdef PG_DEBUGMORE
PD("%O\n",a);
#endif
if(portal._tprepared)
portal._tprepared.datatypeoid=a;
|
531835 | 2014-11-22 | Stephen R. van den Berg | | Thread.Thread(portal->_preparebind,a);
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case 'T': {
|
805925 | 2014-11-25 | Stephen R. van den Berg | | array a,at;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int cols=cr->read_int16();
|
805925 | 2014-11-25 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("RowDescription %d columns %O\n",cols,portal._query);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4+2;
#endif
|
805925 | 2014-11-25 | Stephen R. van den Berg | | at=allocate(cols);
foreach(a=allocate(cols);int i;)
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | {
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | string s=cr->read_cstring();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mapping(string:mixed) res=(["name":s]);
#ifdef PG_DEBUG
msglen-=sizeof(s)+1+4+2+4+2+4+2;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | res.tableoid=cr->read_int32()||UNDEFINED;
res.tablecolattr=cr->read_int16()||UNDEFINED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #else
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | cr->consume(6);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
805925 | 2014-11-25 | Stephen R. van den Berg | | at[i]=cr->read_int32();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
2e9033 | 2014-11-25 | Stephen R. van den Berg | | res.type=at[i];
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | {
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int len=cr->read_sint(2);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | res.length=len>=0?len:"variable";
}
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | res.atttypmod=cr->read_int32();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | res.formatcode=cr->read_int16();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #else
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | cr->consume(8);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
a[i]=res;
}
#ifdef PG_DEBUGMORE
PD("%O\n",a);
#endif
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(portal._forcetext)
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal->_setrowdesc(a,at);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | else {
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal->_processrowdesc(a,at);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | portal=0;
}
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case 'n': {
#ifdef PG_DEBUG
msglen-=4;
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("NoData %O\n",portal._query);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal._fetchlimit=0;
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal
->_processrowdesc(.pgsql_util.emptyarray,.pgsql_util.emptyarray);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal=0;
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case 'H':
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal->_processrowdesc(@getcols());
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("CopyOutResponse %O\n",portal._query);
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case '2': {
mapping tp;
#ifdef PG_DEBUG
msglen-=4;
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O BindComplete\n",portal._portalname);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(tp=portal._tprepared) {
int tend=gethrtime();
int tstart=tp.trun;
if(tend==tstart)
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | m_delete(_prepareds,portal._query);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | else {
tp.hits++;
totalhits++;
if(!tp.preparedname) {
if(sizeof(portal._preparedname))
tp.preparedname=portal._preparedname;
tstart=tend-tstart;
if(!tp.tparse || tp.tparse>tstart)
tp.tparse=tstart;
}
tp.trunstart=tend;
}
}
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
}
|
aed714 | 2014-11-18 | Stephen R. van den Berg | | case 'D':
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#ifdef PG_DEBUG
|
cd7f23 | 2014-03-01 | Martin Nilsson | | #ifdef PG_DEBUGMORE
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O DataRow %d bytes\n",portal._portalname,msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | datarowdebugcount++;
if(!datarowdebug)
datarowdebug=sprintf(
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | "%O DataRow %d bytes",portal._portalname,msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
|
aed714 | 2014-11-18 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen=
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
aed714 | 2014-11-18 | Stephen R. van den Berg | | portal->_decodedata(msglen,_runtimeparameter[CLIENT_ENCODING]);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 's':
#ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O PortalSuspended\n",portal._portalname);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#endif
portal=0;
break;
case 'C': {
msglen-=4;
#ifdef PG_DEBUG
if(msglen<1)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | string s=cr->read(msglen-1);
|
aed714 | 2014-11-18 | Stephen R. van den Berg | | portal->_storetiming();
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O CommandComplete %O\n",portal._portalname,s);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | if(cr->read_int8())
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen=0;
#else
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | cr->consume(1);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
05b1f5 | 2014-11-17 | Stephen R. van den Berg | | portal->_releasesession(s);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal=0;
break;
}
case 'I':
#ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("EmptyQueryResponse %O\n",portal._portalname);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#endif
portal->_releasesession();
portal=0;
break;
case 'd':
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O CopyData\n",portal._portalname);
|
aed714 | 2014-11-18 | Stephen R. van den Berg | | portal->_storetiming();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#ifdef PG_DEBUG
if(msglen<0)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | portal->_processdataready(({cr->read(msglen)}),msglen);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen=0;
#endif
break;
case 'G':
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal->_setrowdesc(@getcols());
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O CopyInResponse\n",portal._portalname);
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | portal._state=COPYINPROGRESS;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 'c':
#ifdef PG_DEBUG
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O CopyDone\n",portal._portalname);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=4;
#endif
portal=0;
break;
case 'E': {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | if(!_readyforquerycount)
sendsync();
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("%O ErrorResponse %O\n",
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | objectp(portal)&&(portal._portalname||portal._preparedname),
objectp(portal)&&portal._query);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mapping(string:string) msgresponse;
msgresponse=getresponse();
|
11b13b | 2014-08-16 | Martin Nilsson | | warningsdropcount+=warningscollected;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | warningscollected=0;
switch(msgresponse.C) {
case "P0001":
lastmessage=({sprintf("%s: %s",msgresponse.S,msgresponse.M)});
USERERROR(a2nls(lastmessage
+({pinpointerror(portal._query,msgresponse.P)})
+showbindings(portal)));
|
d88e73 | 2014-11-14 | Stephen R. van den Berg | | case "53000":case "53100":case "53200":case "53300":case "53400":
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | case "57P01":case "57P02":case "57P03":case "57P04":case "3D000":
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | preplastmessage(msgresponse);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD(a2nls(lastmessage));throw(0);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case "08P01":case "42P05":
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case "XX000":case "42883":case "42P01":
invalidatecache=1;
default:
preplastmessage(msgresponse);
if(msgresponse.D)
lastmessage+=({msgresponse.D});
if(msgresponse.H)
lastmessage+=({msgresponse.H});
lastmessage+=({
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | pinpointerror(objectp(portal)&&portal._query,msgresponse.P)+
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | pinpointerror(msgresponse.q,msgresponse.p)});
if(msgresponse.W)
lastmessage+=({msgresponse.W});
|
4a619c | 2014-11-08 | Stephen R. van den Berg | | if(objectp(portal))
lastmessage+=showbindings(portal);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(msgresponse.S) {
case "PANIC":werror(a2nls(lastmessage));
}
USERERROR(a2nls(lastmessage));
}
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | if(objectp(portal))
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | portal->_releasesession();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
}
case 'N': {
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("NoticeResponse\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mapping(string:string) msgresponse;
msgresponse=getresponse();
if(clearmessage) {
warningsdropcount+=warningscollected;
clearmessage=warningscollected=0;
lastmessage=({});
}
warningscollected++;
lastmessage=({sprintf("%s %s: %s",
msgresponse.S,msgresponse.C,msgresponse.M)});
|
38f281 | 2015-09-18 | Stephen R. van den Berg | | if(has_prefix(msgresponse.C,"53")||has_prefix(msgresponse.C,"57P")) {
preplastmessage(msgresponse);
PD(a2nls(lastmessage));throw(0);
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
}
case 'A': {
|
10fa55 | 2014-11-18 | Stephen R. van den Berg | | PD("NotificationResponse\n");
|
11b13b | 2014-08-16 | Martin Nilsson | | msglen-=4+4;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | int pid=cr->read_int32();
|
11b13b | 2014-08-16 | Martin Nilsson | | string condition,extrainfo=UNDEFINED;
{
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | array(string) ts=reads();
switch(sizeof(ts)) {
#if PG_DEBUG
case 0:
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
default:
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
case 2:
extrainfo=ts[1];
case 1:
condition=ts[0];
}
}
PD("%d %s\n%s\n",pid,condition,extrainfo);
runcallback(pid,condition,extrainfo);
break;
}
default:
if(msgtype!=-1) {
string s;
PD("Unknown message received %c\n",msgtype);
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | s=cr->read(msglen-=4);PD("%O\n",s);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen=0;
#endif
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLUNSUPPORTED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else {
lastmessage+=({
sprintf("Connection lost to database %s@%s:%d/%s %d\n",
user,_host,_port,database,backendpid)});
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(!waitforauthready)
throw(0);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | USERERROR(a2nls(lastmessage));
}
break;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
if(msglen)
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | errtype=PROTOCOLERROR;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string msg;
switch(errtype) {
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | case PROTOCOLUNSUPPORTED:
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msg=sprintf("Unsupported servermessage received %c\n",msgtype);
break;
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | case PROTOCOLERROR:
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msg=sprintf("Protocol error with database %s",host_info());
break;
|
5bbace | 2014-11-18 | Stephen R. van den Berg | | case NOERROR:
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | continue;
}
ERROR(a2nls(lastmessage+=({msg})));
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | };
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | if(err==MAGICTERMINATE) {
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | ci->start()->add("X\0\0\0\4")->sendcmd(SENDOUT);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | terminating=1;
if(!sizeof(ci))
break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(stringp(err)) {
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.sql_result or;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(!objectp(or=portal))
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | or=this;
if(!or._delayederror)
or._delayederror=err;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(objectp(portal))
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | portal->_releasesession();
portal=0;
|
eafa30 | 2014-11-14 | Stephen R. van den Berg | | if(!waitforauthready)
continue;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
d88e73 | 2014-11-14 | Stephen R. van den Berg | | PD("Closing database processloop %O\n",err);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _delayederror=err;
|
d88e73 | 2014-11-14 | Stephen R. van den Berg | | for(;objectp(portal);portal=qportals->read())
if(objectp(portal)) {
#ifdef PG_DEBUG
showportal(0);
#endif
portal->_purgeportal();
}
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | if(!ci->close() && !terminating && _options.reconnect)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _connectfail();
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | else
|
eafa30 | 2014-11-14 | Stephen R. van den Berg | | destruct(waitforauthready);
if(err && !stringp(err))
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | throw(err);
|
a2014e | 2008-07-14 | 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 | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void close() {
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | catch(cancelquery());
catch(c->sendterminate());
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | c=0;
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | destruct(waitforauthready);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | protected void destroy() {
|
4f2ed8 | 2014-11-15 | Stephen R. van den Berg | | catch(close());
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | .pgsql_util.unregister_backend();
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void _connectfail(void|mixed err) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Connect failed %O reconnectdelay %d\n",err,reconnectdelay);
|
c7de86 | 2014-11-20 | Stephen R. van den Berg | | destruct(waitforauthready);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!err || reconnectdelay) {
int tdelay;
switch(tdelay=reconnectdelay) {
case 0:
reconnectdelay=RECONNECTDELAY;
break;
default:
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(err)
_delayederror=err;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | if(_options.reconnect!=-1)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | return;
reconnectdelay=RECONNECTBACKOFF;
break;
}
|
03dfca | 2014-11-18 | Stephen R. van den Berg | | Thread.MutexKey lock=_shortmux->lock();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!waitforauthready)
waitforauthready=Thread.Condition();
lock=0;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Schedule reconnect in %ds\n",tdelay);
_delayederror=0;
|
2c9800 | 2014-11-10 | Stephen R. van den Berg | | callout(reconnect,tdelay,1);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | } else if(err)
_delayederror=err;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | private int reconnect() {
int recon=0;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("(Re)connect\n");
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | {
|
03dfca | 2014-11-18 | Stephen R. van den Berg | | Thread.MutexKey lock=_shortmux->lock();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(waitforauthready) {
lock=0;
|
3b5d77 | 2015-12-23 | Stephen R. van den Berg | | return 1;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
waitforauthready=Thread.Condition();
lock=0;
}
if(c) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Close old connection\n");
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | reconnected++;recon=1;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #ifdef PG_STATS
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | prepstmtused=0;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | c->sendterminate();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | c=0;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Flushing old cache\n");
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(_prepareds;;mapping tp)
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | m_delete(tp,"preparedname");
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | if(!_options.reconnect)
ERROR("Lost connection to database %s:%d\n",_host,_port);
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | }
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Actually start to connect\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | qportals=Thread.Queue();
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | _readyforcommit=Thread.Condition();
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | _readyforquerycount=1;
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | _waittocommit=0;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | qportals->write(1);
|
3a04a2 | 2014-12-16 | Stephen R. van den Berg | | if(!getsocket()) {
string msg=sprintf("Couldn't connect to database on %s:%d",_host,_port);
if(force) {
if(!sizeof(lastmessage) || lastmessage[sizeof(lastmessage)-1]!=msg)
lastmessage+=({msg});
return 0;
} else
ERROR(msg+"\n");
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _runtimeparameter=([]);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | _unnamedportalmux=Thread.Mutex();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | unnamedstatement=Thread.Mutex();
|
cab281 | 2015-12-23 | Stephen R. van den Berg | | readyforquery_cb=recon?reconnect_cb:connect_cb;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _portalsinflight=0;
|
53b379 | 2010-03-23 | Stephen R. van den Berg | | return 1;
|
a2014e | 2008-07-14 | 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 | | }
|
0fb574 | 2014-11-13 | Stephen R. van den Berg | | private void reset_dbsession() {
big_query("ROLLBACK");
big_query("RESET ALL");
big_query("CLOSE ALL");
big_query("DISCARD TEMP");
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void resync_cb() {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(backendstatus) {
case 'T':case 'E':
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(_prepareds;;mapping tp) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | m_delete(tp,"datatypeoid");
m_delete(tp,"datarowdesc");
|
805925 | 2014-11-25 | Stephen R. van den Berg | | 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 | | }
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void sendsync() {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | _readyforquerycount++;
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | c->start()->sendcmd(SYNCSEND);
|
3e8df2 | 2014-10-29 | 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 | |
|
e7621f | 2009-02-02 | 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;
|
878197 | 2014-11-21 | Stephen R. van den Berg | | if(is_open()) {
err = catch {
PD("Portalsinflight: %d\n",_portalsinflight);
if(!waitforauthready) {
readyforquery_cb=resync_cb;
sendsync();
}
return;
};
PD("%O\n",err);
}
|
74b605 | 2014-11-20 | Stephen R. van den Berg | | if(!reconnect()&&sizeof(lastmessage))
|
6b81f4 | 2012-04-10 | Stephen R. van den Berg | | ERROR(a2nls(lastmessage));
|
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 | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void select_db(string dbname) {
|
11b13b | 2014-08-16 | Martin Nilsson | | database=dbname;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | reconnect();
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | reconnected=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
b133b0 | 2008-08-06 | 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 | |
|
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final void set_notify_callback(string condition,
|
a2014e | 2008-07-14 | 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) {
|
11b13b | 2014-08-16 | Martin Nilsson | | if(!notify_cb)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | m_delete(notifylist,condition);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | else {
|
11b13b | 2014-08-16 | Martin Nilsson | | array old=notifylist[condition];
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(!old)
old=({notify_cb});
if(selfnotify||args)
old+=({selfnotify});
if(args)
old+=args;
notifylist[condition]=old;
}
}
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private void runcallback(int pid,string condition,string extrainfo) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array cb;
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | if((cb=notifylist[condition]||notifylist[""])
|
11b13b | 2014-08-16 | Martin Nilsson | | && (pid!=backendpid || sizeof(cb)>1 && cb[1]))
|
2c9800 | 2014-11-10 | Stephen R. van den Berg | | callout(cb[0],0,pid,condition,extrainfo,@cb[2..]);
|
b133b0 | 2008-08-06 | 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();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string r=_runtimeparameter.standard_conforming_strings;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(r && r=="on")
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 | |
|
cb2623 | 2008-08-04 | 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) {
|
71fc54 | 2014-08-13 | Stephen R. van den Berg | | big_query(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) {
|
71fc54 | 2014-08-13 | Stephen R. van den Berg | | big_query(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();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | return DRIVERNAME"/"+(_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) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array row,ret=({});
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.sql_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)]));
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | while(row=res->fetch_row())
ret+=({row[0]});
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) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array row,ret=({});
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.sql_result res=big_query(
|
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)]));
while(row=res->fetch_row())
ret+=({row[0]});
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) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array row, ret=({});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string schema=UNDEFINED;
sscanf(table||"*", "%s.%s", schema, table);
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.sql_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 | | {
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",
]);
|
16ce8b | 2014-09-12 | 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])
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | field=nf;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | colnames[i]=field;
}
}
#define delifzero(m,field) if(!(m)[field]) m_delete(m,field)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | while(row=res->fetch_row()) {
|
11b13b | 2014-08-16 | Martin Nilsson | | 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");
ret+=({m});
}
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final string status_commit() {
|
11b13b | 2014-08-16 | Martin Nilsson | | return trbackendst(backendstatus);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
838482 | 2014-11-12 | Stephen R. van den Berg | | private inline void closestatement(
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.conxion|.pgsql_util.bufcon plugbuffer,string oldprep) {
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | .pgsql_util.closestatement(plugbuffer,oldprep);
}
|
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 | | }
|
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 | |
|
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 | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
17b753 | 2008-07-30 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final .pgsql_util.sql_result big_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings,
void|int _alltyped) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | throwdelayederror(this);
|
11b13b | 2014-08-16 | Martin Nilsson | | string preparedname="";
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | int forcecache=-1, forcetext=_options.text_query;
int syncparse=zero_type(_options.sync_parse)?-1:_options.sync_parse;
|
571622 | 2014-11-09 | Stephen R. van den Berg | | if(waitforauthready)
waitauthready();
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | | string cenc=_runtimeparameter[CLIENT_ENCODING];
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | switch(cenc) {
case UTF8CHARSET:
q=string_to_utf8(q);
break;
default:
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;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(bindings) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(forcetext)
q = .sql_util.emulate_bindings(q, bindings, this), paramValues=({});
else {
int pi=0,rep=0;
paramValues=allocate(sizeof(bindings));
from=allocate(sizeof(bindings));
array(string) to=allocate(sizeof(bindings));
foreach(bindings; mixed name; mixed value) {
if(stringp(name)) {
if(name[0]!=':')
name=":"+name;
if(name[1]=='_') {
switch(name) {
case ":_cache":
forcecache=(int)value;
break;
case ":_text":
forcetext=(int)value;
break;
|
d1e1c0 | 2014-11-10 | Stephen R. van den Berg | | case ":_sync":
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | | syncparse=(int)value;
break;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | }
continue;
}
if(!has_value(q,name))
continue;
}
from[rep]=name;
string rval;
if(multisetp(value))
rval=indices(value)*",";
else {
paramValues[pi++]=value;
rval=sprintf("$%d",pi);
}
to[rep++]=rval;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(rep--)
q=replace(q,from=from[..rep],to=to[..rep]);
paramValues= pi ? paramValues[..pi-1] : ({});
from=({from,to,paramValues});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | paramValues=({});
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | | if(String.width(q)>8)
ERROR("Wide string literals in %O not supported\n",q);
|
8a4ac4 | 2009-01-24 | Stephen R. van den Berg | | 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;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | int tstart;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(!forcetext && forcecache==1
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | || forcecache!=0
&& (sizeof(q)>=MINPREPARELENGTH || .pgsql_util.cachealways[q])) {
|
c395a7 | 2015-12-09 | Stephen R. van den Berg | | object plugbuffer;
while(catch(plugbuffer=c->start()))
reconnect();
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | if(tp=_prepareds[q]) {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | if(tp.preparedname) {
#ifdef PG_STATS
prepstmtused++;
#endif
preparedname=tp.preparedname;
} else if((tstart=tp.trun)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | && tp.tparse*FACTORPLAN>=tstart
|
1412f3 | 2014-11-13 | Stephen R. van den Berg | | && (undefinedp(_options.cache_autoprepared_statements)
|| _options.cache_autoprepared_statements))
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | preparedname=PREPSTMTPREFIX+int2hex(pstmtcount++);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else {
|
11b13b | 2014-08-16 | Martin Nilsson | | if(totalhits>=cachedepth)
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(_prepareds;string ind;tp) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int oldhits=tp.hits;
totalhits-=oldhits-(tp.hits=oldhits>>1);
if(oldhits<=1) {
closestatement(plugbuffer,tp.preparedname);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | m_delete(_prepareds,ind);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | }
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | if(forcecache!=1 && .pgsql_util.createprefix->match(q)) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | invalidatecache=1;
|
11b13b | 2014-08-16 | Martin Nilsson | | tp=UNDEFINED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | _prepareds[q]=tp=([]);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(invalidatecache) {
|
11b13b | 2014-08-16 | Martin Nilsson | | invalidatecache=0;
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(_prepareds;;mapping np) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | closestatement(plugbuffer,np.preparedname);
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | m_delete(np,"preparedname");
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | }
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(sizeof(plugbuffer)) {
PD("%O\n",(string)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);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | tstart=gethrtime();
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | } else
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tp=UNDEFINED;
|
39e1c4 | 2014-11-14 | Stephen R. van den Berg | | .pgsql_util.sql_result portal;
portal=.pgsql_util.sql_result(this,c,q,
|
5cb4f2 | 2014-11-28 | Stephen R. van den Berg | | portalbuffersize,_alltyped,from,forcetext,timeout);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal._tprepared=tp;
#ifdef PG_STATS
portalsopened++;
#endif
clearmessage=1;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | if(forcetext) {
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal._unnamedportalkey=_unnamedportalmux->lock(1);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | portal._portalname="";
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal->_openportal();
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | _readyforquerycount++;
Thread.MutexKey lock=unnamedstatement->lock(1);
|
c9c7fc | 2014-11-26 | Stephen R. van den Berg | | c->start(1)->add_int8('Q')->add_hstring(({q,0}),4,4)
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | ->sendcmd(FLUSHLOGSEND,portal);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | lock=0;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("Simple query: %O\n",q);
} else {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | object plugbuffer;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!sizeof(preparedname) || !tp || !tp.preparedname) {
if(!sizeof(preparedname))
preparedname=
|
f91bc2 | 2014-11-10 | Stephen R. van den Berg | | (portal._unnamedstatementkey=
(syncparse?unnamedstatement->lock:unnamedstatement->trylock)(1))
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | ? "" : PTSTMTPREFIX+int2hex(ptstmtcount++);
|
d72e4c | 2014-11-13 | Stephen R. van den Berg | | else if(syncparse)
portal._unnamedstatementkey=unnamedstatement->lock(1);
|
7214f6 | 2014-11-24 | Stephen R. van den Berg | | PD("Parse statement %O=%O\n",preparedname,q);
plugbuffer=c->start()->add_int8('P')
->add_hstring(({preparedname,0,q,"\0\0\0"}),4,4)
#if 0
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
|
934f5f | 2014-11-20 | Stephen R. van den Berg | |
|
7214f6 | 2014-11-24 | Stephen R. van den Berg | | ->add(PGFLUSH)
#endif
;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
9d350f | 2014-11-18 | Stephen R. van den Berg | | portal._preparedname=preparedname;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!tp || !tp.datatypeoid) {
PD("Describe statement %O\n",preparedname);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | (plugbuffer||c->start())->add_int8('D')
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | ->add_hstring(({'S',preparedname,0}),4,4)->sendcmd(FLUSHSEND,portal);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(plugbuffer)
|
2eef0b | 2014-11-15 | Stephen R. van den Berg | | plugbuffer->sendcmd(KEEP);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_STATS
skippeddescribe++;
#endif
|
805925 | 2014-11-25 | Stephen R. van den Berg | | portal->_setrowdesc(tp.datarowdesc,tp.datarowtypes);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
if((portal._tprepared=tp) && tp.datatypeoid) {
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | mixed e=catch(portal->_preparebind(tp.datatypeoid));
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(e && !portal._delayederror)
throw(e);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
}
throwdelayederror(portal);
return portal;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final .pgsql_util.sql_result streaming_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings) {
|
11b13b | 2014-08-16 | Martin Nilsson | | return big_query(q,bindings);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
b15672 | 2008-08-25 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7c5c8 | 2014-11-24 | Stephen R. van den Berg | | final .pgsql_util.sql_result big_typed_query(string q,
|
91d654 | 2014-11-10 | Stephen R. van den Berg | | void|mapping(string|int:mixed) bindings) {
|
11b13b | 2014-08-16 | Martin Nilsson | | return big_query(q,bindings,1);
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | }
|