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 | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
4e1d1f | 2008-08-01 | 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 | |
#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 | |
int _nextportal;
int _closesent;
int _fetchlimit=FETCHLIMIT;
private int unnamedportalinuse;
private int portalsinflight;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | object _c;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private string SSauthdata,cancelsecret;
private int backendpid;
private int backendstatus;
|
13a120 | 2008-07-26 | Stephen R. van den Berg | | private mapping(string:mixed) options;
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | private array(string) lastmessage=({});
|
39f78a | 2008-07-30 | Stephen R. van den Berg | | private int clearmessage;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | private int earlyclose;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private mapping(string:array(mixed)) notifylist=([]);
private mapping(string:string) runtimeparameter;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | state _mstate;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private enum querystate {queryidle,inquery,cancelpending,canceled};
private querystate qstate;
private mapping(string:mapping(string:mixed)) prepareds=([]);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | private mapping(string:mixed) tprepared;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private int pstmtcount;
private int pportalcount;
private int totalhits;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | private int cachedepth=STATEMENTCACHEDEPTH;
private int timeout=QUERYTIMEOUT;
private int portalbuffersize=PORTALBUFFERSIZE;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private int reconnected;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | private int sessionblocked;
private int skippeddescribe;
private int portalsopened;
int _msgsreceived;
int _bytesreceived;
int _packetssent;
int _bytessent;
private int warningsdropcount;
private int prepstmtused;
private int warningscollected;
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | private int invalidatecache;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
private string host, database, user, pass;
private int port;
|
9f4028 | 2008-08-27 | Stephen R. van den Berg | | private object createprefix
=Regexp("^[ \t\f\r\n]*[Cc][Rr][Ee][Aa][Tt][Ee][ \t\f\r\n]");
|
928713 | 2008-09-03 | Stephen R. van den Berg | | private object dontcacheprefix
=Regexp("^[ \t\f\r\n]*([Ff][Ee][Tt][Cc][Hh]|[Cc][Oo][Pp][Yy])[ \t\f\r\n]");
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | private object limitpostfix
=Regexp("[ \t\f\r\n][Ll][Ii][Mm][Ii][Tt][ \t\f\r\n]+[12][; \t\f\r\n]*$");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | Thread.Mutex _querymutex;
Thread.Mutex _stealmutex;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | #define USERERROR(msg) throw(({(msg), backtrace()[..<1]}))
|
928713 | 2008-09-03 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | protected string _sprintf(int type, void|mapping flags) {
string res=UNDEFINED;
switch(type) {
case 'O':
|
928713 | 2008-09-03 | Stephen R. van den Berg | | res=sprintf(DRIVERNAME"(%s@%s:%d/%s,%d)",
user,host,port,database,backendpid);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
return res;
}
#define BOOLOID 16
#define BYTEAOID 17
#define CHAROID 18
#define INT8OID 20
#define INT2OID 21
#define INT4OID 23
#define TEXTOID 25
#define OIDOID 26
#define XMLOID 142
#define FLOAT4OID 700
|
05bf88 | 2008-08-26 | Stephen R. van den Berg | | #define FLOAT8OID 701
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #define MACADDROID 829
|
7c4bd0 | 2008-08-09 | Stephen R. van den Berg | | #define INETOID 869 /* Force textmode */
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #define BPCHAROID 1042
#define VARCHAROID 1043
#define CTIDOID 1247
#define UUIDOID 2950
#define PG_PROTOCOL(m,n) (((m)<<16)|(n))
|
1fe399 | 2008-07-16 | Peter Bortas | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
13a120 | 2008-07-26 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
758a05 | 2008-09-02 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | 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 | |
protected void create(void|string _host, void|string _database,
|
13a120 | 2008-07-26 | Stephen R. van den Berg | | void|string _user, void|string _pass, void|mapping(string:mixed) _options) {
|
334f37 | 2008-08-12 | Stephen R. van den Berg | | pass = _pass; _pass = "CENSORED";
if(pass)
String.secure(pass);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | user = _user; database = _database; host = _host || PGSQL_DEFAULT_HOST;
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | options = _options || ([]);
|
9b6a8b | 2009-01-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");
if(!port)
port = PGSQL_DEFAULT_PORT;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _querymutex=Thread.Mutex();
_stealmutex=Thread.Mutex();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | reconnect();
}
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
be0739 | 2009-02-01 | Stephen R. van den Berg | |
|
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 | | string error(void|int clear) {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | 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 | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string host_info() {
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | return sprintf("fd:%d TCP/IP %s:%d PID %d",
_c?_c.query_fd():-1,host,port,backendpid);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | final private object getsocket(void|int nossl) {
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | object lcon = Stdio.File();
|
13a120 | 2008-07-26 | Stephen R. van den Berg | | if(!lcon.connect(host,port))
return UNDEFINED;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | |
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | object fcon;
|
13a120 | 2008-07-26 | Stephen R. van den Berg | | #if constant(SSL.sslfile)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(!nossl && (options->use_ssl || options->force_ssl)) {
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | PD("SSLRequest\n");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | { object c=.pgsql_util.PGassist();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | lcon.write(({c.plugint32(8),c.plugint32(PG_PROTOCOL(1234,5679))}));
}
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | switch(lcon.read(1)) {
case "S":
SSL.context context = SSL.context();
context->random = Crypto.Random.random_string;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | fcon=.pgsql_util.PGconnS(lcon, context);
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | if(fcon)
return fcon;
default:lcon.close();
if(!lcon.connect(host,port))
return UNDEFINED;
case "N":
if(options->force_ssl)
ERROR("Encryption not supported on connection to %s:%d\n",
host,port);
|
13a120 | 2008-07-26 | Stephen R. van den Berg | | }
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | }
#else
if(options->force_ssl)
ERROR("Encryption library missing, cannot establish connection to %s:%d\n",
host,port);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | fcon=.pgsql_util.PGconn(lcon,this);
|
39fe7f | 2008-07-26 | Stephen R. van den Berg | | return fcon;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | void cancelquery() {
if(qstate==inquery) {
qstate=cancelpending;
object lcon;
PD("CancelRequest\n");
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(!(lcon=getsocket(1)))
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | ERROR("Cancel connect failed\n");
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | lcon.write(({_c.plugint32(16),_c.plugint32(PG_PROTOCOL(1234,5678)),
_c.plugint32(backendpid),cancelsecret}));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | lcon.close();
}
}
|
d6f86e | 2008-08-20 | Stephen R. van den Berg | |
void set_charset(string charset)
{
#if 0
#endif
big_query("SET CLIENT_ENCODING TO :charset",([":charset":charset]));
}
string get_charset()
{ return runtimeparameter->client_encoding;
}
|
cbe276 | 2008-08-01 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
cbe276 | 2008-08-01 | Stephen R. van den Berg | |
mapping(string:string) getruntimeparameters() {
return runtimeparameter+([]);
}
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
mapping(string:mixed) getstatistics() {
mapping(string:mixed) stats=([
"warnings_dropped":warningsdropcount,
"skipped_describe_count":skippeddescribe,
"used_prepared_statements":prepstmtused,
"current_prepared_statements":sizeof(prepareds),
"current_prepared_statement_hits":totalhits,
"prepared_portal_count":pportalcount,
"prepared_statement_count":pstmtcount,
"portals_opened_count":portalsopened,
"blocked_count":sessionblocked,
"messages_received":_msgsreceived,
"bytes_received":_bytesreceived,
"packets_sent":_packetssent,
"bytes_sent":_bytessent,
"reconnect_count":reconnected,
"portals_in_flight":portalsinflight,
]);
return stats;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
int setcachedepth(void|int newdepth) {
int olddepth=cachedepth;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(!zero_type(newdepth) && newdepth>=0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | cachedepth=newdepth;
return olddepth;
}
int settimeout(void|int newtimeout) {
int oldtimeout=timeout;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(!zero_type(newtimeout) && newtimeout>0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | timeout=newtimeout;
return oldtimeout;
}
int setportalbuffersize(void|int newportalbuffersize) {
int oldportalbuffersize=portalbuffersize;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(!zero_type(newportalbuffersize) && newportalbuffersize>0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | portalbuffersize=newportalbuffersize;
return oldportalbuffersize;
}
int setfetchlimit(void|int newfetchlimit) {
int oldfetchlimit=_fetchlimit;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(!zero_type(newfetchlimit) && newfetchlimit>=0)
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | _fetchlimit=newfetchlimit;
return oldfetchlimit;
}
final private string glob2reg(string glob) {
if (!glob||!sizeof(glob))
return "%";
return replace(glob,({"*","?","\\","%","_"}),({"%","_","\\\\","\\%","\\_"}));
}
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | final private string a2nls(array(string) msg) {
return msg*"\n"+"\n";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
final private string pinpointerror(void|string query,void|string offset) {
if(!query)
return "";
int k=(int)offset;
if(k<=0)
return MARKSTART+query+MARKEND;
return MARKSTART+(k>1?query[..k-2]:"")+MARKERROR+query[k-1..]+MARKEND;
}
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | final int _decodemsg(void|state waitforstate) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifdef DEBUG
{ array line;
#ifdef DEBUGMORE
line=backtrace();
#endif
PD("Waiting for state %O %O\n",waitforstate,line&&line[sizeof(line)-2]);
}
#endif
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | while(_mstate!=waitforstate) {
if(_mstate!=unauthenticated) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(qstate==cancelpending)
qstate=canceled,sendclose();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.flushed && qstate==inquery && !_c.bpeek(0)) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | int tcurr=time();
int told=tcurr+timeout;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | sessionblocked++;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | while(!_c.bpeek(told-tcurr))
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if((tcurr=time())-told>=timeout) {
sendclose();cancelquery();
break;
}
}
}
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int msgtype=_c.getbyte();
int msglen=_c.getint32();
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | _msgsreceived++;
_bytesreceived+=1+msglen;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | enum errortype { noerror=0, protocolerror, protocolunsupported };
errortype errtype=noerror;
switch(msgtype) {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | void storetiming() {
tprepared->trun=gethrtime()-tprepared->trunstart;
m_delete(tprepared,"trunstart");
tprepared = UNDEFINED;
};
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | void getcols() {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int bintext=_c.getbyte();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | array a;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int cols=_c.getint16();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen-=4+1+2+2*cols;
foreach(a=allocate(cols,([]));;mapping m)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | m->type=_c.getint16();
if(_c.portal) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | a=({(["type":bintext?BYTEAOID:TEXTOID,"name":"line"])});
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_datarowdesc=a;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=gotrowdescription;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | };
array(string) getstrings() {
string s;
if(msglen<1)
errtype=protocolerror;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | s=_c.getstring(msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(s[--msglen])
errtype=protocolerror;
if(!msglen)
return ({});
s=s[..msglen-1];msglen=0;
return s/"\0";
};
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | mapping(string:string) getresponse() {
mapping(string:string) msgresponse=([]);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen-=4;
foreach(getstrings();;string f)
if(sizeof(f))
msgresponse[f[..0]]=f[1..];
PD("%O\n",msgresponse);
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | return msgresponse;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | };
case 'R':PD("Authentication\n");
{ string sendpass;
int authtype;
msglen-=4+4;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | switch(authtype=_c.getint32()) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | case 0:PD("Ok\n");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=authenticated;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 2:PD("KerberosV5\n");
errtype=protocolunsupported;
break;
case 3:PD("ClearTextPassword\n");
sendpass=pass;
break;
case 4:PD("CryptPassword\n");
if(msglen<2)
errtype=protocolerror;
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | | sendpass=_c.getstring(msglen);msglen=0;
errtype=protocolunsupported;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 5:PD("MD5Password\n");
if(msglen<4)
errtype=protocolerror;
#if constant(Crypto.MD5.hash)
#define md5hex(x) String.string2hex(Crypto.MD5.hash(x))
sendpass=md5hex(pass+user);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | sendpass="md5"+md5hex(sendpass+_c.getstring(msglen));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #else
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.getstring(msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | errtype=protocolunsupported;
#endif
msglen=0;
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;
if(msglen<1)
errtype=protocolerror;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | SSauthdata=_c.getstring(msglen);msglen=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
default:PD("Unknown Authentication Method %c\n",authtype);
errtype=protocolunsupported;
break;
}
switch(errtype) {
case noerror:
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | if(_mstate==unauthenticated)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendcmd(({"p",_c.plugint32(4+sizeof(sendpass)+1),
|
b212b5 | 2008-07-26 | Stephen R. van den Berg | | sendpass,"\0"}),1);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
default:
case protocolunsupported:
ERROR("Unsupported authenticationmethod %c\n",authtype);
break;
}
break;
}
case 'K':PD("BackendKeyData\n");
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | msglen-=4+4;backendpid=_c.getint32();cancelsecret=_c.getstring(msglen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen=0;
break;
case 'S':PD("ParameterStatus\n");
msglen-=4;
{ array(string) ts=getstrings();
if(sizeof(ts)==2) {
runtimeparameter[ts[0]]=ts[1];
PD("%s=%s\n",ts[0],ts[1]);
}
else
errtype=protocolerror;
}
break;
case 'Z':PD("ReadyForQuery\n");
msglen-=4+1;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | backendstatus=_c.getbyte();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=readyforquery;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | qstate=queryidle;
_closesent=0;
break;
case '1':PD("ParseComplete\n");
msglen-=4;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=parsecomplete;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 't':
PD("ParameterDescription (for %s)\n",
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal?_c.portal->_portalname:"DISCARDED");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | { array a;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int cols=_c.getint16();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen-=4+2+4*cols;
foreach(a=allocate(cols);int i;)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | a[i]=_c.getint32();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifdef DEBUGMORE
PD("%O\n",a);
#endif
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.portal)
_c.portal->_datatypeoid=a;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=gotparameterdescription;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
case 'T':
PD("RowDescription (for %s)\n",
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal?_c.portal->_portalname:"DISCARDED");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen-=4+2;
{ array a;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | foreach(a=allocate(_c.getint16());int i;) {
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | string s;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | msglen-=sizeof(s=_c.getstring())+1;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | mapping(string:mixed) res=(["name":s]);
msglen-=4+2+4+2+4+2;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | res->tableoid=_c.getint32()||UNDEFINED;
res->tablecolattr=_c.getint16()||UNDEFINED;
res->type=_c.getint32();
{ int len=_c.getint16();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | res->length=len>=0?len:"variable";
}
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | res->atttypmod=_c.getint32();res->formatcode=_c.getint16();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | a[i]=res;
}
#ifdef DEBUGMORE
PD("%O\n",a);
#endif
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.portal)
_c.portal->_datarowdesc=a;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=gotrowdescription;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
case 'n':PD("NoData\n");
msglen-=4;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_datarowdesc=({});
|
7b4d23 | 2008-09-03 | Stephen R. van den Berg | | _c.portal->_fetchlimit=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=gotrowdescription;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case '2':PD("BindComplete\n");
msglen-=4;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=bindcomplete;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 'D':PD("DataRow\n");
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | msglen-=4;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.portal) {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tprepared)
storetiming();
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | #ifdef USEPGsql
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.decodedatarow(msglen);msglen=0;
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | #else
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | array a, datarowdesc;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_bytesreceived+=msglen;
datarowdesc=_c.portal->_datarowdesc;
int cols=_c.getint16();
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | int atext = _c.portal->_alltext;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | a=allocate(cols,UNDEFINED);
msglen-=2+4*cols;
foreach(a;int i;) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int collen=_c.getint32();
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(collen>0) {
msglen-=collen;
mixed value;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | switch(datarowdesc[i]->type) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | default:value=_c.getstring(collen);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
f6f972 | 2008-08-26 | Stephen R. van den Berg | | case CHAROID:value=atext?_c.getstring(1):_c.getbyte();
|
aaa456 | 2008-08-21 | Stephen R. van den Berg | | break;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case BOOLOID:value=_c.getbyte();
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | if(atext)
|
aaa456 | 2008-08-21 | Stephen R. van den Berg | | value=value?"t":"f";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case INT8OID:value=_c.getint64();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
05bf88 | 2008-08-26 | Stephen R. van den Berg | | #if SIZEOF_FLOAT>=8
case FLOAT8OID:
#endif
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | case FLOAT4OID:
value=_c.getstring(collen);
if(!atext)
value=(float)value;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case INT2OID:value=_c.getint16();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case OIDOID:
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case INT4OID:value=_c.getint32();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
aaa456 | 2008-08-21 | Stephen R. van den Berg | | if(atext&&!stringp(value))
value=(string)value;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | a[i]=value;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | }
else if(!collen)
a[i]="";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | a=({a});
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_datarows+=a;
_c.portal->_inflight-=sizeof(a);
#endif
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | else
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.getstring(msglen),msglen=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=dataready;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 's':PD("PortalSuspended\n");
msglen-=4;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=portalsuspended;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 'C':PD("CommandComplete\n");
{ msglen-=4;
if(msglen<1)
errtype=protocolerror;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | string s=_c.getstring(msglen-1);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(_c.portal) {
if(tprepared)
storetiming();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_statuscmdcomplete=s;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("%s\n",s);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.getbyte())
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | errtype=protocolerror;
msglen=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=commandcomplete;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
case 'I':PD("EmptyQueryResponse\n");
msglen-=4;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=commandcomplete;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case '3':PD("CloseComplete\n");
msglen-=4;
_closesent=0;
break;
case 'd':PD("CopyData\n");
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tprepared)
storetiming();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msglen-=4;
if(msglen<0)
errtype=protocolerror;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.portal) {
_c.portal->_bytesreceived+=msglen;
_c.portal->_datarows+=({({_c.getstring(msglen)})});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
msglen=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=dataready;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 'H':PD("CopyOutResponse\n");
getcols();
break;
case 'G':PD("CopyInResponse\n");
getcols();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=copyinresponse;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case 'c':PD("CopyDone\n");
msglen-=4;
break;
case 'E':PD("ErrorResponse\n");
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | { mapping(string:string) msgresponse;
msgresponse=getresponse();
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | warningsdropcount+=warningscollected;
warningscollected=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | switch(msgresponse->C) {
case "P0001":
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage=({sprintf("%s: %s",msgresponse->S,msgresponse->M)});
USERERROR(a2nls(lastmessage
+({pinpointerror(_c.portal->query,msgresponse->P)})));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | case "08P01":case "42P05":
errtype=protocolerror;
case "XX000":case "42883":case "42P01":
invalidatecache=1;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | default:
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage=({sprintf("%s %s:%s %s\n (%s:%s:%s)",
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | msgresponse->S,msgresponse->C,msgresponse->P||"",msgresponse->M,
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | msgresponse->F||"",msgresponse->R||"",msgresponse->L||"")});
if(msgresponse->D)
lastmessage+=({msgresponse->D});
if(msgresponse->H)
lastmessage+=({msgresponse->H});
lastmessage+=({
pinpointerror(_c.portal&&_c.portal->query,msgresponse->P)+
pinpointerror(msgresponse->q,msgresponse->p)});
if(msgresponse->W)
lastmessage+=({msgresponse->W});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | switch(msgresponse->S) {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | case "PANIC":werror(a2nls(lastmessage));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | USERERROR(a2nls(lastmessage));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
break;
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | case 'N':PD("NoticeResponse\n");
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | { mapping(string:string) msgresponse;
msgresponse=getresponse();
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(clearmessage) {
warningsdropcount+=warningscollected;
clearmessage=warningscollected=0;
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage=({});
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | }
warningscollected++;
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage=({sprintf("%s %s: %s",
msgresponse->S,msgresponse->C,msgresponse->M)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | case 'A':PD("NotificationResponse\n");
{ msglen-=4+4;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | int pid=_c.getint32();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string condition,extrainfo=UNDEFINED;
{ array(string) ts=getstrings();
switch(sizeof(ts)) {
case 0:errtype=protocolerror;
break;
default:errtype=protocolerror;
case 2:extrainfo=ts[1];
case 1:condition=ts[0];
}
}
PD("%d %s\n%s\n",pid,condition,extrainfo);
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | runcallback(pid,condition,extrainfo);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
|
c01574 | 2008-08-21 | Stephen R. van den Berg | | default:
if(msgtype!=-1) {
PD("Unknown message received %c\n",msgtype);
msglen-=4;PD("%O\n",_c.getstring(msglen));msglen=0;
errtype=protocolunsupported;
}
else {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | array(string) msg=lastmessage;
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | if(!reconnect(1)) {
sleep(RECONNECTDELAY);
if(!reconnect(1)) {
sleep(RECONNECTBACKOFF);
reconnect(1);
}
}
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | msg+=lastmessage;
string s=sizeof(msg)?a2nls(msg):"";
ERROR("%sConnection lost to database %s@%s:%d/%s %d\n",
s,user,host,port,database,backendpid);
|
c01574 | 2008-08-21 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
if(msglen)
errtype=protocolerror;
switch(errtype) {
case protocolunsupported:
ERROR("Unsupported servermessage received %c\n",msgtype);
break;
case protocolerror:
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | array(string) msg=lastmessage;
lastmessage=({});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | reconnect(1);
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | msg+=lastmessage;
string s=sizeof(msg)?a2nls(msg):"";
ERROR("%sProtocol error with database %s\n",s,host_info());
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case noerror:
break;
}
if(zero_type(waitforstate))
break;
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | PD("Found state %O\n",_mstate);
return _mstate;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
0e0cfa | 2008-07-25 | Henrik Grubbström (Grubba) | | #ifndef UNBUFFEREDIO
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | private int read_cb(mixed foo, string d) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.unread(d);
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | do _decodemsg();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | while(_c.bpeek(0)==1);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return 0;
}
|
0e0cfa | 2008-07-25 | Henrik Grubbström (Grubba) | | #endif
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
void close() {
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | cancelquery();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c)
_c.sendterminate();
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | void destroy() {
close();
}
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | private int reconnect(void|int force) {
|
c01574 | 2008-08-21 | Stephen R. van den Berg | | Thread.MutexKey connectmtxkey;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | reconnected++;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | prepstmtused=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifdef DEBUG
ERROR("While debugging, reconnects are forbidden\n");
exit(1);
#endif
if(!force)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendterminate();
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | _c.close(); _c=0;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | foreach(prepareds;;mapping tp)
m_delete(tp,"preparedname");
|
c01574 | 2008-08-21 | Stephen R. van den Berg | | if(!(connectmtxkey = _stealmutex.trylock(2)))
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | return 0;
}
if(!(_c=getsocket())) {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | string msg=sprintf("Couldn't connect to database on %s:%d",host,port);
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | if(force) {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage+=({msg});
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | return 0;
}
else
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | ERROR(msg+"\n");
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
_closesent=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _mstate=unauthenticated;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | qstate=queryidle;
runtimeparameter=([]);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | array(string) plugbuf=({"",_c.plugint32(PG_PROTOCOL(3,0))});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(user)
plugbuf+=({"user\0",user,"\0"});
if(database)
plugbuf+=({"database\0",database,"\0"});
|
f6b4f9 | 2008-09-03 | Stephen R. van den Berg | | foreach(options-(<"use_ssl","force_ssl","cache_autoprepared_statements">);
|
aaa456 | 2008-08-21 | Stephen R. van den Berg | | string name;mixed value)
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | plugbuf+=({name,"\0",(string)value,"\0"});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | plugbuf+=({"\0"});
int len=4;
foreach(plugbuf;;string s)
len+=sizeof(s);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf[0]=_c.plugint32(len);
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | _c.write(plugbuf);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("%O\n",plugbuf);
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | { mixed err=catch(_decodemsg(readyforquery));
if(err)
if(force)
throw(err);
else
return 0;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("%O\n",runtimeparameter);
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | if(force) {
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | lastmessage+=({sprintf("Reconnected to database %s",host_info())});
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | runcallback(backendpid,"_reconnect","");
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | }
return 1;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | void reload(void|int special) {
mixed err;
int didsync;
if(err = catch {
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | sendclose(1);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("Portalsinflight: %d\n",portalsinflight);
if(!portalsinflight) {
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | if(!earlyclose) {
PD("Sync\n");
_c.sendcmd(({"S",_c.plugint32(4)}),2);
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | didsync=1;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | if(!special) {
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | _decodemsg(readyforquery);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | foreach(prepareds;;mapping tp) {
m_delete(tp,"datatypeoid");
m_delete(tp,"datarowdesc");
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | }
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | earlyclose=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }) {
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | earlyclose=0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("%O\n",err);
|
6d9aa5 | 2008-08-21 | Stephen R. van den Berg | | if(!reconnect(1))
|
be0739 | 2009-02-01 | Stephen R. van den Berg | | ERROR(a2nls(lastmessage));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
else if(didsync && special==2)
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | _decodemsg(readyforquery);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifndef UNBUFFEREDIO
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.set_read_callback(read_cb);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #endif
}
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | void select_db(string dbname) {
database=dbname;
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 | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
9b77ae | 2008-07-16 | Peter Bortas | |
|
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 | |
|
7ac2f1 | 2008-07-27 | 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 | |
void set_notify_callback(string condition,
void|function(int,string,string,mixed ...:void) notify_cb,void|int selfnotify,
mixed ... args) {
if(!notify_cb)
m_delete(notifylist,condition);
else {
array old=notifylist[condition];
if(!old)
old=({notify_cb});
if(selfnotify||args)
old+=({selfnotify});
if(args)
old+=args;
notifylist[condition]=old;
}
}
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | final private void runcallback(int pid,string condition,string extrainfo) {
array cb;
if((cb=notifylist[condition]||notifylist[""])
&& (pid!=backendpid || sizeof(cb)>1 && cb[1]))
cb[0](pid,condition,extrainfo,@cb[2..]);
}
|
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 | | string quote(string s) {
string r=runtimeparameter->standard_conforming_strings;
if(r && r=="on")
return replace(s, "'", "''");
return replace(s, ({ "'", "\\" }), ({ "''", "\\\\" }) );
}
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
string quotebinary(string s) {
return replace(s, ({ "'", "\\", "\0" }), ({ "''", "\\\\", "\\000" }) );
}
|
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 | | void create_db(string db) {
big_query("CREATE DATABASE :db",([":db":db]));
}
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
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 | | void drop_db(string db) {
big_query("DROP DATABASE :db",([":db":db]));
}
|
f28c0d | 2008-08-01 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string server_info () {
return DRIVERNAME"/"+(runtimeparameter->server_version||"unknown");
}
array(string) list_dbs (void|string glob) {
array row,ret=({});
object res=big_query("SELECT d.datname "
"FROM pg_database d "
"WHERE d.datname ILIKE :glob "
"ORDER BY d.datname",
([":glob":glob2reg(glob)]));
while(row=res->fetch_row())
ret+=({row[0]});
return ret;
}
array(string) list_tables (void|string glob) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | array row,ret=({});
object res=big_query(
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | "SELECT CASE WHEN 'public'=n.nspname THEN '' ELSE n.nspname||'.' END "
" ||c.relname AS name "
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | "FROM pgcatalog.pgclass c "
" LEFT JOIN pgcatalog.pg_namespace n ON n.oid=c.relnamespace "
"WHERE c.relkind IN ('r','v') AND n.nspname<>'pgcatalog' "
" AND n.nspname !~ '^pg_toast' AND pgcatalog.pg_table_is_visible(c.oid) "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | " AND c.relname ILIKE :glob "
" ORDER BY 1",
([":glob":glob2reg(glob)]));
while(row=res->fetch_row())
ret+=({row[0]});
return ret;
}
array(mapping(string:mixed)) list_fields(void|string table, void|string wild) {
array row, ret=({});
string schema=UNDEFINED;
sscanf(table||"*", "%s.%s", schema, table);
object res = big_query(
"SELECT a.attname, a.atttypid, t.typname, a.attlen, "
" c.relhasindex, c.relhaspkey, c.reltuples, c.relpages, "
" 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 "
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | "FROM pgcatalog.pgclass c "
" LEFT JOIN pgcatalog.pg_namespace n ON n.oid=c.relnamespace "
" JOIN pgcatalog.pg_roles r ON r.oid=c.relowner "
" JOIN pgcatalog.pg_attribute a ON c.oid=a.attrelid "
" JOIN pgcatalog.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 "
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | " AND n.nspname<>'pgcatalog' AND n.nspname !~ '^pg_toast') "
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | " AND a.attname ILIKE :wild "
" AND (a.attnum>0 OR '*'=:realwild) "
"ORDER BY n.nspname,c.relname,a.attnum,a.attname",
([":schema":glob2reg(schema),":table":glob2reg(table),
":wild":glob2reg(wild),":realwild":wild]));
array colnames=res->fetch_fields();
{ mapping(string:string) renames=([
"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",
"relpages":"pagecount",
]);
foreach(colnames;int i;mapping m) {
string nf,field=m->name;
if(nf=renames[field])
field=nf;
colnames[i]=field;
}
}
#define delifzero(m,field) if(!(m)[field]) m_delete(m,field)
while(row=res->fetch_row()) {
mapping m=mkmapping(colnames,row);
delifzero(m,"is_shared");
delifzero(m,"has_index");
delifzero(m,"has_primarykey");
delifzero(m,"default");
ret+=({m});
}
return ret;
}
private int oidformat(int oid) {
switch(oid) {
case BOOLOID:
case BYTEAOID:
case CHAROID:
case INT8OID:
case INT2OID:
case INT4OID:
case TEXTOID:
case OIDOID:
case XMLOID:
case MACADDROID:
case BPCHAROID:
case VARCHAROID:
case CTIDOID:
case UUIDOID:
return 1;
}
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | return 0;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | final void _sendexecute(int fetchlimit) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | string portalname=_c.portal->_portalname;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("Execute portal %s fetchlimit %d\n",portalname,fetchlimit);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendcmd(({"E",_c.plugint32(4+sizeof(portalname)+1+4),portalname,
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | "\0",_c.plugint32(fetchlimit)}),!!fetchlimit);
if(!fetchlimit) {
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | _c.portal->_fetchlimit=0;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | earlyclose=1;
if(sizeof(portalname)) {
PD("Close portal %s & Sync\n",portalname);
_c.sendcmd(({"C",_c.plugint32(4+1+sizeof(portalname)+1),
"P",portalname,"\0"}));
}
_c.sendcmd(({"S",_c.plugint32(4)}),2);
}
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | else
_c.portal->_inflight+=fetchlimit;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | final private void sendclose(void|int hold) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string portalname;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(_c.portal && (portalname=_c.portal->_portalname)) {
_c.portal->_portalname = UNDEFINED;
_c.setportal();
|
b133b0 | 2008-08-06 | Stephen R. van den Berg | | portalsinflight--;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifdef DEBUGMORE
PD("Closetrace %O\n",backtrace());
#endif
|
b212b5 | 2008-07-26 | Stephen R. van den Berg | | if(!sizeof(portalname))
unnamedportalinuse--;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | if(sizeof(portalname)) {
if(!earlyclose) {
PD("Close portal %s\n",portalname);
_c.sendcmd(({"C",_c.plugint32(4+1+sizeof(portalname)+1),
"P",portalname,"\0"}),!hold||portalsinflight?1:0);
}
_closesent=1;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
}
final private string trbackendst(int c) {
switch(c) {
case 'I':return "idle";
case 'T':return "intransaction";
case 'E':return "infailedtransaction";
}
|
928713 | 2008-09-03 | Stephen R. van den Berg | | return "";
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
final string status_commit() {
return trbackendst(backendstatus);
}
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | final private void closestatement(array(string) plugbuf,mapping tp) {
string oldprep=tp->preparedname;
if(oldprep) {
PD("Close statement %s\n",oldprep);
plugbuf+=({"C",_c.plugint32(4+1+sizeof(oldprep)+1),
"S",oldprep,"\0"});
}
}
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
17b753 | 2008-07-30 | Stephen R. van den Berg | |
|
a2014e | 2008-07-14 | Stephen R. van den Berg | |
|
f28c0d | 2008-08-01 | 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,
void|int _alltyped) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | string preparedname="";
string portalname="";
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | int forcecache=-1;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(stringp(q) && String.width(q)>8)
q=string_to_utf8(q);
array(string|int) paramValues;
if(bindings) {
int pi=0,rep=0;
paramValues=allocate(sizeof(bindings));
array(string) from=allocate(sizeof(bindings));
array(string) to=allocate(sizeof(bindings));
foreach(bindings; mixed name; mixed value) {
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(stringp(name)) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(name[0]!=':')
name=":"+name;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | if(name[1]=='_') {
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | switch(name) {
case ":_cache":forcecache=(int)value;
break;
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | continue;
}
|
9b6a8b | 2009-01-12 | Stephen R. van den Berg | | if(!has_value(q,name))
|
565d98 | 2008-08-27 | Stephen R. van den Berg | | continue;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
from[rep]=name;
string rval;
if(multisetp(value)) {
rval=sizeof(value) ? indices(value)[0] : "";
}
else {
if(zero_type(value))
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | paramValues[pi++]=UNDEFINED;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | else {
if(stringp(value) && String.width(value)>8)
value=string_to_utf8(value);
paramValues[pi++]=value;
}
rval="$"+(string)pi;
}
to[rep++]=rval;
}
if(rep--)
q=replace(q,from[..rep],to[..rep]);
paramValues= pi ? paramValues[..pi-1] : ({});
}
else
paramValues = ({});
|
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;
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | if(forcecache==1 || forcecache!=0 && sizeof(q)>=MINPREPARELENGTH) {
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | array(string) plugbuf=({});
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tp=prepareds[q]) {
if(tp->preparedname)
prepstmtused++, preparedname=tp->preparedname;
else if((tstart=tp->trun)
|
758a05 | 2008-09-02 | Stephen R. van den Berg | | && tp->tparse*FACTORPLAN>=tstart
&& (zero_type(options->cache_autoprepared_statements)
|| options->cache_autoprepared_statements))
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | preparedname=PREPSTMTPREFIX+(string)pstmtcount++;
}
else {
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | if(totalhits>=cachedepth) {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | foreach(prepareds;string ind;tp) {
int oldhits=tp->hits;
totalhits-=oldhits-(tp->hits=oldhits>>1);
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | if(oldhits<=1) {
closestatement(plugbuf,tp);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | m_delete(prepareds,ind);
}
}
}
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | if(forcecache!=1 && createprefix->match(q))
invalidatecache=1;
else
|
9f4028 | 2008-08-27 | Stephen R. van den Berg | | prepareds[q]=tp=([]);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
d1a5a4 | 2008-08-27 | Stephen R. van den Berg | | if(invalidatecache) {
invalidatecache=0;
foreach(prepareds;;mapping np) {
closestatement(plugbuf,np);
m_delete(np,"preparedname");
}
}
if(sizeof(plugbuf)) {
_c.sendcmd(plugbuf,1);
PD("%O\n",plugbuf);
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | tstart=gethrtime();
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | }
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | else
tp=UNDEFINED;
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | .pgsql_util.pgsql_result(this,q,_fetchlimit,portalbuffersize,_alltyped);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(unnamedportalinuse)
portalname=PORTALPREFIX+(string)pportalcount++;
else
unnamedportalinuse++;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_portalname=portalname;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | qstate=inquery;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | portalsinflight++; portalsopened++;
|
39f78a | 2008-07-30 | Stephen R. van den Berg | | clearmessage=1;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | mixed err;
if(err = catch {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!sizeof(preparedname) || !tp || !tp->preparedname) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("Parse statement %s\n",preparedname);
|
13a120 | 2008-07-26 | Stephen R. van den Berg | |
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | |
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendcmd(({"P",_c.plugint32(4+sizeof(preparedname)+1+sizeof(q)+1+2),
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | preparedname,"\0",q,"\0",_c.plugint16(0)}),3);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("Query: %O\n",q);
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | }
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!tp || !tp->datatypeoid) {
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | PD("Describe statement %s\n",preparedname);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendcmd(({"D",_c.plugint32(4+1+sizeof(preparedname)+1),
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | "S",preparedname,"\0"}),1);
}
else {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | skippeddescribe++;
_c.portal->_datatypeoid=tp->datatypeoid;
_c.portal->_datarowdesc=tp->datarowdesc;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | { array(string) plugbuf=({"B",UNDEFINED});
int len=4+sizeof(portalname)+1+sizeof(preparedname)+1
+2+sizeof(paramValues)*(2+4)+2+2;
plugbuf+=({portalname,"\0",preparedname,"\0",
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.plugint16(sizeof(paramValues))});
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!tp || !tp->datatypeoid) {
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | _decodemsg(gotparameterdescription);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tp)
tp->datatypeoid=_c.portal->_datatypeoid;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | }
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | array dtoid=_c.portal->_datatypeoid;
|
928713 | 2008-09-03 | Stephen R. van den Berg | | if(sizeof(dtoid)!=sizeof(paramValues))
|
515a47 | 2009-01-06 | Stephen R. van den Berg | | USERERROR(
sprintf("Invalid number of bindings, expected %d, got %d\n",
sizeof(dtoid),sizeof(paramValues)));
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | foreach(dtoid;;int textbin)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint16(oidformat(textbin))});
plugbuf+=({_c.plugint16(sizeof(paramValues))});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | foreach(paramValues;int i;mixed value) {
if(zero_type(value))
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint32(-1)});
|
ab4a4c | 2009-01-24 | Stephen R. van den Berg | | else if(stringp(value) && !sizeof(value)) {
int k=0;
switch(dtoid[i]) {
default:
k=-1;
case BYTEAOID:
case TEXTOID:
case XMLOID:
case BPCHAROID:
case VARCHAROID:;
}
plugbuf+=({_c.plugint32(k)});
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | else
switch(dtoid[i]) {
default:
{ int k;
len+=k=sizeof(value=(string)value);
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | plugbuf+=({_c.plugint32(k),value});
break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case BOOLOID:plugbuf+=({_c.plugint32(1)});len++;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | switch(stringp(value)?value[0]:value) {
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | case 'o':case 'O':
_c.plugbyte(stringp(value)&&sizeof(value)>1
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | &&(value[1]=='n'||value[1]=='N'));
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | break;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | case 0:case 'f':case 'F':case 'n':case 'N':
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugbyte(0)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
default:
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugbyte(1)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
break;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | case CHAROID:plugbuf+=({_c.plugint32(1)});len++;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | if(intp(value))
plugbuf+=({_c.plugbyte(value)});
else {
value=(string)value;
if(sizeof(value)!=1)
ERROR("\"char\" types must be 1 byte wide, got %d\n",
sizeof(value));
plugbuf+=({value});
}
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case INT8OID:len+=8;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint32(8),_c.plugint64((int)value)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | case OIDOID:
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | case INT4OID:len+=4;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint32(4),_c.plugint32((int)value)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
case INT2OID:len+=2;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint32(2),_c.plugint16((int)value)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | break;
}
}
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!tp || !tp->datarowdesc) {
|
928713 | 2008-09-03 | Stephen R. van den Berg | | if(tp && dontcacheprefix->match(q))
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | m_delete(prepareds,q),tp=0;
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | _decodemsg(gotrowdescription);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tp)
tp->datarowdesc=_c.portal->_datarowdesc;
|
488ce7 | 2008-07-24 | Stephen R. van den Berg | | }
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | { array a;int i;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | len+=(i=sizeof(a=_c.portal->_datarowdesc))*2;
plugbuf+=({_c.plugint16(i)});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | foreach(a;;mapping col)
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf+=({_c.plugint16(oidformat(col->type))});
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | plugbuf[1]=_c.plugint32(len);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | PD("Bind portal %s statement %s\n",portalname,preparedname);
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.sendcmd(plugbuf);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | #ifdef DEBUGMORE
PD("%O\n",plugbuf);
#endif
}
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | _c.portal->_statuscmdcomplete=UNDEFINED;
|
80dbe8 | 2008-08-08 | Stephen R. van den Berg | | _sendexecute(_fetchlimit
&& !limitpostfix->match(q)
&& FETCHLIMITLONGRUN);
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(tp) {
|
49a328 | 2008-07-25 | Stephen R. van den Berg | | _decodemsg(bindcomplete);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | int tend=gethrtime();
if(tend==tstart)
m_delete(prepareds,q);
else {
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tp->hits++;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | totalhits++;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!tp->preparedname) {
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | if(sizeof(preparedname))
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tp->preparedname=preparedname;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | tstart=tend-tstart;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | if(!tp->tparse || tp->tparse>tstart)
tp->tparse=tstart;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tp->trunstart=tend;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | tprepared=tp;
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | }
}) {
PD("%O\n",err);
reload(1);
backendstatus=UNDEFINED;
throw(err);
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | { object tportal=_c.portal;
|
7ac2f1 | 2008-07-27 | Stephen R. van den Berg | | tportal->fetch_row(1);
|
a2014e | 2008-07-14 | Stephen R. van den Berg | | return tportal;
}
}
object streaming_query(string q,void|mapping(string|int:mixed) bindings) {
return big_query(q,bindings);
}
|
b15672 | 2008-08-25 | Stephen R. van den Berg | |
object big_typed_query(string q,void|mapping(string|int:mixed) bindings) {
return big_query(q,bindings,1);
}
|