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__
|
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 | |
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | int _fetchlimit=FETCHLIMIT;
Thread.Mutex _unnamedportalmux;
protected Thread.Mutex unnamedstatement;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int _portalsinflight;
protected .pgsql_util.PGassist c;
protected string cancelsecret;
protected int backendpid;
protected int backendstatus;
mapping(string:mixed) options;
protected array(string) lastmessage=({});
protected int clearmessage;
protected mapping(string:array(mixed)) notifylist=([]);
|
26c0ad | 2009-02-28 | Stephen R. van den Berg | | mapping(string:string) _runtimeparameter;
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | mapping(string:mapping(string:mixed)) _prepareds=([]);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | protected int pstmtcount;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | protected int ptstmtcount;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int _pportalcount;
protected int totalhits;
protected int cachedepth=STATEMENTCACHEDEPTH;
protected int timeout=QUERYTIMEOUT;
protected int portalbuffersize=PORTALBUFFERSIZE;
protected int reconnected;
protected int reconnectdelay;
#ifdef PG_STATS
protected int skippeddescribe;
protected int portalsopened;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | protected int prepstmtused;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | int _msgsreceived;
int _bytesreceived;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | protected int warningsdropcount;
protected int warningscollected;
protected int invalidatecache;
protected Thread.Queue qportals;
mixed _delayederror;
protected function (:void) readyforquery_cb;
string _host;
protected string database, user, pass;
int _port;
protected Thread.Mutex waitforauth;
protected Thread.Condition waitforauthready;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | int _readyforquerycount;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | protected string _sprintf(int type, void|mapping flags) {
|
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':
res=sprintf(DRIVERNAME"(%s@%s:%d/%s,%d)",
user,_host,_port,database,backendpid);
break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
return res;
}
|
1fe399 | 2008-07-16 | Peter Bortas | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
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 | |
|
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 | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e6d620 | 2012-04-16 | 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;
this::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();
waitforauth=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 | |
|
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string error(void|int clear) {
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int is_open() {
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int ping() {
return is_open() && !catch(c->start()->sendcmd(flushsend))
? !!reconnected : -1;
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected object getsocket(void|int nossl) {
return .pgsql_util.PGassist(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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void cancelquery() {
PD("CancelRequest\n");
object lcon=getsocket(1);
lcon->add_int32(16)->add_int32(PG_PROTOCOL(1234,5678))
->add_int32(backendpid)->add(cancelsecret)->sendcmd(flushsend);
lcon->close();
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | #ifdef PG_DEBUGMORE
PD("Closetrace %O\n",backtrace());
#endif
object plugbuffer=c->start(1);
foreach(qportals->peek_array();;object portal)
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(objectp(portal))
portal->_closeportal(plugbuffer);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | plugbuffer->sendcmd(sendout);
|
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void set_charset(string charset) {
|
11b13b | 2014-08-16 | Martin Nilsson | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string get_charset() {
|
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 | |
|
e6d620 | 2012-04-16 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
cbe276 | 2008-08-01 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mapping(string:string) getruntimeparameters() {
|
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 | |
|
ed62b5 | 2014-11-02 | Martin Nilsson | |
|
13d29c | 2009-04-16 | Henrik Grubbström (Grubba) | |
|
ed62b5 | 2014-11-02 | Martin Nilsson | |
|
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 | |
|
ed62b5 | 2014-11-02 | Martin Nilsson | |
|
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int settimeout(void|int newtimeout) {
|
11b13b | 2014-08-16 | Martin Nilsson | | int oldtimeout=timeout;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!undefinedp(newtimeout) && newtimeout>0) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | timeout=newtimeout;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(c)
c->timeout=timeout;
}
|
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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;
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected 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,({"*","?","\\","%","_"}),({"%","_","\\\\","\\%","\\_"}));
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected string a2nls(array(string) msg) {
|
11b13b | 2014-08-16 | Martin Nilsson | | return msg*"\n"+"\n";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected 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;
}
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | protected void connect_cb() {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("%O\n",_runtimeparameter);
}
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | protected void reconnect_cb() {
lastmessage+=({sprintf("Reconnected to database %s",host_info())});
runcallback(backendpid,"_reconnect","");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
protected array(string) showbindings(object portal) {
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 | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | protected void preplastmessage(mapping(string:string) msgresponse) {
lastmessage=({
sprintf("%s %s:%s %s\n (%s:%s:%s)",
msgresponse.S,msgresponse.C,msgresponse.P||"",
msgresponse.M,msgresponse.F||"",msgresponse.R||"",
msgresponse.L||"")});
}
protected void storetiming(object portal) {
mapping(string:mixed) tp=portal._tprepared;
tp.trun=gethrtime()-tp.trunstart;
m_delete(tp,"trunstart");
portal._tprepared = UNDEFINED;
}
final void _processloop(object ci) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | int terminating=0;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | int|.pgsql_util.pgsql_result portal;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | mixed err;
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | object plugbuffer=Stdio.Buffer()->add_int32(PG_PROTOCOL(3,0));
if(user)
plugbuffer->add("user\0")->add(user)->add_int8(0);
if(database)
plugbuffer->add("database\0")->add(database)->add_int8(0);
options->reconnect=undefinedp(options->reconnect) || options->reconnect;
foreach(options
-(<"use_ssl","force_ssl","cache_autoprepared_statements","reconnect",
"text_query","is_superuser","server_encoding","server_version",
"integer_datetimes","session_authorization">);
string name;mixed value)
plugbuffer->add(name)->add_int8(0)->add((string)value)->add_int8(0);
plugbuffer->add_int8(0);
PD("%O\n",(string)plugbuffer);
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | ci->start()->add_hstring(plugbuffer,4,4)->sendcmd(sendout);
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | cancelsecret=0;
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | PD("Processloop\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string datarowdebug;
int datarowdebugcount;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | |
void showportal(int msgtype) {
if(objectp(portal))
PD("<%O %d %c switch portal\n",
portal._portalname,++ci->queueinidx,msgtype);
else if(portal>0)
PD("<Sync %d %d %c portal\n",++ci->queueinidx,portal,msgtype);
};
|
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
int msgtype=ci->read_int8();
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 | | }
int msglen=ci->read_int32();
_msgsreceived++;
_bytesreceived+=1+msglen;
enum errortype {
noerror=0,
protocolerror,
protocolunsupported
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | };
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | errortype errtype=noerror;
switch(msgtype) {
array(mapping) getcols() {
int bintext=ci->read_int8();
int cols=ci->read_int16();
#ifdef PG_DEBUG
array a;
msglen-=4+1+2+2*cols;
foreach(a=allocate(cols,([]));;mapping m)
m.type=ci->read_int16();
#else
ci->consume(cols<<1);
#endif // Discard column info, and make it line oriented
return ({(["type":bintext?BYTEAOID:TEXTOID,"name":"line"])});
};
array(string) reads() {
#ifdef PG_DEBUG
if(msglen<1)
errtype=protocolerror;
#endif
array ret=({}),aw=({0});
do {
string w=ci->read_cstring();
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': {
PD("<Authentication ");
string sendpass;
int authtype;
msglen-=4+4;
switch(authtype=ci->read_int32()) {
case 0:
PD("Ok\n");
.pgsql_util.local_backend->remove_call_out(reconnect);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | ci->gottimeout=cancelquery;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | ci->timeout=timeout;
reconnectdelay=0;
cancelsecret="";
break;
case 2:
PD("KerberosV5\n");
errtype=protocolunsupported;
break;
case 3:
PD("ClearTextPassword\n");
sendpass=pass;
break;
case 4:
PD("CryptPassword\n");
errtype=protocolunsupported;
break;
case 5:
PD("MD5Password\n");
#ifdef PG_DEBUG
if(msglen<4)
errtype=protocolerror;
#endif
#define md5hex(x) String.string2hex(Crypto.MD5.hash(x))
sendpass=md5hex(pass+user);
sendpass="md5"+md5hex(sendpass+ci->read(msglen));
#ifdef PG_DEBUG
msglen=0;
#endif
break;
case 6:
PD("SCMCredential\n");
errtype=protocolunsupported;
break;
case 7:
PD("GSS\n");
errtype=protocolunsupported;
break;
case 9:
PD("SSPI\n");
errtype=protocolunsupported;
break;
case 8:
PD("GSSContinue\n");
errtype=protocolunsupported;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | cancelsecret=ci->read(msglen);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
if(msglen<1)
errtype=protocolerror;
msglen=0;
#endif
break;
default:
PD("Unknown Authentication Method %c\n",authtype);
errtype=protocolunsupported;
break;
}
switch(errtype) {
case noerror:
if(cancelsecret!="")
ci->start()->add_int8('p')->add_hstring(sendpass,4,5)
|
075c54 | 2014-11-03 | Stephen R. van den Berg | | ->add_int8(0)->sendcmd(sendout);
break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | default:
case protocolunsupported:
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':
msglen-=4+4;backendpid=ci->read_int32();
cancelsecret=ci->read(msglen);
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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': {
PD("<ParameterStatus ");
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
errtype=protocolerror;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
case '3':
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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':
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | backendstatus=ci->read_int8();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
msglen-=4+1;
PD("<ReadyForQuery %c\n",backendstatus);
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | #endif
for(;objectp(portal);portal->read()) {
#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 | | }
foreach(qportals->peek_array();;.pgsql_util.pgsql_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;
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | if(waitforauthready)
destruct(waitforauthready);
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case '1':
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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;
int cols=ci->read_int16();
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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;
#endif
foreach(a=allocate(cols);int i;)
a[i]=ci->read_int32();
#ifdef PG_DEBUGMORE
PD("%O\n",a);
#endif
if(portal._tprepared)
portal._tprepared.datatypeoid=a;
|
3c93de | 2014-11-03 | 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': {
array a;
#ifdef PG_DEBUG
int cols=ci->read_int16();
PD("<RowDescription %d columns %O\n",cols,portal._query);
msglen-=4+2;
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(a=allocate(cols);int i;)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #else
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | foreach(a=allocate(ci->read_int16());int i;)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #endif
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string s=ci->read_cstring();
mapping(string:mixed) res=(["name":s]);
#ifdef PG_DEBUG
msglen-=sizeof(s)+1+4+2+4+2+4+2;
res.tableoid=ci->read_int32()||UNDEFINED;
res.tablecolattr=ci->read_int16()||UNDEFINED;
#else
ci->consume(6);
#endif
res.type=ci->read_int32();
#ifdef PG_DEBUG
{
int len=ci->read_sint(2);
res.length=len>=0?len:"variable";
}
res.atttypmod=ci->read_int32();
res.formatcode=ci->read_int16();
#else
ci->consume(8);
#endif
a[i]=res;
}
#ifdef PG_DEBUGMORE
PD("%O\n",a);
#endif
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(portal._forcetext)
portal->_setrowdesc(a);
else {
portal->_processrowdesc(a);
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;
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;
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_processrowdesc(({}));
|
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':
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_processrowdesc(getcols());
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("<CopyOutResponse %d %O\n",
sizeof(portal._datarowdesc),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;
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;
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case 'D': {
msglen-=4;
string serror;
if(portal._tprepared)
storetiming(portal);
portal._bytesreceived+=msglen;
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | array datarowdesc=portal._datarowdesc;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int cols=ci->read_int16();
#ifdef PG_DEBUG
|
cd7f23 | 2014-03-01 | Martin Nilsson | | #ifdef PG_DEBUGMORE
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("<%O DataRow %d cols %d bytes\n",portal._portalname,cols,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(
"<%O DataRow %d cols %d bytes",portal._portalname,cols,msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int atext = portal._alltext;
int forcetext = portal._forcetext;
string cenc=_runtimeparameter[CLIENT_ENCODING];
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | array a=allocate(cols,UNDEFINED);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | msglen-=2+4*cols;
foreach(datarowdesc;int i;mapping m) {
int collen=ci->read_sint(4);
if(collen>0) {
msglen-=collen;
mixed value;
switch(int typ=m.type) {
case FLOAT4OID:
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | | #if SIZEOF_FLOAT>=8
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case FLOAT8OID:
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!atext) {
value=(float)ci->read(collen);
break;
}
default:value=ci->read(collen);
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case CHAROID:
value=atext?ci->read(1):ci->read_int8();
|
11b13b | 2014-08-16 | Martin Nilsson | | break;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | case BOOLOID:value=ci->read_int8();
switch(value) {
case 'f':value=0;
break;
case 't':value=1;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
if(atext)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | value=value?"t":"f";
break;
case TEXTOID:
case BPCHAROID:
case VARCHAROID:
value=ci->read(collen);
if(cenc==UTF8CHARSET && catch(value=utf8_to_string(value))
&& !serror)
serror=SERROR("%O contains non-%s characters\n",
value,UTF8CHARSET);
break;
case INT8OID:case INT2OID:
case OIDOID:case INT4OID:
if(forcetext) {
value=ci->read(collen);
if(!atext)
value=(int)value;
} else {
switch(typ) {
case INT8OID:value=ci->read_sint(8);
break;
case INT2OID:value=ci->read_sint(2);
break;
case OIDOID:
case INT4OID:value=ci->read_sint(4);
}
if(atext)
value=(string)value;
}
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | a[i]=value;
} else if(!collen)
a[i]="";
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | portal._inflight--;
portal._datarows->write(a);
if(serror)
ERROR(serror);
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_processdataready();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
}
case 's':
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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)
errtype=protocolerror;
#endif
string s=ci->read(msglen-1);
if(portal._tprepared)
storetiming(portal);
PD("<%O CommandComplete %O\n",portal._portalname,s);
if(!portal._statuscmdcomplete)
portal._statuscmdcomplete=s;
#ifdef PG_DEBUG
if(ci->read_int8())
errtype=protocolerror;
msglen=0;
#else
ci->consume(1);
#endif
portal->_releasesession();
portal=0;
break;
}
case 'I':
#ifdef PG_DEBUG
|
3e8df2 | 2014-10-29 | 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':
PD("<%O CopyData\n",portal._portalname);
if(portal._tprepared)
storetiming(portal);
msglen-=4;
#ifdef PG_DEBUG
if(msglen<0)
errtype=protocolerror;
#endif
portal._bytesreceived+=msglen;
portal._datarows->write(({ci->read(msglen)}));
#ifdef PG_DEBUG
msglen=0;
#endif
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_processdataready();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 'G':
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_setrowdesc(getcols());
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | PD("<%O CopyInResponse %d columns\n",
portal._portalname,sizeof(portal._datarowdesc));
portal._state=copyinprogress;
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | Thread.MutexKey resultlock=portal._resultmux->lock();
portal._newresult.signal();
resultlock=0;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | break;
case 'c':
#ifdef PG_DEBUG
PD("<%O CopyDone\n",portal._portalname);
msglen-=4;
#endif
portal=0;
break;
case 'E': {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | if(!_readyforquerycount)
sendsync();
|
16ce8b | 2014-09-12 | 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)));
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | case "57P01":case "57P02":case "57P03":
|
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":
errtype=protocolerror;
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});
lastmessage+=showbindings(portal);
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': {
PD("<NoticeResponse\n");
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)});
break;
}
case 'A': {
PD("<NotificationResponse\n");
|
11b13b | 2014-08-16 | Martin Nilsson | | msglen-=4+4;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int pid=ci->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:
errtype=protocolerror;
break;
default:
errtype=protocolerror;
#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);
s=ci->read(msglen-=4);PD("%O\n",s);
#ifdef PG_DEBUG
msglen=0;
#endif
errtype=protocolunsupported;
} 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)
errtype=protocolerror;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string msg;
switch(errtype) {
case protocolunsupported:
msg=sprintf("Unsupported servermessage received %c\n",msgtype);
break;
case protocolerror:
msg=sprintf("Protocol error with database %s",host_info());
break;
case noerror:
continue;
}
ERROR(a2nls(lastmessage+=({msg})));
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | };
if(err==MAGICTERMINATE) {
ci->start()->add("X\0\0\0\4")->sendcmd(sendout);
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)) {
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | .pgsql_util.pgsql_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;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | _delayederror=err;
if(!ci->close() && !terminating && options.reconnect)
_connectfail();
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(err)
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void close() {
|
11b13b | 2014-08-16 | Martin Nilsson | | cancelquery();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(c)
c->sendterminate();
c=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void destroy() {
|
11b13b | 2014-08-16 | Martin Nilsson | | close();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | .pgsql_util.unregister_backend();
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void _connectfail(void|mixed err) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Connect failed %O reconnectdelay %d\n",err,reconnectdelay);
|
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;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(options.reconnect!=-1)
return;
reconnectdelay=RECONNECTBACKOFF;
break;
}
Thread.MutexKey lock=waitforauth->lock();
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;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | .pgsql_util.local_backend->call_out(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 | | }
protected int reconnect(void|int force,void|object tt) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("(Re)connect\n");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!force) {
Thread.MutexKey lock=waitforauth->lock();
if(waitforauthready) {
lock=0;
return 0;
}
waitforauthready=Thread.Condition();
lock=0;
}
if(c) {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | PD("Close old connection\n");
|
11b13b | 2014-08-16 | Martin Nilsson | | reconnected++;
|
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
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(!force)
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | c->sendterminate();
|
49dbce | 2011-10-03 | Henrik Grubbström (Grubba) | | else
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | c->close();
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");
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!options.reconnect)
return 0;
|
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();
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | _readyforquerycount=1;
qportals->write(1);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!(c=getsocket())) {
string msg=sprintf("Couldn't connect to database on %s:%d",_host,_port);
if(force) {
|
11b13b | 2014-08-16 | Martin Nilsson | | if(!sizeof(lastmessage) || lastmessage[sizeof(lastmessage)-1]!=msg)
|
6b4ea8 | 2012-04-10 | Stephen R. van den Berg | | lastmessage+=({msg});
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | return 0;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | ERROR(msg+"\n");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
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();
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | readyforquery_cb=force?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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void reload() {
|
11b13b | 2014-08-16 | Martin Nilsson | | resync();
|
e7621f | 2009-02-02 | Stephen R. van den Berg | | }
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | protected void resync_cb() {
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");
}
big_query("ROLLBACK");
big_query("RESET ALL");
big_query("CLOSE ALL");
big_query("DISCARD TEMP");
}
}
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | protected void sendsync() {
_readyforquerycount++;
c->start()->sendcmd(syncsend);
}
|
e7621f | 2009-02-02 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
e7621f | 2009-02-02 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void resync(void|int|object portal) {
|
11b13b | 2014-08-16 | Martin Nilsson | | mixed err;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(!is_open()&&!reconnect())
ERROR(a2nls(lastmessage));
err = catch {
PD("Portalsinflight: %d\n",_portalsinflight);
readyforquery_cb=resync_cb;
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | sendsync();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | return;
};
PD("%O\n",err);
if(!reconnect())
|
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
void set_notify_callback(string condition,
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;
}
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected 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]))
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | cb[0](pid,condition,extrainfo,@cb[2..]);
}
|
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string quote(string s) {
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | string server_info () {
return DRIVERNAME"/"+(_runtimeparameter.server_version||"unknown");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | array(string) list_dbs (void|string glob) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array row,ret=({});
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | object res=big_query("SELECT d.datname "
|
11b13b | 2014-08-16 | Martin Nilsson | | "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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | array(string) list_tables (void|string glob) {
|
11b13b | 2014-08-16 | Martin Nilsson | | array row,ret=({});
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | object res=big_query(
"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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | 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);
|
98a776 | 2009-02-22 | Stephen R. van den Berg | | object 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;
}
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | final protected string trbackendst(int c) {
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 | | }
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | final inline void closestatement(object plugbuffer,string oldprep) {
.pgsql_util.closestatement(plugbuffer,oldprep);
}
protected inline string int2hex(int i) {
return String.int2hex(i);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | final 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 | | }
|
041296 | 2009-01-19 | 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 | |
|
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 | |
|
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 | |
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | object big_query(string q,void|mapping(string|int:mixed) bindings,
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | void|int _alltyped) {
throwdelayederror(this);
|
11b13b | 2014-08-16 | Martin Nilsson | | string preparedname="";
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | int forcecache=-1;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | int forcetext=options.text_query;
|
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;
}
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;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | if(waitforauthready) {
Thread.MutexKey lock=waitforauth->lock();
catch(waitforauthready->wait(lock));
lock=0;
}
|
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])) {
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | object plugbuffer=c->start();
|
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
&& (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);
plugbuffer->sendcmd(flushsend);
} else
plugbuffer->sendcmd();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | tstart=gethrtime();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | } else
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tp=UNDEFINED;
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | object portal;
portal=.pgsql_util.pgsql_result(this,c,q,
portalbuffersize,_alltyped,from,forcetext);
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);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | c->start(1)->add_int8('Q')->add_hstring(q,4,4+1)->add_int8(0)
|
3e8df2 | 2014-10-29 | Stephen R. van den Berg | | ->sendcmd(flushlogsend,portal);
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=
(portal._unnamedstatementkey=unnamedstatement->trylock(1))
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | ? "" : PTSTMTPREFIX+int2hex(ptstmtcount++);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | |
PD("Parse statement %O=%O\n",preparedname,q);
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | plugbuffer=c->start()->add_int8('P')
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | ->add_hstring(({preparedname,0,q,"\0\0\0"}),4,4)->add(PGFLUSH);
}
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')
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | ->add_hstring(({'S',preparedname,0}),4,4)->sendcmd(flushsend,portal);
} else {
|
3c93de | 2014-11-03 | Stephen R. van den Berg | | if(plugbuffer)
plugbuffer->sendcmd();
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_STATS
skippeddescribe++;
#endif
|
615d42 | 2014-10-31 | Stephen R. van den Berg | | portal->_setrowdesc(tp.datarowdesc);
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | }
portal._preparedname=preparedname;
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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | object streaming_query(string q,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 | |
|
16ce8b | 2014-09-12 | Stephen R. van den Berg | | object big_typed_query(string q,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 | | }
|