pike.git
/
lib
/
modules
/
Sql.pmod
/
pgsql_util.pmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:542:
//! @seealso //! @[Sql.sql_result()->fetch_fields()] array(mapping(string:mixed)) fetch_fields() { if(!_datarowdesc) waitfordescribe(); trydelayederror(); return _datarowdesc+({}); } final void _setrowdesc(array(mapping(string:mixed)) datarowdesc) {
-
_datarowdesc=datarowdesc;
+
Thread.MutexKey lock=_ddescribemux->lock();
-
+
_datarowdesc=datarowdesc;
_ddescribe->broadcast(); lock=0; } final void _preparebind(array dtoid) { 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)); #ifdef PG_DEBUGMORE
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:677:
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; } }
-
prepbuffer=plugbuffer;
-
int skipsignal=0;
+
if(_tprepared) if(_tprepared.datarowdesc)
-
skipsignal
=
1
, gotdatarowdesc();
+
prepbuffer
=
plugbuffer
, gotdatarowdesc();
else if(dontcacheprefix->match(_query)) // Don't cache FETCH/COPY m_delete(pgsqlsess->_prepareds,_query),_tprepared=0;
-
if(!skipsignal)
{
-
Thread.MutexKey
lock=prepbuffermux->lock();
+
Thread.MutexKey
lock;
+
if(!prepbuffer
&&
!catch(
lock=prepbuffermux->lock()
)) {
+
prepbuffer=plugbuffer
;
prepbufferready->signal(); lock=0; } } final void _processrowdesc(array(mapping(string:mixed)) datarowdesc) { _setrowdesc(datarowdesc); mapping(string:mixed) tp=_tprepared; // FIXME Is caching this worthwhile? if(!tp || !tp.datarowdesc) Thread.Thread(gotdatarowdesc); // Do not use callout, it deadlocks if(tp) tp.datarowdesc=datarowdesc; } private void gotdatarowdesc() {
-
if(!prepbuffer)
{
-
Thread.MutexKey
lock=prepbuffermux->lock();
+
Thread.MutexKey
lock;
+
if(catch(
lock=prepbuffermux->lock()
))
+
return
;
+
if(!prepbuffer)
prepbufferready->wait(lock);
-
+
destruct(prepbuffermux);
lock=0; if(_state==CLOSED) return;
-
prepbuffermux=0;
-
}
+
Stdio.Buffer plugbuffer=prepbuffer;
-
prepbuffer=0;
+
prepbuffer=0;
// Free memory early
plugbuffer->add_int16(sizeof(_datarowdesc)); if(sizeof(_datarowdesc)) foreach(_datarowdesc;;mapping col) plugbuffer->add_int16(oidformat(col.type)); else if(commitprefix->match(_query)) { Thread.MutexKey lock=pgsqlsess->_commitmux->lock(); if(pgsqlsess->_portalsinflight) { pgsqlsess->_waittocommit++; PD("Commit waiting for portals to finish\n"); pgsqlsess->_readyforcommit->wait(lock);
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:835:
private void releaseconditions() { pgsqlsess=0; Thread.MutexKey lock; if(prepbuffermux) { Thread.MutexKey lock=prepbuffermux->lock(); prepbufferready->signal(); } if(!_datarowdesc) { lock=_ddescribemux->lock();
-
_ddescribe->broadcast();
+
_datarowdesc=({});
-
+
_ddescribe->broadcast();
} lock=0; } final void _releasesession() { _inflight=0; _datarows->write(1); // Signal EOF conxion plugbuffer=c->start(1); plugbuffer->sendcmd(_closeportal(plugbuffer)); releaseconditions();