ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
933a76 | 2014-11-10 | Stephen R. van den Berg | |
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | |
|
3a881c | 2014-11-10 | Stephen R. van den Berg | |
|
933a76 | 2014-11-10 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #pike __REAL_VERSION__
|
91e238 | 2014-11-10 | Stephen R. van den Berg | | #require constant(Thread.Thread)
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
#include "pgsql.h"
|
3a881c | 2014-11-10 | Stephen R. van den Berg | |
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | final Pike.Backend local_backend = Pike.SmallBackend();
|
3a881c | 2014-11-10 | Stephen R. van den Berg | |
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private Thread.Mutex backendmux = Thread.Mutex();
private int clientsregistered;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | constant emptyarray = ({});
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | constant describenodata
|
e2514a | 2017-06-28 | Stephen R. van den Berg | | = (["datarowdesc":emptyarray, "datarowtypes":emptyarray,
"datatypeoid":emptyarray]);
|
652b3c | 2014-11-19 | Stephen R. van den Berg | | final multiset censoroptions=(<"use_ssl","force_ssl",
"cache_autoprepared_statements","reconnect","text_query","is_superuser",
"server_encoding","server_version","integer_datetimes",
"session_authorization">);
|
d99e6e | 2017-07-10 | Stephen R. van den Berg | | constant stdiobuftype = typeof(Stdio.Buffer());
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | |
|
02aba9 | 2014-11-26 | Stephen R. van den Berg | | final Regexp createprefix=iregexp("^\a*(CREATE|DROP)\a");
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | |
|
02aba9 | 2014-11-26 | Stephen R. van den Berg | | private Regexp dontcacheprefix=iregexp("^\a*(FETCH|COPY)\a");
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | |
|
02aba9 | 2014-11-26 | Stephen R. van den Berg | | private Regexp paralleliseprefix
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | =iregexp("^\a*((SELEC|INSER)T|(UPDA|DELE)TE|(FETC|WIT)H)\a");
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | |
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | |
final Regexp transbeginprefix
|
48e6cd | 2017-07-08 | Stephen R. van den Berg | | =iregexp("^\a*(BEGIN|START)([; \t\f\r\n]|$)");
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | |
final Regexp transendprefix
|
48e6cd | 2017-07-08 | Stephen R. van den Berg | | =iregexp("^\a*(COMMIT|ROLLBACK|END)([; \t\f\r\n]|$)");
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | |
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | | |
a7d3c2 | 2017-07-28 | Stephen R. van den Berg | | * fetched in pieces. This heuristic will be sub-optimal whenever
* either an UPDATE/DELETE/INSERT statement is prefixed by WITH, or
* if there is a RETURNING with a *lot* of results. In those cases
* the portal will be busy until all results have been fetched, and will
* not be able to deliver results belonging to other parallel queries
* running on the same filedescriptor.
*
* However, considering that the current heuristic increases query-speed
* in the majority of the real-world cases, it would be considered a good
* tradeoff.
|
bb4cfe | 2014-11-26 | Stephen R. van den Berg | | */
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private Regexp execfetchlimit
|
02aba9 | 2014-11-26 | Stephen R. van den Berg | | =iregexp("^\a*((UPDA|DELE)TE|INSERT)\a|\aLIMIT\a+[1-9][; \t\f\r\n]*$");
private Regexp iregexp(string expr) {
Stdio.Buffer ret=Stdio.Buffer();
foreach(expr;;int c)
if(c>='A'&&c<='Z')
ret->add('[',c,c+'a'-'A',']');
else if(c=='\a')
ret->add("[ \t\f\r\n]");
else
ret->add_int8(c);
return Regexp(ret->read());
}
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | |
|
e8b500 | 2017-11-11 | Stephen R. van den Berg | | private Thread.Mutex cachemutex = Thread.Mutex();
|
b018a3 | 2017-11-11 | Stephen R. van den Berg | | private string cached_pass, cached_salt, cached_SaltedPassword;
private int cached_iters;
final string get_salted_password(string pass, string salt, int iters) {
|
e8b500 | 2017-11-11 | Stephen R. van den Berg | | Thread.MutexKey lock = cachemutex->lock();
string ret = cached_pass == pass && cached_salt == salt
&& cached_iters == iters && cached_SaltedPassword;
lock = 0;
return ret;
|
b018a3 | 2017-11-11 | Stephen R. van den Berg | | }
final void set_salted_password(string pass, string salt, int iters,
string SaltedPassword) {
|
e8b500 | 2017-11-11 | Stephen R. van den Berg | | Thread.MutexKey lock = cachemutex->lock();
|
b018a3 | 2017-11-11 | Stephen R. van den Berg | | cached_pass = pass; cached_salt = salt; cached_iters = iters;
cached_SaltedPassword = SaltedPassword;
|
e8b500 | 2017-11-11 | Stephen R. van den Berg | | lock = 0;
|
b018a3 | 2017-11-11 | Stephen R. van den Berg | | }
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | final void closestatement(bufcon|conxsess plugbuffer,string oldprep) {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | if(oldprep) {
PD("Close statement %s\n",oldprep);
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | CHAIN(plugbuffer)->add_int8('C')->add_hstring(({'S', oldprep, 0}), 4, 4);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
}
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private void run_local_backend() {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | Thread.MutexKey lock;
int looponce;
do {
looponce=0;
if(lock=backendmux->trylock()) {
PD("Starting local backend\n");
|
09206e | 2017-11-15 | Stephen R. van den Berg | | while (clientsregistered
|| sizeof(local_backend->call_out_info())) {
|
49143b | 2016-10-12 | Stephen R. van den Berg | | mixed err;
if (err = catch(local_backend(4096.0)))
werror(describe_backtrace(err));
}
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | PD("Terminating local backend\n");
lock=0;
looponce=clientsregistered;
}
} while(looponce);
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
3a881c | 2014-11-10 | Stephen R. van den Berg | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | final void register_backend() {
if(!clientsregistered++)
Thread.Thread(run_local_backend);
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
3a881c | 2014-11-10 | Stephen R. van den Berg | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | final void unregister_backend() {
--clientsregistered;
}
|
4741cd | 2008-07-31 | Stephen R. van den Berg | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | final void throwdelayederror(object parent) {
if(mixed err=parent._delayederror) {
parent._delayederror=UNDEFINED;
if(stringp(err))
err=({err,backtrace()[..<2]});
throw(err);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | final 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;
}
return 0;
}
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private inline mixed callout(function(mixed ...:void) f,
|
0fed8c | 2014-11-10 | Stephen R. van den Berg | | float|int delay,mixed ... args) {
return local_backend->call_out(f,delay,@args);
}
|
933a76 | 2014-11-10 | Stephen R. van den Berg | |
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | class bufcon {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | inherit Stdio.Buffer;
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | private int dirty;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
final bufcon `chain() {
return this;
}
#endif
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | private conxion realbuffer;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | protected void create(conxion _realbuffer) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | realbuffer=_realbuffer;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
d43282 | 2008-07-31 | Stephen R. van den Berg | |
|
bfa255 | 2016-10-15 | Stephen R. van den Berg | | final int `stashcount() {
return realbuffer->stashcount;
}
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | final bufcon start(void|int waitforreal) {
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | dirty = 1;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | realbuffer->stashcount++;
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | dirty = 2;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
if(waitforreal)
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | error("pgsql.bufcon not allowed here\n");
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | #endif
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return this;
}
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | final void sendcmd(int mode,void|sql_result portal) {
|
4e0be8 | 2014-11-18 | Stephen R. van den Berg | | Thread.MutexKey lock=realbuffer->shortmux->lock();
|
04e636 | 2017-07-03 | Stephen R. van den Berg | | if (portal)
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | realbuffer->stashqueue->write(portal);
|
04e636 | 2017-07-03 | Stephen R. van den Berg | | if (mode == SYNCSEND) {
add(PGSYNC);
realbuffer->stashqueue->write(1);
mode = SENDOUT;
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | realbuffer->stash->add(this);
|
04e636 | 2017-07-03 | Stephen R. van den Berg | | PD("%d>Stashed mode %d > %d\n",
|
3f39b5 | 2017-07-01 | Stephen R. van den Berg | | realbuffer->socket->query_fd(), mode, realbuffer->stashflushmode);
if (mode > realbuffer->stashflushmode)
realbuffer->stashflushmode = mode;
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | dirty = 1;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(!--realbuffer->stashcount)
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | dirty = 0, realbuffer->stashavail.signal();
else
dirty = 0;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | lock=0;
this->clear();
if(lock=realbuffer->nostash->trylock(1)) {
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
conxsess sess = conxsess(realbuffer);
realbuffer->started = lock;
lock = 0;
sess->sendcmd(SENDOUT);
#else
realbuffer->started = lock;
lock = 0;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | realbuffer->sendcmd(SENDOUT);
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #endif
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
d43282 | 2008-07-31 | Stephen R. van den Berg | | }
|
feb815 | 2017-11-09 | Stephen R. van den Berg | |
protected void _destruct() {
switch (dirty) {
case 1:
werror("FIXME: Race condition detected %s\n",
describe_backtrace(({"", backtrace()[..<1]})));
if (!realbuffer->stashcount)
break;
case 2:
Thread.MutexKey lock = realbuffer->shortmux->lock(2);
if (!--realbuffer->stashcount)
realbuffer->stashavail.signal();
lock = 0;
}
}
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | };
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | class conxiin {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | inherit Stdio.Buffer:i;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | |
final Thread.Condition fillread;
final Thread.Mutex fillreadmux;
|
279d84 | 2014-12-16 | Stephen R. van den Berg | | final int procmsg;
|
05b085 | 2014-11-25 | Stephen R. van den Berg | | private int didreadcb;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | |
protected bool range_error(int howmuch) {
#ifdef PG_DEBUG
if(howmuch<=0)
error("Out of range %d\n",howmuch);
#endif
if(fillread) {
Thread.MutexKey lock=fillreadmux->lock();
|
05b085 | 2014-11-25 | Stephen R. van den Berg | | if(!didreadcb)
|
2d67a1 | 2014-11-25 | Stephen R. van den Berg | | fillread.wait(lock);
|
05b085 | 2014-11-25 | Stephen R. van den Berg | | didreadcb=0;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | lock=0;
} else
throw(MAGICTERMINATE);
return true;
}
final int read_cb(mixed id,mixed b) {
|
08505c | 2017-07-01 | Stephen R. van den Berg | | PD("Read callback %O\n", b && ((string)b)
|
8551f7 | 2016-10-12 | Stephen R. van den Berg | | #ifndef PG_DEBUGMORE
[..255]
#endif
);
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | Thread.MutexKey lock=fillreadmux->lock();
|
c19871 | 2016-02-17 | Stephen R. van den Berg | | if(procmsg&&id)
procmsg=0,lock=0,Thread.Thread(id);
|
279d84 | 2014-12-16 | Stephen R. van den Berg | | else if(fillread)
|
05b085 | 2014-11-25 | Stephen R. van den Berg | | didreadcb=1, fillread.signal();
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | lock=0;
return 0;
}
protected void create() {
i::create();
fillreadmux=Thread.Mutex();
fillread=Thread.Condition();
}
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | };
|
c63925 | 2014-11-20 | Stephen R. van den Berg | |
|
57cfc6 | 2017-10-29 | Stephen R. van den Berg | | class sfile {
inherit Stdio.File;
int query_fd() {
return is_open() ? ::query_fd() : -1;
}
};
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | class conxion {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | inherit Stdio.Buffer:o;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | final conxiin i;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private Thread.Queue qportals;
|
4e0be8 | 2014-11-18 | Stephen R. van den Berg | | final Thread.Mutex shortmux;
|
fa4c47 | 2016-02-27 | Stephen R. van den Berg | | private int closenext;
|
e7c732 | 2016-02-24 | Stephen R. van den Berg | |
|
57cfc6 | 2017-10-29 | Stephen R. van den Berg | | final sfile socket;
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private int towrite;
|
3a1ed3 | 2015-12-23 | Stephen R. van den Berg | | final multiset(function(void|mixed:void)) closecallbacks=(<>);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final Thread.Mutex nostash;
final Thread.MutexKey started;
final Thread.Queue stashqueue;
final Thread.Condition stashavail;
final Stdio.Buffer stash;
final int stashflushmode;
final int stashcount;
final int synctransact;
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
final mixed nostrack;
#endif
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | #ifdef PG_DEBUG
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final int queueoutidx;
|
cbe52f | 2014-11-13 | Stephen R. van den Berg | | final int queueinidx=-1;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | #endif
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | private inline void queueup(sql_result portal) {
|
4ef8a3 | 2014-10-29 | Stephen R. van den Berg | | qportals->write(portal); portal->_synctransact=synctransact;
|
bf75ce | 2014-11-15 | Stephen R. van den Berg | | PD("%d>%O %d %d Queue portal %d bytes\n",socket->query_fd(),
portal._portalname,++queueoutidx,synctransact,sizeof(this));
|
4ef8a3 | 2014-10-29 | Stephen R. van den Berg | | }
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | final bufcon|conxsess start(void|int waitforreal) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | Thread.MutexKey lock;
if(lock=(waitforreal?nostash->lock:nostash->trylock)(1)) {
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | int mode;
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
conxsess sess = conxsess(this);
#endif
started = lock;
|
4e0be8 | 2014-11-18 | Stephen R. van den Berg | | lock=shortmux->lock();
|
4ef8a3 | 2014-10-29 | Stephen R. van den Berg | | if(stashcount)
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(stashavail.wait(lock));
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | mode = getstash(KEEP);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | lock=0;
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | if (mode > KEEP)
sendcmd(mode);
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
return sess;
#else
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return this;
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #endif
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | return bufcon(this)->start();
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private int write_cb() {
|
b982c0 | 2016-10-14 | Stephen R. van den Berg | | Thread.MutexKey lock = shortmux->lock();
|
5a8c95 | 2016-10-15 | Stephen R. van den Berg | | if (this) {
towrite -= output_to(socket, towrite);
lock = 0;
if (!i->fillread && !sizeof(this))
close();
}
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return 0;
}
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | private int getstash(int mode) {
if (sizeof(stash)) {
add(stash); stash->clear();
foreach (stashqueue->try_read_array();; int|sql_result portal)
if (intp(portal))
qportals->write(synctransact++);
else
queueup(portal);
|
3f39b5 | 2017-07-01 | Stephen R. van den Berg | | PD("%d>Got stash mode %d > %d\n",
socket->query_fd(), stashflushmode, mode);
if (stashflushmode > mode)
mode = stashflushmode;
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | stashflushmode = KEEP;
}
return mode;
}
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | final void sendcmd(void|int mode, void|sql_result portal) {
Thread.MutexKey lock;
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | if (portal)
queueup(portal);
unfinalised:
|
6a5bed | 2014-11-13 | Stephen R. van den Berg | | do {
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | switch (mode) {
|
6a5bed | 2014-11-13 | Stephen R. van den Berg | | default:
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | break unfinalised;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case SYNCSEND:
|
bf75ce | 2014-11-15 | Stephen R. van den Berg | | PD("%d>Sync %d %d Queue\n",
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | socket->query_fd(), synctransact, ++queueoutidx);
|
6a5bed | 2014-11-13 | Stephen R. van den Berg | | add(PGSYNC);
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | mode = SENDOUT;
|
6a5bed | 2014-11-13 | Stephen R. van den Berg | | break;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case FLUSHLOGSEND:
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | PD("%d>%O %d Queue simplequery %d bytes\n", socket->query_fd(),
portal._portalname, ++queueoutidx, sizeof(this));
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | mode = FLUSHSEND;
|
6a5bed | 2014-11-13 | Stephen R. van den Berg | | }
qportals->write(synctransact++);
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | } while(0);
lock = shortmux->lock();
mode = getstash(mode);
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | catch {
|
4ef8a3 | 2014-10-29 | Stephen R. van den Berg | | outer:
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | do {
switch(mode) {
default:
|
771a16 | 2016-10-13 | Stephen R. van den Berg | | PD("%d>Skip flush %d Queue %O\n",
socket->query_fd(), mode, (string)this);
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | break outer;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case FLUSHSEND:
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | PD("Flush\n");
add(PGFLUSH);
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case SENDOUT:;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | }
if(towrite=sizeof(this)) {
|
bf75ce | 2014-11-15 | Stephen R. van den Berg | | PD("%d>Sendcmd %O\n",socket->query_fd(),((string)this)[..towrite-1]);
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | towrite-=output_to(socket,towrite);
}
} while(0);
|
941f6c | 2014-11-19 | Stephen R. van den Berg | | lock=started=0;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | return;
};
|
941f6c | 2014-11-19 | Stephen R. van den Berg | | lock=0;
|
a0525b | 2017-11-17 | Stephen R. van den Berg | | destruct(this);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | final int close() {
|
6c4882 | 2016-02-28 | Stephen R. van den Berg | | if(!closenext && nostash) {
closenext=1;
Thread.MutexKey lock=i->fillreadmux->lock();
|
0983ca | 2016-02-17 | Stephen R. van den Berg | | if(i->fillread) {
i->fillread.signal();
i->fillread=0;
}
lock=0;
|
fe85ab | 2016-02-25 | Stephen R. van den Berg | | PD("%d>Delayed close, flush write\n",socket->query_fd());
i->read_cb(socket->query_id(),0);
|
6c4882 | 2016-02-28 | Stephen R. van den Berg | | return 0;
} else
return -1;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | protected void destroy() {
|
b982c0 | 2016-10-14 | Stephen R. van den Berg | | PD("%d>Close conxion %d\n", socket ? socket->query_fd() : -1, !!nostash);
|
1cb5e7 | 2016-12-06 | Stephen R. van den Berg | | int|.pgsql_util.sql_result portal;
|
243450 | 2017-07-01 | Stephen R. van den Berg | | if (qportals)
while (portal = qportals->try_read())
if (objectp(portal))
portal->_purgeportal();
|
6c4882 | 2016-02-28 | Stephen R. van den Berg | | if(nostash) {
catch {
|
58d0b0 | 2016-04-01 | Stephen R. van den Berg | | while(sizeof(closecallbacks))
foreach(closecallbacks;function(void|mixed:void) closecb;)
closecb();
|
6c4882 | 2016-02-28 | Stephen R. van den Berg | | destruct(nostash);
|
792569 | 2016-10-15 | Stephen R. van den Berg | | socket->set_nonblocking();
|
6c4882 | 2016-02-28 | Stephen R. van den Berg | | PD("%d>Close socket\n",socket->query_fd());
socket->close();
};
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
279d84 | 2014-12-16 | Stephen R. van den Berg | | final void connectloop(object pgsqlsess, int nossl) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | mixed err=catch {
for(;;clear()) {
socket->connect(pgsqlsess._host,pgsqlsess._port);
|
fc7f09 | 2014-06-01 | Martin Nilsson | | #if constant(SSL.File)
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(!nossl && !pgsqlsess->nossl
|
d743bf | 2014-11-13 | Stephen R. van den Berg | | && (pgsqlsess._options.use_ssl || pgsqlsess._options.force_ssl)) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | PD("SSLRequest\n");
start()->add_int32(8)->add_int32(PG_PROTOCOL(1234,5679))
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | ->sendcmd(SENDOUT);
|
7ae390 | 2017-11-21 | Stephen R. van den Berg | | string s = socket.read(1);
switch (sizeof(s) && s[0]) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | case 'S':
|
356f7e | 2017-11-21 | Stephen R. van den Berg | | object fcon = SSL.File(socket, SSL.Context());
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(fcon->connect()) {
|
356f7e | 2017-11-21 | Stephen R. van den Berg | | socket->set_backend(local_backend);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | socket=fcon;
break;
}
|
1cb5e7 | 2016-12-06 | Stephen R. van den Berg | | default:
PD("%d>Close socket short\n", socket->query_fd());
|
bf75ce | 2014-11-15 | Stephen R. van den Berg | | socket->close();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | pgsqlsess.nossl=1;
continue;
case 'N':
|
d743bf | 2014-11-13 | Stephen R. van den Berg | | if(pgsqlsess._options.force_ssl)
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | error("Encryption not supported on connection to %s:%d\n",
pgsqlsess.host,pgsqlsess.port);
}
}
#else
|
d743bf | 2014-11-13 | Stephen R. van den Berg | | if(pgsqlsess._options.force_ssl)
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | error("Encryption library missing,"
" cannot establish connection to %s:%d\n",
pgsqlsess.host,pgsqlsess.port);
#endif
break;
}
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | if(!socket->is_open())
|
2056de | 2015-12-05 | Stephen R. van den Berg | | error(strerror(socket->errno())+".\n");
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | socket->set_backend(local_backend);
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | socket->set_buffer_mode(i,0);
|
3811e3 | 2014-12-02 | Stephen R. van den Berg | | socket->set_nonblocking(i->read_cb,write_cb,close);
|
a0525b | 2017-11-17 | Stephen R. van den Berg | | if (nossl != 2)
|
8551f7 | 2016-10-12 | Stephen R. van den Berg | | Thread.Thread(pgsqlsess->_processloop,this);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return;
};
|
a0525b | 2017-11-17 | Stephen R. van den Berg | | destruct(this);
|
0d1a5e | 2014-11-14 | Stephen R. van den Berg | | }
private string _sprintf(int type, void|mapping flags) {
string res=UNDEFINED;
switch(type) {
case 'O':
|
bf9dab | 2016-02-17 | Stephen R. van den Berg | | int fd=-1;
if(socket)
catch(fd=socket->query_fd());
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | res=predef::sprintf("conxion fd: %d input queue: %d/%d "
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | "queued portals: %d output queue: %d/%d\n"
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | "started: %d stashcount: %d\n",
|
bf9dab | 2016-02-17 | Stephen R. van den Berg | | fd,sizeof(i),i->_size_object(),
|
243450 | 2017-07-01 | Stephen R. van den Berg | | qportals && qportals->size(), sizeof(this), _size_object(),
|
feb815 | 2017-11-09 | Stephen R. van den Berg | | !!started, stashcount);
|
0d1a5e | 2014-11-14 | Stephen R. van den Berg | | break;
}
return res;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
279d84 | 2014-12-16 | Stephen R. van den Berg | | protected void create(object pgsqlsess,Thread.Queue _qportals,int nossl) {
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | o::create();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | qportals = _qportals;
|
4ef8a3 | 2014-10-29 | Stephen R. van den Berg | | synctransact = 1;
|
57cfc6 | 2017-10-29 | Stephen R. van den Berg | | socket=sfile();
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | i=conxiin();
|
efdef4 | 2014-11-18 | Stephen R. van den Berg | | shortmux=Thread.Mutex();
|
941f6c | 2014-11-19 | Stephen R. van den Berg | | nostash=Thread.Mutex();
|
fa4c47 | 2016-02-27 | Stephen R. van den Berg | | closenext = 0;
|
941f6c | 2014-11-19 | Stephen R. van den Berg | | stashavail=Thread.Condition();
stashqueue=Thread.Queue();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | stash=Stdio.Buffer();
|
279d84 | 2014-12-16 | Stephen R. van den Berg | | Thread.Thread(connectloop,pgsqlsess,nossl);
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | };
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | #ifdef PG_DEBUGRACE
class conxsess {
final conxion chain;
void create(conxion parent) {
if (parent->started)
werror("Overwriting conxsess %s %s\n",
describe_backtrace(({"new ", backtrace()[..<1]})),
describe_backtrace(({"old ", parent->nostrack})));
parent->nostrack = backtrace();
chain = parent;
}
final void sendcmd(int mode,void|sql_result portal) {
chain->sendcmd(mode, portal);
chain = 0;
}
void destroy() {
if (chain)
werror("Untransmitted conxsess %s\n",
describe_backtrace(({"", backtrace()[..<1]})));
}
};
#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 | |
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | class sql_result {
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private object pgsqlsess;
private int eoffound;
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | private conxion c;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | private conxiin cr;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final mixed _delayederror;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | final int _state;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final int _fetchlimit;
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | private int alltext;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final int _forcetext;
|
f90874 | 2017-02-04 | Stephen R. van den Berg | | private int syncparse;
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | private int transtype;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | |
final string _portalname;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | private int rowsreceived;
private int inflight;
private int portalbuffersize;
private Thread.Mutex closemux;
private Thread.Queue datarows;
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | private array(mapping(string:mixed)) datarowdesc;
|
d9b304 | 2014-11-25 | Stephen R. van den Berg | | private array(int) datarowtypes;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | private string statuscmdcomplete;
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | private int bytesreceived;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | final int _synctransact;
final Thread.Condition _ddescribe;
final Thread.Mutex _ddescribemux;
final Thread.MutexKey _unnamedportalkey,_unnamedstatementkey;
final array _params;
final string _query;
final string _preparedname;
final mapping(string:mixed) _tprepared;
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | private function(:void) gottimeout;
private int timeout;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private string _sprintf(int type, void|mapping flags) {
|
11b13b | 2014-08-16 | Martin Nilsson | | string res=UNDEFINED;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | switch(type) {
case 'O':
|
bf9dab | 2016-02-17 | Stephen R. van den Berg | | int fd=-1;
if(c&&c->socket)
catch(fd=c->socket->query_fd());
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | res=sprintf("sql_result state: %d numrows: %d eof: %d inflight: %d\n"
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | "query: %O\n"
|
5600d2 | 2014-11-18 | Stephen R. van den Berg | | "fd: %O portalname: %O datarows: %d"
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | " synctransact: %d laststatus: %s\n",
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | _state,rowsreceived,eoffound,inflight,
|
bf9dab | 2016-02-17 | Stephen R. van den Berg | | _query,fd,_portalname,datarowtypes&&sizeof(datarowtypes),
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | _synctransact,
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | statuscmdcomplete||(_unnamedstatementkey?"*parsing*":""));
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | break;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
return res;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | protected void create(object _pgsqlsess,conxion _c,string query,
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | int _portalbuffersize,int alltyped,array params,int forcetext,
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | int _timeout, int _syncparse, int _transtype) {
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | pgsqlsess = _pgsqlsess;
|
09206e | 2017-11-15 | Stephen R. van den Berg | | if (catch(cr = (c = _c)->i))
losterror();
|
11b13b | 2014-08-16 | Martin Nilsson | | _query = query;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | datarows = Thread.Queue();
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | _ddescribe=Thread.Condition();
_ddescribemux=Thread.Mutex();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | closemux=Thread.Mutex();
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | portalbuffersize=_portalbuffersize;
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | alltext = !alltyped;
|
11b13b | 2014-08-16 | Martin Nilsson | | _params = params;
_forcetext = forcetext;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | _state = PORTALINIT;
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | timeout = _timeout;
|
f90874 | 2017-02-04 | Stephen R. van den Berg | | syncparse = _syncparse;
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | gottimeout = _pgsqlsess->cancelquery;
|
58d0b0 | 2016-04-01 | Stephen R. van den Berg | | c->closecallbacks+=(<destroy>);
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | transtype = _transtype;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
c6d661 | 2017-11-16 | Stephen R. van den Berg | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final string status_command_complete() {
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | return statuscmdcomplete;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
c6d661 | 2017-11-16 | Stephen R. van den Berg | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final int affected_rows() {
|
11b13b | 2014-08-16 | Martin Nilsson | | int rows;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | if(statuscmdcomplete)
sscanf(statuscmdcomplete,"%*s %d",rows);
|
11b13b | 2014-08-16 | Martin Nilsson | | return rows;
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | final void _storetiming() {
if(_tprepared) {
_tprepared.trun=gethrtime()-_tprepared.trunstart;
m_delete(_tprepared,"trunstart");
_tprepared = UNDEFINED;
}
}
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private void waitfordescribe() {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | Thread.MutexKey lock=_ddescribemux->lock();
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!datarowtypes)
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(_ddescribe->wait(lock));
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | lock=0;
}
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final int num_fields() {
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!datarowtypes)
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | waitfordescribe();
trydelayederror();
|
192acd | 2014-11-22 | Stephen R. van den Berg | | return sizeof(datarowtypes);
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
bbb4ce | 2014-11-24 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final int num_rows() {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | trydelayederror();
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | return rowsreceived;
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
09206e | 2017-11-15 | Stephen R. van den Berg | | private void losterror() {
string err;
if (pgsqlsess)
err = pgsqlsess->error(1);
error("%s\n", err || "Database connection lost");
}
private void trydelayederror() {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(_delayederror)
throwdelayederror(this);
|
09206e | 2017-11-15 | Stephen R. van den Berg | | else if (_state == PURGED)
losterror();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final int eof() {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
|
11b13b | 2014-08-16 | Martin Nilsson | | return eoffound;
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final array(mapping(string:mixed)) fetch_fields() {
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!datarowtypes)
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | waitfordescribe();
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | return datarowdesc+emptyarray;
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | }
#ifdef PG_DEBUG
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | #define INTVOID int
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | #else
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | #define INTVOID void
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | #endif
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final INTVOID _decodedata(int msglen,string cenc) {
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | _storetiming(); _releasestatement();
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | string serror;
bytesreceived+=msglen;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | int cols=cr->read_int16();
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | array a=allocate(cols,!alltext&&Val.null);
#ifdef PG_DEBUG
msglen-=2+4*cols;
#endif
|
192acd | 2014-11-22 | Stephen R. van den Berg | | foreach(datarowtypes;int i;int typ) {
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | int collen=cr->read_sint(4);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | if(collen>0) {
#ifdef PG_DEBUG
msglen-=collen;
#endif
mixed value;
|
192acd | 2014-11-22 | Stephen R. van den Berg | | switch(typ) {
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | case FLOAT4OID:
#if SIZEOF_FLOAT>=8
case FLOAT8OID:
#endif
if(!alltext) {
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | value=(float)cr->read(collen);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | break;
}
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | default:value=cr->read(collen);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | break;
case CHAROID:
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | value=alltext?cr->read(1):cr->read_int8();
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | break;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | case BOOLOID:value=cr->read_int8();
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | switch(value) {
case 'f':value=0;
break;
case 't':value=1;
}
if(alltext)
value=value?"t":"f";
break;
case TEXTOID:
case BPCHAROID:
case VARCHAROID:
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | value=cr->read(collen);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | 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) {
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | value=cr->read(collen);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | if(!alltext)
value=(int)value;
} else {
switch(typ) {
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | case INT8OID:value=cr->read_sint(8);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | break;
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | case INT2OID:value=cr->read_sint(2);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | break;
case OIDOID:
|
c63925 | 2014-11-20 | Stephen R. van den Berg | | case INT4OID:value=cr->read_sint(4);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | }
if(alltext)
value=(string)value;
}
}
a[i]=value;
} else if(!collen)
a[i]="";
}
_processdataready(a);
if(serror)
error(serror);
#ifdef PG_DEBUG
return msglen;
#endif
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | final void _setrowdesc(array(mapping(string:mixed)) drowdesc,
array(int) drowtypes) {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | Thread.MutexKey lock=_ddescribemux->lock();
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | datarowdesc=drowdesc;
datarowtypes=drowtypes;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | _ddescribe->broadcast();
lock=0;
}
|
42fc8c | 2014-11-03 | Stephen R. van den Berg | | final void _preparebind(array dtoid) {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | array(string|int) paramValues=_params?_params[2]:({});
if(sizeof(dtoid)!=sizeof(paramValues))
SUSERERROR("Invalid number of bindings, expected %d, got %d\n",
sizeof(dtoid),sizeof(paramValues));
|
192acd | 2014-11-22 | Stephen R. van den Berg | | Thread.MutexKey lock=_ddescribemux->lock();
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | if(!_portalname) {
_portalname=(_unnamedportalkey=pgsqlsess._unnamedportalmux->trylock(1))
? "" : PORTALPREFIX
#ifdef PG_DEBUG
+(string)(c->socket->query_fd())+"_"
#endif
+int2hex(pgsqlsess._pportalcount++);
lock=0;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | #ifdef PG_DEBUGMORE
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | PD("ParamValues to bind: %O\n",paramValues);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | #endif
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | Stdio.Buffer plugbuffer=Stdio.Buffer();
|
78b2c5 | 2014-11-26 | Stephen R. van den Berg | | { array dta=({sizeof(dtoid)});
plugbuffer->add(_portalname,0,_preparedname,0)
->add_ints(dta+map(dtoid,oidformat)+dta,2);
}
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | string cenc=pgsqlsess._runtimeparameter[CLIENT_ENCODING];
foreach(paramValues;int i;mixed value) {
if(undefinedp(value) || objectp(value)&&value->is_val_null)
plugbuffer->add_int32(-1);
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:;
}
plugbuffer->add_int32(k);
} else
switch(dtoid[i]) {
case TEXTOID:
case BPCHAROID:
case VARCHAROID: {
if(!value) {
plugbuffer->add_int32(-1);
break;
}
value=(string)value;
switch(cenc) {
case UTF8CHARSET:
value=string_to_utf8(value);
break;
default:
if(String.width(value)>8) {
SUSERERROR("Don't know how to convert %O to %s encoding\n",
value,cenc);
value="";
}
}
plugbuffer->add_hstring(value,4);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
}
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | default: {
if(!value) {
plugbuffer->add_int32(-1);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | }
|
d99e6e | 2017-07-10 | Stephen R. van den Berg | | if (!objectp(value) || typeof(value) != stdiobuftype)
if (multisetp(value) && sizeof(value) == 1)
value = indices(value)[0];
else {
value = (string)value;
if (String.width(value) > 8)
if (dtoid[i] == BYTEAOID)
value = string_to_utf8(value);
else {
SUSERERROR(
"Wide string %O not supported for type OID %d\n",
value,dtoid[i]);
value="";
}
}
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | plugbuffer->add_hstring(value,4);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
}
|
f782e9 | 2014-11-25 | Stephen R. van den Berg | | case BOOLOID:
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | do {
int tval;
if(stringp(value))
tval=value[0];
else if(!intp(value)) {
value=!!value;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | } else
tval=value;
switch(tval) {
case 'o':case 'O':
catch {
tval=value[1];
value=tval=='n'||tval=='N';
};
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | default:
value=1;
break;
case 0:case '0':case 'f':case 'F':case 'n':case 'N':
value=0;
break;
}
} while(0);
|
f782e9 | 2014-11-25 | Stephen R. van den Berg | | plugbuffer->add_int32(1)->add_int8(value);
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | break;
case CHAROID:
if(intp(value))
plugbuffer->add_hstring(value,4);
else {
value=(string)value;
switch(sizeof(value)) {
default:
SUSERERROR(
"\"char\" types must be 1 byte wide, got %O\n",value);
case 0:
plugbuffer->add_int32(-1);
break;
case 1:
plugbuffer->add_hstring(value[0],4);
}
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | break;
case INT8OID:
plugbuffer->add_int32(8)->add_int((int)value,8);
break;
case OIDOID:
case INT4OID:
plugbuffer->add_int32(4)->add_int32((int)value);
break;
case INT2OID:
plugbuffer->add_int32(2)->add_int16((int)value);
break;
}
}
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!datarowtypes) {
if(_tprepared && dontcacheprefix->match(_query))
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | m_delete(pgsqlsess->_prepareds,_query),_tprepared=0;
|
192acd | 2014-11-22 | Stephen R. van den Berg | | waitfordescribe();
|
2cdb90 | 2014-11-18 | Stephen R. van den Berg | | }
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(_state>=CLOSING)
lock=_unnamedstatementkey=0;
else {
plugbuffer->add_int16(sizeof(datarowtypes));
if(sizeof(datarowtypes))
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | plugbuffer->add_ints(map(datarowtypes,oidformat),2);
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | else if (syncparse < 0 && !pgsqlsess->_wasparallelisable
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | && pgsqlsess->_statementsinflight > 1) {
|
192acd | 2014-11-22 | Stephen R. van den Berg | | lock=pgsqlsess->_shortmux->lock();
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | |
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | if(--pgsqlsess->_statementsinflight) {
|
192acd | 2014-11-22 | Stephen R. van den Berg | | pgsqlsess->_waittocommit++;
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | PD("Commit waiting for statements to finish\n");
|
3a1ed3 | 2015-12-23 | Stephen R. van den Berg | | catch(PT(pgsqlsess->_readyforcommit->wait(lock)));
|
192acd | 2014-11-22 | Stephen R. van den Berg | | pgsqlsess->_waittocommit--;
}
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | |
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | pgsqlsess->_statementsinflight++;
|
192acd | 2014-11-22 | Stephen R. van den Berg | | }
lock=0;
PD("Bind portal %O statement %O\n",_portalname,_preparedname);
_fetchlimit=pgsqlsess->_fetchlimit;
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | _bindportal();
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | conxsess bindbuffer = c->start();
|
192acd | 2014-11-22 | Stephen R. van den Berg | | _unnamedstatementkey=0;
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | CHAIN(bindbuffer)->add_int8('B')->add_hstring(plugbuffer, 4, 4);
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!_tprepared && sizeof(_preparedname))
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | closestatement(CHAIN(bindbuffer), _preparedname);
|
192acd | 2014-11-22 | Stephen R. van den Berg | | _sendexecute(_fetchlimit
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | && !(transtype != NOTRANS
|
192acd | 2014-11-22 | Stephen R. van den Berg | | || sizeof(_query)>=MINPREPARELENGTH &&
execfetchlimit->match(_query))
&& _fetchlimit,bindbuffer);
}
} else
lock=0;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | final void _processrowdesc(array(mapping(string:mixed)) datarowdesc,
array(int) datarowtypes) {
_setrowdesc(datarowdesc,datarowtypes);
if(_tprepared) {
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | _tprepared.datarowdesc=datarowdesc;
|
a2b20d | 2014-11-25 | Stephen R. van den Berg | | _tprepared.datarowtypes=datarowtypes;
}
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | final void _parseportal() {
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | Thread.MutexKey lock = closemux->lock();
_state=PARSING;
Thread.MutexKey lockc = pgsqlsess->_shortmux->lock();
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | if (syncparse || syncparse < 0 && pgsqlsess->_wasparallelisable) {
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | if(pgsqlsess->_statementsinflight) {
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | pgsqlsess->_waittocommit++;
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | PD("Commit waiting for statements to finish\n");
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | |
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | catch(PT(pgsqlsess->_readyforcommit->wait(lockc)));
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | pgsqlsess->_waittocommit--;
}
}
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | pgsqlsess->_statementsinflight++;
lockc = 0;
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | lock=0;
statuscmdcomplete=UNDEFINED;
pgsqlsess->_wasparallelisable = paralleliseprefix->match(_query);
}
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | final void _releasestatement(void|int nolock) {
Thread.MutexKey lock;
if (!nolock)
lock = closemux->lock();
if (_state <= BOUND) {
_state = COMMITTED;
lock = pgsqlsess->_shortmux->lock();
if (!--pgsqlsess->_statementsinflight && pgsqlsess->_waittocommit) {
PD("Signal no statements in flight\n");
catch(pgsqlsess->_readyforcommit->signal());
}
}
lock = 0;
}
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | final void _bindportal() {
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | Thread.MutexKey lock = closemux->lock();
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | _state=BOUND;
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | Thread.MutexKey lockc = pgsqlsess->_shortmux->lock();
pgsqlsess->_portalsinflight++;
lockc = 0;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | lock=0;
}
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | final void _purgeportal() {
|
a3a82e | 2017-06-17 | Stephen R. van den Berg | | PD("Purge portal\n");
|
b4c7e9 | 2014-11-18 | Stephen R. van den Berg | | datarows->write(1);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | Thread.MutexKey lock=closemux->lock();
_fetchlimit=0;
switch(_state) {
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case COPYINPROGRESS:
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | case COMMITTED:
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case BOUND:
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | --pgsqlsess->_portalsinflight;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | switch(_state) {
case BOUND:
case PARSING:
--pgsqlsess->_statementsinflight;
}
|
09206e | 2017-11-15 | Stephen R. van den Berg | | _state = PURGED;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | lock=0;
|
e302b6 | 2014-11-14 | Stephen R. van den Berg | | releaseconditions();
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | final int _closeportal(conxsess cs) {
object plugbuffer = CHAIN(cs);
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | int retval=KEEP;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | PD("%O Try Closeportal %d\n",_portalname,_state);
Thread.MutexKey lock=closemux->lock();
_fetchlimit=0;
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | switch(_state) {
case PARSING:
case BOUND:
_releasestatement(1);
}
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | switch(_state) {
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case PORTALINIT:
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | case PARSING:
|
e302b6 | 2014-11-14 | Stephen R. van den Berg | | _unnamedstatementkey=0;
|
b4c7e9 | 2014-11-18 | Stephen R. van den Berg | | _state=CLOSING;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | break;
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case COPYINPROGRESS:
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | PD("CopyDone\n");
plugbuffer->add("c\0\0\0\4");
|
cfa248 | 2017-06-18 | Stephen R. van den Berg | | case COMMITTED:
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | case BOUND:
|
b4c7e9 | 2014-11-18 | Stephen R. van den Berg | | _state=CLOSING;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | lock=0;
PD("Close portal %O\n",_portalname);
|
617210 | 2017-06-21 | Stephen R. van den Berg | | if (_portalname && sizeof(_portalname)) {
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | plugbuffer->add_int8('C')->add_hstring(({'P',_portalname,0}),4,4);
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | retval=FLUSHSEND;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | } else
_unnamedportalkey=0;
|
4e0be8 | 2014-11-18 | Stephen R. van den Berg | | Thread.MutexKey lockc=pgsqlsess->_shortmux->lock();
|
d743bf | 2014-11-13 | Stephen R. van den Berg | | if(!--pgsqlsess->_portalsinflight) {
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | if(!pgsqlsess->_waittocommit && !plugbuffer->stashcount
&& transtype != TRANSBEGIN)
|
bfa255 | 2016-10-15 | Stephen R. van den Berg | |
|
0e7f33 | 2014-11-15 | Stephen R. van den Berg | | pgsqlsess->_readyforquerycount++, retval=SYNCSEND;
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | pgsqlsess->_pportalcount=0;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
d743bf | 2014-11-13 | Stephen R. van den Berg | | lockc=0;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
lock=0;
return retval;
}
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | final void _processdataready(array datarow,void|int msglen) {
bytesreceived+=msglen;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | inflight--;
|
b4c7e9 | 2014-11-18 | Stephen R. van den Berg | | if(_state<CLOSED)
datarows->write(datarow);
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | if(++rowsreceived==1)
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | PD("<%O _fetchlimit %d=min(%d||1,%d), inflight %d\n",_portalname,
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | _fetchlimit,(portalbuffersize>>1)*rowsreceived/bytesreceived,
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | pgsqlsess._fetchlimit,inflight);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(_fetchlimit) {
_fetchlimit=
|
15d4e1 | 2014-11-18 | Stephen R. van den Berg | | min((portalbuffersize>>1)*rowsreceived/bytesreceived||1,
|
a362e3 | 2014-11-03 | Stephen R. van den Berg | | pgsqlsess._fetchlimit);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | Thread.MutexKey lock=closemux->lock();
|
d89975 | 2014-11-22 | Stephen R. van den Berg | | if(_fetchlimit && inflight<=(_fetchlimit-1)>>1)
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | _sendexecute(_fetchlimit);
else if(!_fetchlimit)
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | PD("<%O _fetchlimit %d, inflight %d, skip execute\n",
_portalname,_fetchlimit,inflight);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | lock=0;
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
e302b6 | 2014-11-14 | Stephen R. van den Berg | | private void releaseconditions() {
|
3b899a | 2015-01-05 | Stephen R. van den Berg | | _unnamedportalkey=_unnamedstatementkey=0;
|
e302b6 | 2014-11-14 | Stephen R. van den Berg | | pgsqlsess=0;
|
192acd | 2014-11-22 | Stephen R. van den Berg | | if(!datarowtypes) {
Thread.MutexKey lock=_ddescribemux->lock();
|
09206e | 2017-11-15 | Stephen R. van den Berg | | datarowdesc = datarowtypes = emptyarray;
|
5527d0 | 2014-11-17 | Stephen R. van den Berg | | _ddescribe->broadcast();
|
192acd | 2014-11-22 | Stephen R. van den Berg | | lock=0;
|
cbe52f | 2014-11-13 | Stephen R. van den Berg | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | | }
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | final void _releasesession(void|string statusccomplete) {
|
3a1ed3 | 2015-12-23 | Stephen R. van den Berg | | c->closecallbacks-=(<destroy>);
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | if(statusccomplete && !statuscmdcomplete)
statuscmdcomplete=statusccomplete;
inflight=0;
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | conxsess plugbuffer;
if (!catch(plugbuffer = c->start()))
|
3a1ed3 | 2015-12-23 | Stephen R. van den Berg | | plugbuffer->sendcmd(_closeportal(plugbuffer));
|
09206e | 2017-11-15 | Stephen R. van den Berg | | if (_state < CLOSED)
_state = CLOSED;
|
49e330 | 2017-11-09 | Stephen R. van den Berg | | datarows->write(1);
|
e302b6 | 2014-11-14 | Stephen R. van den Berg | | releaseconditions();
}
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | protected void destroy() {
catch {
_releasesession();
|
11b13b | 2014-08-16 | Martin Nilsson | | };
}
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | final void _sendexecute(int fetchlimit,void|bufcon|conxsess plugbuffer) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | int flushmode;
|
1c847c | 2017-06-27 | Stephen R. van den Berg | | PD("Execute portal %O fetchlimit %d transtype %d\n", _portalname,
fetchlimit, transtype);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(!plugbuffer)
plugbuffer=c->start(1);
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | CHAIN(plugbuffer)->add_int8('E')->add_hstring(({_portalname,0}), 4, 8)
|
78b2c5 | 2014-11-26 | Stephen R. van den Berg | | ->add_int32(fetchlimit);
|
bd47ec | 2017-06-25 | Stephen R. van den Berg | | if (!fetchlimit) {
if (transtype != NOTRANS)
pgsqlsess._intransaction = transtype == TRANSBEGIN;
flushmode = _closeportal(plugbuffer) == SYNCSEND
|| transtype == TRANSEND ? SYNCSEND : FLUSHSEND;
} else
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | inflight+=fetchlimit, flushmode=FLUSHSEND;
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | plugbuffer->sendcmd(flushmode,this);
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final array(mixed) fetch_row() {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | int|array datarow;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | if(arrayp(datarow=datarows->try_read()))
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return datarow;
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | if(!eoffound) {
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | if(!datarow) {
PD("%O Block for datarow\n",_portalname);
array cid=callout(gottimeout,timeout);
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(datarow=datarows->read());
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | local_backend->remove_call_out(cid);
if(arrayp(datarow))
return datarow;
}
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | eoffound=1;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | datarows->write(1);
|
fb8eb4 | 2014-10-31 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
return 0;
}
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final array(array(mixed)) fetch_row_array() {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(eoffound)
return 0;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | array(array|int) datarow=datarows->try_read_array();
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | if(!datarow) {
array cid=callout(gottimeout,timeout);
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(datarow=datarows->read_array());
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | local_backend->remove_call_out(cid);
}
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | if(arrayp(datarow[-1]))
return datarow;
trydelayederror();
eoffound=1;
|
bf2092 | 2014-11-17 | Stephen R. van den Berg | | datarows->write(1);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | return (datarow=datarow[..<1]);
}
|
933a76 | 2014-11-10 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
11b13b | 2014-08-16 | Martin Nilsson | |
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final void send_row(void|string|array(string) copydata) {
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
if(copydata) {
PD("CopyData\n");
|
8675b0 | 2017-06-03 | Stephen R. van den Berg | | object cs = c->start();
CHAIN(cs)->add_int8('d')->add_hstring(copydata, 4, 4);
cs->sendcmd(SENDOUT);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | } else
_releasesession();
}
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private void run_result_cb(
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | function(sql_result, array(mixed), mixed ...:void) callback,
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | array(mixed) args) {
int|array datarow;
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | for(;;) {
array cid=callout(gottimeout,timeout);
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(datarow=datarows->read());
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | local_backend->remove_call_out(cid);
if(!arrayp(datarow))
break;
|
0fed8c | 2014-11-10 | Stephen R. van den Berg | | callout(callback, 0, this, datarow, @args);
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
eoffound=1;
|
0fed8c | 2014-11-10 | Stephen R. van den Berg | | callout(callback, 0, this, 0, @args);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final void set_result_callback(
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | function(sql_result, array(mixed), mixed ...:void) callback,
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | mixed ... args) {
if(callback)
Thread.Thread(run_result_cb,callback,args);
}
|
6eb594 | 2014-11-12 | Stephen R. van den Berg | | private void run_result_array_cb(
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | function(sql_result, array(array(mixed)), mixed ...:void) callback,
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | array(mixed) args) {
array(array|int) datarow;
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | for(;;) {
array cid=callout(gottimeout,timeout);
|
abf944 | 2014-12-01 | Stephen R. van den Berg | | PT(datarow=datarows->read_array());
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | local_backend->remove_call_out(cid);
if(!datarow || !arrayp(datarow[-1]))
break;
|
0fed8c | 2014-11-10 | Stephen R. van den Berg | | callout(callback, 0, this, datarow, @args);
|
1611e4 | 2014-11-28 | Stephen R. van den Berg | | }
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | trydelayederror();
eoffound=1;
if(sizeof(datarow)>1)
|
0fed8c | 2014-11-10 | Stephen R. van den Berg | | callout(callback, 0, this, datarow=datarow[..<1], @args);
callout(callback, 0, this, 0, @args);
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | }
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | final void set_result_array_callback(
|
3b31fa | 2014-11-14 | Stephen R. van den Berg | | function(sql_result, array(array(mixed)), mixed ...:void) callback,
|
cff3a3 | 2014-09-12 | Stephen R. van den Berg | | mixed ... args) {
if(callback)
Thread.Thread(run_result_array_cb,callback,args);
|
11b13b | 2014-08-16 | Martin Nilsson | | }
|
ecbab1 | 2008-07-27 | Stephen R. van den Berg | |
|
74abb0 | 2014-11-24 | Stephen R. van den Berg | | };
|