ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
#pike __REAL_VERSION__
#include "pgsql.h"
#define FLUSH "H\0\0\0\4"
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | class PGassist
{ int(-1..1) peek(int timeout) { }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | string read(int len,void|int(0..1) not_all) { }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int write(string|array(string) data) { }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int getchar() { }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int close() { }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | private final array(string) cmdbuf=({});
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #ifdef USEPGsql
inherit _PGsql.PGsql;
#else
object portal;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | void setportal(void|object newportal)
{ portal=newportal;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int(-1..1) bpeek(int timeout)
{ return peek(timeout);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
int flushed=-1;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final int getbyte()
{ if(!flushed && !bpeek(0))
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | sendflush();
return getchar();
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | final string getstring(void|int len)
{ String.Buffer acc=String.Buffer();
if(!zero_type(len))
{ string res;
do
{ if(!flushed && !bpeek(0))
sendflush();
res=read(len,!flushed);
if(res)
{ if(!sizeof(res))
return acc->get();
acc->add(res);
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
while(sizeof(acc)<len&&res);
|
27738d | 2009-02-12 | Stephen R. van den Berg | | return sizeof(acc)?acc->get():res;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
int c;
while((c=getbyte())>0)
|
27738d | 2009-02-12 | Stephen R. van den Berg | | acc->putchar(c);
return acc->get();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final int getint16()
{ int s0=getbyte();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | int r=(s0&0x7f)<<8|getbyte();
return s0&0x80 ? r-(1<<15) : r ;
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final int getint32()
{ int r=getint16();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | r=r<<8|getbyte();
return r<<8|getbyte();
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final int getint64()
{ int r=getint32();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | return r<<32|getint32()&0xffffffff;
}
#endif
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final string plugbyte(int x)
{ return String.int2char(x&255);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final string plugint16(int x)
{ return sprintf("%c%c",x>>8&255,x&255);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final string plugint32(int x)
{ return sprintf("%c%c%c%c",x>>24&255,x>>16&255,x>>8&255,x&255);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline final string plugint64(int x)
{ return sprintf("%c%c%c%c%c%c%c%c",x>>56&255,x>>48&255,x>>40&255,x>>32&255,
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | x>>24&255,x>>16&255,x>>8&255,x&255);
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | final void sendflush()
{ sendcmd(({}),1);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | final void sendcmd(string|array(string) data,void|int flush)
{ if(arrayp(data))
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | cmdbuf+=data;
else
cmdbuf+=({data});
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | switch(flush)
{ case 3:
cmdbuf+=({FLUSH});
flushed=1;
break;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | default:
flushed=0;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | break;
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | case 1:
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | cmdbuf+=({FLUSH});
PD("Flush\n");
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | case 2:
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | flushed=1;
{ int i=write(cmdbuf);
if(portal && portal._pgsqlsess)
{ portal._pgsqlsess._packetssent++;
|
cb2623 | 2008-08-04 | Stephen R. van den Berg | | portal._pgsqlsess._bytessent+=i;
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | }
cmdbuf=({});
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | final void sendterminate()
{ PD("Terminate\n");
|
4741cd | 2008-07-31 | Stephen R. van den Berg | | sendcmd(({"X",plugint32(4)}),2);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | close();
}
|
d43282 | 2008-07-31 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | void create()
{
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | #ifdef USEPGsql
::create();
#endif
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | class PGconn
{ inherit PGassist:pg;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #ifdef UNBUFFEREDIO
inherit Stdio.File:std;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int getchar()
{ return std::read(1)[0];
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
#else
inherit Stdio.FILE:std;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int getchar()
{ return std::getchar();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
#endif
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int(-1..1) peek(int timeout)
{ return std::peek(timeout);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline string read(int len,void|int(0..1) not_all)
{ return std::read(len,not_all);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int write(string|array(string) data)
{ return std::write(data);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int close()
{ return std::close();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | void create(Stdio.File stream,object t)
{ std::create();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | std::assign(stream);
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | pg::create();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
}
#if constant(SSL.sslfile)
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | class PGconnS
{ inherit SSL.sslfile:std;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | inherit PGassist:pg;
Stdio.File rawstream;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int(-1..1) peek(int timeout)
{ return rawstream.peek(timeout);
|
17b753 | 2008-07-30 | Stephen R. van den Berg | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline string read(int len,void|int(0..1) not_all)
{ return std::read(len,not_all);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline int write(string|array(string) data)
{ return std::write(data);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
dc90a5 | 2014-05-15 | Martin Nilsson | | void create(Stdio.File stream, SSL.Context ctx)
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | { rawstream=stream;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | std::create(stream,ctx,1,1);
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | pg::create();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
}
#endif
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
041296 | 2009-01-19 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | class pgsql_result {
object _pgsqlsess;
private int numrows;
private int eoffound;
private mixed delayederror;
private int copyinprogress;
int _fetchlimit;
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | int _alltext;
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | | int _forcetext;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
#ifdef NO_LOCKING
int _qmtxkey;
#else
Thread.MutexKey _qmtxkey;
#endif
string _portalname;
int _bytesreceived;
int _rowsreceived;
int _interruptable;
int _inflight;
int _portalbuffersize;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | array _params;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | string _statuscmdcomplete;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | string _query;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | array(array(mixed)) _datarows;
|
6feb86 | 2009-01-06 | Stephen R. van den Berg | | array(mapping(string:mixed)) _datarowdesc=({});
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | array(int) _datatypeoid;
#ifdef USEPGsql
int _buffer;
#endif
|
e064e9 | 2008-08-05 | Stephen R. van den Berg | | private object fetchmutex;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | protected string _sprintf(int type, void|mapping flags)
{ string res=UNDEFINED;
switch(type)
{ case 'O':
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | res=sprintf("pgsql_result numrows: %d eof: %d querylock: %d"
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | " inflight: %d\nportalname: %O datarows: %d laststatus: %s\n",
|
17b753 | 2008-07-30 | Stephen R. van den Berg | | numrows,eoffound,!!_qmtxkey,_inflight,
_portalname,sizeof(_datarowdesc),
_statuscmdcomplete||"");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | break;
}
return res;
}
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | void create(object pgsqlsess,string query,int fetchlimit,
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | | int portalbuffersize,int alltyped,array params,int forcetext)
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | { _pgsqlsess = pgsqlsess;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | _query = query;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _datarows = ({ }); numrows = UNDEFINED;
fetchmutex = Thread.Mutex();
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | | _fetchlimit=forcetext?0:fetchlimit;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _portalbuffersize=portalbuffersize;
|
b15672 | 2008-08-25 | Stephen R. van den Berg | | _alltext = !alltyped;
|
c8942c | 2009-04-10 | Stephen R. van den Berg | | _params = params;
|
dc97bc | 2012-04-06 | Stephen R. van den Berg | | _forcetext = forcetext;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | steallock();
}
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | string status_command_complete()
{ return _statuscmdcomplete;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int affected_rows()
{ int rows;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | if(_statuscmdcomplete)
sscanf(_statuscmdcomplete,"%*s %d",rows);
return rows;
}
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int num_fields()
{ return sizeof(_datarowdesc);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int num_rows()
{ int numrows;
|
a941d3 | 2010-03-24 | Stephen R. van den Berg | | if(_statuscmdcomplete)
sscanf(_statuscmdcomplete,"%*s %d",numrows);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | return numrows;
}
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | int eof()
{ return eoffound;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | array(mapping(string:mixed)) fetch_fields()
{ return _datarowdesc+({});
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | private void releasesession()
{ if(_pgsqlsess)
{ if(copyinprogress)
{ PD("CopyDone\n");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _pgsqlsess._c.sendcmd("c\0\0\0\4",1);
}
|
6b81f4 | 2012-04-10 | Stephen R. van den Berg | | if(_pgsqlsess.is_open())
_pgsqlsess.resync(2);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
_qmtxkey=UNDEFINED;
_pgsqlsess=UNDEFINED;
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | void destroy()
{ catch
{ releasesession();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | };
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | inline private array(mixed) getdatarow()
{ array(mixed) datarow=_datarows[0];
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | _datarows=_datarows[1..];
return datarow;
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | private void steallock()
{
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #ifndef NO_LOCKING
PD("Going to steal oldportal %d\n",!!_pgsqlsess._c.portal);
Thread.MutexKey stealmtxkey = _pgsqlsess._stealmutex.lock();
do
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(_qmtxkey = _pgsqlsess._querymutex.current_locking_key())
{ pgsql_result portalb;
if(portalb=_pgsqlsess._c.portal)
{ _pgsqlsess._nextportal++;
if(portalb->_interruptable)
portalb->fetch_row(2);
else
{ PD("Waiting for the querymutex\n");
if((_qmtxkey=_pgsqlsess._querymutex.lock(2)))
{ if(copyinprogress)
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | error("COPY needs to be finished first\n");
error("Driver bug, please report, "
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | "conflict while interleaving SQL-operations\n");
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | PD("Got the querymutex\n");
}
_pgsqlsess._nextportal--;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
break;
}
while(!(_qmtxkey=_pgsqlsess._querymutex.trylock()));
#else
PD("Skipping lock\n");
_qmtxkey=1;
#endif
_pgsqlsess._c.setportal(this);
PD("Stealing successful\n");
}
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
39b062 | 2008-09-02 | Stephen R. van den Berg | |
|
f4c9d6 | 2009-02-15 | Stephen R. van den Berg | |
|
39b062 | 2008-09-02 | Stephen R. van den Berg | |
|
2c228b | 2009-02-15 | Stephen R. van den Berg | |
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | array(mixed) fetch_row(void|int|string|array(string) buffer)
{
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #ifndef NO_LOCKING
Thread.MutexKey fetchmtxkey = fetchmutex.lock();
#endif
if(!buffer && sizeof(_datarows))
return getdatarow();
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(copyinprogress)
{ fetchmtxkey = UNDEFINED;
if(stringp(buffer) || arrayp(buffer))
{ int totalsize=4;
|
39b062 | 2008-09-02 | Stephen R. van den Berg | | if(arrayp(buffer))
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | foreach(buffer;;string value)
totalsize+=sizeof(value);
|
39b062 | 2008-09-02 | Stephen R. van den Berg | | else
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | totalsize+=sizeof(buffer),buffer=({buffer});
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | PD("CopyData\n");
|
39b062 | 2008-09-02 | Stephen R. van den Berg | | _pgsqlsess._c.sendcmd(
({"d",_pgsqlsess._c.plugint32(totalsize)})+buffer,2);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
else
releasesession();
return UNDEFINED;
}
mixed err;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(buffer!=2 && (err=delayederror))
{ delayederror=UNDEFINED;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | throw(err);
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | err = catch
{ if(_portalname)
{ if(buffer!=2 && !_qmtxkey)
{ steallock();
if(_fetchlimit)
_pgsqlsess._sendexecute(_fetchlimit);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
while(_pgsqlsess._closesent)
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _pgsqlsess._decodemsg();
for(;;)
{
|
cd7f23 | 2014-03-01 | Martin Nilsson | | #ifdef PG_DEBUGMORE
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | PD("buffer: %d nextportal: %d lock: %d\n",
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | buffer,_pgsqlsess._nextportal,!!_qmtxkey);
#endif
#ifdef USEPGsql
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _buffer=buffer;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | switch(_pgsqlsess._decodemsg())
{ case copyinresponse:
copyinprogress=1;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | return UNDEFINED;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | case dataready:
_pgsqlsess._mstate=dataprocessed;
_rowsreceived++;
switch(buffer)
{ case 0:
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | case 1:
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(_fetchlimit)
_fetchlimit=
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | min(_portalbuffersize/2*_rowsreceived/_bytesreceived || 1,
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _pgsqlsess._fetchlimit);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | switch(buffer)
{ case 2:
case 3:
continue;
case 1:
_interruptable=1;
if(_pgsqlsess._nextportal)
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | continue;
#if STREAMEXECUTES
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(_fetchlimit && _inflight<=_fetchlimit-1)
_pgsqlsess._sendexecute(_fetchlimit);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | return UNDEFINED;
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #if STREAMEXECUTES
if(_fetchlimit && _inflight<=_fetchlimit-1)
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _pgsqlsess._sendexecute(_fetchlimit);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | return getdatarow();
case commandcomplete:
_inflight=0;
releasesession();
switch(buffer)
{ case 1:
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | case 2:
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | return UNDEFINED;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | case 3:
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(sizeof(_datarows))
return getdatarow();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | break;
case portalsuspended:
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | if(_inflight)
continue;
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | if(_pgsqlsess._nextportal)
{ switch(buffer)
{ case 1:
case 2:
_qmtxkey = UNDEFINED;
return UNDEFINED;
case 3:
_qmtxkey = UNDEFINED;
return getdatarow();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _fetchlimit=FETCHLIMITLONGRUN;
if(sizeof(_datarows))
{ _qmtxkey = UNDEFINED;
return getdatarow();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
buffer=3;
}
|
c0f2b7 | 2009-04-10 | Stephen R. van den Berg | | _pgsqlsess._sendexecute(_fetchlimit);
default:
continue;
}
break;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
}
eoffound=1;
return UNDEFINED;
};
PD("Exception %O\n",err);
|
e7621f | 2009-02-02 | Stephen R. van den Berg | | _pgsqlsess.resync();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | if(buffer!=2)
throw(err);
if(!delayederror)
delayederror=err;
return UNDEFINED;
}
};
|