pike.git / lib / modules / Sql.pmod / pgsql.pike

version» Context lines:

pike.git/lib/modules/Sql.pmod/pgsql.pike:106:    =Regexp("^[ \t\f\r\n]*[Cc][Rr][Ee][Aa][Tt][Ee][ \t\f\r\n]");   private object dontcacheprefix    =Regexp("^[ \t\f\r\n]*([Ff][Ee][Tt][Cc][Hh]|[Cc][Oo][Pp][Yy])[ \t\f\r\n]");   private object limitpostfix    =Regexp("[ \t\f\r\n][Ll][Ii][Mm][Ii][Tt][ \t\f\r\n]+[12][; \t\f\r\n]*$");   Thread.Mutex _querymutex;   Thread.Mutex _stealmutex;      #define USERERROR(msg) throw(({(msg), backtrace()[..<1]}))    - protected string _sprintf(int type, void|mapping flags) { -  string res=UNDEFINED; -  switch(type) { -  case 'O': + protected string _sprintf(int type, void|mapping flags) + { string res=UNDEFINED; +  switch(type) +  { case 'O':    res=sprintf(DRIVERNAME"(%s@%s:%d/%s,%d)",    user,host,port,database,backendpid);    break;    }    return res;   }      #define BOOLOID 16   #define BYTEAOID 17   #define CHAROID 18
pike.git/lib/modules/Sql.pmod/pgsql.pike:142:   #define CTIDOID 1247   #define UUIDOID 2950      #define UTF8CHARSET "UTF8"   #define CLIENT_ENCODING "client_encoding"      #define PG_PROTOCOL(m,n) (((m)<<16)|(n))      //! @decl void create()   //! @decl void create(string host, void|string database, void|string user,@ - //! void|string password, void|mapping(string:mixed) options) + //! void|string password, void|mapping(string:mixed) options)   //!   //! With no arguments, this function initialises (reinitialises if a   //! connection has been set up previously) a connection to the   //! PostgreSQL backend. Since PostgreSQL requires a database to be   //! selected, it will try to connect to the default database. The   //! connection may fail however, for a variety of reasons; in this case   //! the most likely reason is because you don't have sufficient privileges   //! to connect to that database. So use of this particular syntax is   //! discouraged.   //!
pike.git/lib/modules/Sql.pmod/pgsql.pike:169:   //! @param database   //! Specifies the database to connect to. Not specifying this is   //! only supported if the PostgreSQL backend has a default database   //! configured. If you do not want to connect to any live database,   //! you can use @ref{template1@}.   //!   //! @param options   //! Currently supports at least the following:   //! @mapping   //! @member int use_ssl - //! If the database supports and allows SSL connections, the session - //! will be SSL encrypted, if not, the connection will fallback - //! to plain unencrypted + //! If the database supports and allows SSL connections, the session + //! will be SSL encrypted, if not, the connection will fallback + //! to plain unencrypted   //! @member int force_ssl - //! If the database supports and allows SSL connections, the session - //! will be SSL encrypted, if not, the connection will abort + //! If the database supports and allows SSL connections, the session + //! will be SSL encrypted, if not, the connection will abort   //! @member int cache_autoprepared_statements - //! If set to zero, it disables the automatic statement prepare and - //! cache logic; caching prepared statements can be problematic - //! when stored procedures and tables are redefined which leave stale - //! references in the already cached prepared statements + //! If set to zero, it disables the automatic statement prepare and + //! cache logic; caching prepared statements can be problematic + //! when stored procedures and tables are redefined which leave stale + //! references in the already cached prepared statements   //! @member string client_encoding - //! Character encoding for the client side, it defaults to using - //! the default encoding specified by the database, e.g.: "SQL_ASCII" + //! Character encoding for the client side, it defaults to using + //! the default encoding specified by the database, e.g.: "SQL_ASCII"   //! @member string standard_conforming_strings - //! When on, backslashes in strings must not be escaped any longer, - //! @[quote()] automatically adjusts quoting strategy accordingly + //! When on, backslashes in strings must not be escaped any longer, + //! @[quote()] automatically adjusts quoting strategy accordingly   //! @member string escape_string_warning - //! When on, a warning is issued if a backslash (\) appears in an - //! ordinary string literal and @[standard_conforming_strings] is off, - //! defaults to on + //! When on, a warning is issued if a backslash (\) appears in an + //! ordinary string literal and @[standard_conforming_strings] is off, + //! defaults to on   //! @endmapping   //! For the numerous other options please check the PostgreSQL manual.   //!   //! @note   //! You need to have a database selected before using the sql-object,   //! otherwise you'll get exceptions when you try to query it. Also   //! notice that this function @b{can@} raise exceptions if the db   //! server doesn't respond, if the database doesn't exist or is not   //! accessible by you.   //!   //! @seealso   //! @[Postgres.postgres], @[Sql.Sql], @[select_db()],   //! @url{http://search.postgresql.org/search?u=%2Fdocs%2F&q=client+connection+defaults@}   protected void create(void|string _host, void|string _database, -  void|string _user, void|string _pass, void|mapping(string:mixed) _options) { -  pass = _pass; _pass = "CENSORED"; +  void|string _user, void|string _pass, void|mapping(string:mixed) _options) + { pass = _pass; _pass = "CENSORED";    if(pass)    String.secure(pass);    user = _user; database = _database; host = _host || PGSQL_DEFAULT_HOST;    options = _options || ([]);    if(has_value(host,":") && sscanf(_host,"%s:%d",host,port)!=2)    ERROR("Error in parsing the hostname argument\n");    if(!port)    port = PGSQL_DEFAULT_PORT;    _querymutex=Thread.Mutex();    _stealmutex=Thread.Mutex();
pike.git/lib/modules/Sql.pmod/pgsql.pike:238:   //! from the last statement.   //!   //! @note   //! The string returned is not newline-terminated.   //!   //! @param clear   //! To clear the error, set it to @expr{1@}.   //!   //! @seealso   //! @[big_query()] - string error(void|int clear) { -  string s=lastmessage*"\n"; + string error(void|int clear) + { string s=lastmessage*"\n";    if(clear)    lastmessage=({});    warningscollected=0;    return sizeof(s) && s;   }      //! This function returns a string describing what host are we talking to,   //! and how (TCP/IP or UNIX sockets).   //!   //! @seealso   //! @[server_info()] - string host_info() { -  return sprintf("fd:%d TCP/IP %s:%d PID %d", + string host_info() + { return sprintf("fd:%d TCP/IP %s:%d PID %d",    _c?_c.query_fd():-1,host,port,backendpid);   }    - final private object getsocket(void|int nossl) { -  object lcon = Stdio.File(); + final private object getsocket(void|int nossl) + { object lcon = Stdio.File();    if(!lcon.connect(host,port))    return UNDEFINED;       object fcon;   #if constant(SSL.sslfile) -  if(!nossl && (options->use_ssl || options->force_ssl)) { -  PD("SSLRequest\n"); +  if(!nossl && (options->use_ssl || options->force_ssl)) +  { PD("SSLRequest\n");    { object c=.pgsql_util.PGassist();    lcon.write(({c.plugint32(8),c.plugint32(PG_PROTOCOL(1234,5679))}));    } -  switch(lcon.read(1)) { -  case "S": +  switch(lcon.read(1)) +  { case "S":    SSL.context context = SSL.context();    context->random = Crypto.Random.random_string;    fcon=.pgsql_util.PGconnS(lcon, context);    if(fcon)    return fcon;    default:lcon.close();    if(!lcon.connect(host,port))    return UNDEFINED;    case "N":    if(options->force_ssl)
pike.git/lib/modules/Sql.pmod/pgsql.pike:301:   }      //! Cancels the currently running query.   //!   //! @seealso   //! @[reload()], @[resync()]   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - void cancelquery() { -  if(qstate==inquery) { -  qstate=cancelpending; + void cancelquery() + { if(qstate==inquery) +  { qstate=cancelpending;    object lcon;    PD("CancelRequest\n");    if(!(lcon=getsocket(1)))    ERROR("Cancel connect failed\n");    lcon.write(({_c.plugint32(16),_c.plugint32(PG_PROTOCOL(1234,5678)),    _c.plugint32(backendpid),cancelsecret}));    lcon.close();    }   }   
pike.git/lib/modules/Sql.pmod/pgsql.pike:344:   { return _runtimeparameter[CLIENT_ENCODING];   }      //! @returns   //! Currently active runtimeparameters for   //! the open session; these are initialised by the @ref{options@} parameter   //! during session creation, and then processed and returned by the server.   //! Common values are:   //! @mapping   //! @member string client_encoding - //! Character encoding for the client side, e.g.: "SQL_ASCII" + //! Character encoding for the client side, e.g.: "SQL_ASCII"   //! @member string server_encoding - //! Character encoding for the server side as determined when the - //! database was created, e.g.: "SQL_ASCII" + //! Character encoding for the server side as determined when the + //! database was created, e.g.: "SQL_ASCII"   //! @member string DateStyle - //! Date parsing/display, e.g.: "ISO, DMY" + //! Date parsing/display, e.g.: "ISO, DMY"   //! @member string TimeZone - //! Default timezone used by the database, e.g.: "localtime" + //! Default timezone used by the database, e.g.: "localtime"   //! @member string standard_conforming_strings - //! When on, backslashes in strings must not be escaped any longer + //! When on, backslashes in strings must not be escaped any longer   //! @member string session_authorization - //! Displays the authorisationrole which the current session runs under + //! Displays the authorisationrole which the current session runs under   //! @member string is_superuser - //! Indicates if the current authorisationrole has database-superuser - //! privileges + //! Indicates if the current authorisationrole has database-superuser + //! privileges   //! @member string integer_datetimes - //! Reports wether the database supports 64-bit-integer dates and times + //! Reports wether the database supports 64-bit-integer dates and times   //! @member string server_version - //! Shows the server version, e.g.: "8.3.3" + //! Shows the server version, e.g.: "8.3.3"   //! @endmapping   //!   //! The values can be changed during a session using SET commands to the   //! database.   //! For other runtimeparameters check the PostgreSQL documentation.   //!   //! @seealso   //! @url{http://search.postgresql.org/search?u=%2Fdocs%2F&q=client+connection+defaults@}   //!   //! @note
pike.git/lib/modules/Sql.pmod/pgsql.pike:425:   //! contains multiple messages).   //! @member int reconnect_count   //! Number of times the connection to the database has been lost.   //! @member int portals_in_flight   //! Currently still open portals, i.e. running statements.   //! @endmapping   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - mapping(string:mixed) getstatistics() { -  mapping(string:mixed) stats=([ + 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,
pike.git/lib/modules/Sql.pmod/pgsql.pike:455:      //! @param newdepth   //! Sets the new cachedepth for automatic caching of prepared statements.   //!   //! @returns   //! The previous cachedepth.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - int setcachedepth(void|int newdepth) { -  int olddepth=cachedepth; + int setcachedepth(void|int newdepth) + { int olddepth=cachedepth;    if(!zero_type(newdepth) && newdepth>=0)    cachedepth=newdepth;    return olddepth;   }      //! @param newtimeout   //! Sets the new timeout for long running queries.   //!   //! @returns   //! The previous timeout.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - int settimeout(void|int newtimeout) { -  int oldtimeout=timeout; + int settimeout(void|int newtimeout) + { int oldtimeout=timeout;    if(!zero_type(newtimeout) && newtimeout>0)    timeout=newtimeout;    return oldtimeout;   }      //! @param newportalbuffersize   //! Sets the new portalbuffersize for buffering partially concurrent queries.   //!   //! @returns   //! The previous portalbuffersize.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - int setportalbuffersize(void|int newportalbuffersize) { -  int oldportalbuffersize=portalbuffersize; + int setportalbuffersize(void|int newportalbuffersize) + { int oldportalbuffersize=portalbuffersize;    if(!zero_type(newportalbuffersize) && newportalbuffersize>0)    portalbuffersize=newportalbuffersize;    return oldportalbuffersize;   }      //! @param newfetchlimit   //! Sets the new fetchlimit to interleave queries.   //!   //! @returns   //! The previous fetchlimit.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - int setfetchlimit(void|int newfetchlimit) { -  int oldfetchlimit=_fetchlimit; + int setfetchlimit(void|int newfetchlimit) + { int oldfetchlimit=_fetchlimit;    if(!zero_type(newfetchlimit) && newfetchlimit>=0)    _fetchlimit=newfetchlimit;    return oldfetchlimit;   }    - final private string glob2reg(string glob) { -  if (!glob||!sizeof(glob)) + final private string glob2reg(string glob) + { if(!glob||!sizeof(glob))    return "%";    return replace(glob,({"*","?","\\","%","_"}),({"%","_","\\\\","\\%","\\_"}));   }    - final private string a2nls(array(string) msg) { -  return msg*"\n"+"\n"; + final private string a2nls(array(string) msg) + { return msg*"\n"+"\n";   }    - final private string pinpointerror(void|string query,void|string offset) { -  if(!query) + 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;   }    - final int _decodemsg(void|state waitforstate) { + final int _decodemsg(void|state waitforstate) + {   #ifdef DEBUG    { array line;   #ifdef DEBUGMORE    line=backtrace();   #endif    PD("Waiting for state %O %O\n",waitforstate,line&&line[sizeof(line)-2]);    }   #endif -  while(_mstate!=waitforstate) { -  if(_mstate!=unauthenticated) { -  if(qstate==cancelpending) +  while(_mstate!=waitforstate) +  { if(_mstate!=unauthenticated) +  { if(qstate==cancelpending)    qstate=canceled,sendclose(); -  if(_c.flushed && qstate==inquery && !_c.bpeek(0)) { -  int tcurr=time(); +  if(_c.flushed && qstate==inquery && !_c.bpeek(0)) +  { int tcurr=time();    int told=tcurr+timeout;    sessionblocked++;    while(!_c.bpeek(told-tcurr)) -  if((tcurr=time())-told>=timeout) { -  sendclose();cancelquery(); +  if((tcurr=time())-told>=timeout) +  { sendclose();cancelquery();    break;    }    }    }    int msgtype=_c.getbyte();    int msglen=_c.getint32();    _msgsreceived++;    _bytesreceived+=1+msglen;    enum errortype { noerror=0, protocolerror, protocolunsupported };    errortype errtype=noerror; -  switch(msgtype) { -  void storetiming() { -  tprepared->trun=gethrtime()-tprepared->trunstart; +  switch(msgtype) +  { void storetiming() +  { tprepared->trun=gethrtime()-tprepared->trunstart;    m_delete(tprepared,"trunstart");    tprepared = UNDEFINED;    }; -  void getcols() { -  int bintext=_c.getbyte(); +  void getcols() +  { int bintext=_c.getbyte();    array a;    int cols=_c.getint16();    msglen-=4+1+2+2*cols;    foreach(a=allocate(cols,([]));;mapping m)    m->type=_c.getint16(); -  if(_c.portal) { // Discard column info, and make it line oriented -  a=({(["type":bintext?BYTEAOID:TEXTOID,"name":"line"])}); +  if(_c.portal) // Discard column info, and make it line oriented +  { a=({(["type":bintext?BYTEAOID:TEXTOID,"name":"line"])});    _c.portal->_datarowdesc=a;    }    _mstate=gotrowdescription;    }; -  array(string) getstrings() { -  string s; +  array(string) getstrings() +  { string s;    if(msglen<1)    errtype=protocolerror;    s=_c.getstring(msglen);    if(s[--msglen])    errtype=protocolerror;    if(!msglen)    return ({});    s=s[..msglen-1];msglen=0;    return s/"\0";    }; -  mapping(string:string) getresponse() { -  mapping(string:string) msgresponse=([]); +  mapping(string:string) getresponse() +  { mapping(string:string) msgresponse=([]);    msglen-=4;    foreach(getstrings();;string f)    if(sizeof(f))    msgresponse[f[..0]]=f[1..];    PD("%O\n",msgresponse);    return msgresponse;    };    case 'R':PD("Authentication\n");    { string sendpass;    int authtype;    msglen-=4+4; -  switch(authtype=_c.getint32()) { -  case 0:PD("Ok\n"); +  switch(authtype=_c.getint32()) +  { case 0:PD("Ok\n");    _mstate=authenticated;    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)
pike.git/lib/modules/Sql.pmod/pgsql.pike:651:    case 8:PD("GSSContinue\n");    errtype=protocolunsupported;    if(msglen<1)    errtype=protocolerror;    SSauthdata=_c.getstring(msglen);msglen=0;    break;    default:PD("Unknown Authentication Method %c\n",authtype);    errtype=protocolunsupported;    break;    } -  switch(errtype) { -  case noerror: +  switch(errtype) +  { case noerror:    if(_mstate==unauthenticated)    _c.sendcmd(({"p",_c.plugint32(4+sizeof(sendpass)+1),    sendpass,"\0"}),1);    break;    default:    case protocolunsupported:    ERROR("Unsupported authenticationmethod %c\n",authtype);    break;    }    break;    }    case 'K':PD("BackendKeyData\n");    msglen-=4+4;backendpid=_c.getint32();cancelsecret=_c.getstring(msglen);    msglen=0;    break;    case 'S':PD("ParameterStatus\n");    msglen-=4;    { array(string) ts=getstrings(); -  if(sizeof(ts)==2) { -  _runtimeparameter[ts[0]]=ts[1]; +  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;    backendstatus=_c.getbyte();    _mstate=readyforquery;
pike.git/lib/modules/Sql.pmod/pgsql.pike:711:    if(_c.portal)    _c.portal->_datatypeoid=a;    _mstate=gotparameterdescription;    break;    }    case 'T':    PD("RowDescription (for %s)\n",    _c.portal?_c.portal->_portalname:"DISCARDED");    msglen-=4+2;    { array a; -  foreach(a=allocate(_c.getint16());int i;) { -  string s; +  foreach(a=allocate(_c.getint16());int i;) +  { string s;    msglen-=sizeof(s=_c.getstring())+1;    mapping(string:mixed) res=(["name":s]);    msglen-=4+2+4+2+4+2;    res->tableoid=_c.getint32()||UNDEFINED;    res->tablecolattr=_c.getint16()||UNDEFINED;    res->type=_c.getint32();    { int len=_c.getint16();    res->length=len>=0?len:"variable";    }    res->atttypmod=_c.getint32();res->formatcode=_c.getint16();
pike.git/lib/modules/Sql.pmod/pgsql.pike:745:    _c.portal->_datarowdesc=({});    _c.portal->_fetchlimit=0; // disables subsequent Executes    _mstate=gotrowdescription;    break;    case '2':PD("BindComplete\n");    msglen-=4;    _mstate=bindcomplete;    break;    case 'D':PD("DataRow\n");    msglen-=4; -  if(_c.portal) { -  if(tprepared) +  if(_c.portal) +  { if(tprepared)    storetiming();   #ifdef USEPGsql    _c.decodedatarow(msglen);msglen=0;   #else    array a, datarowdesc;    _c.portal->_bytesreceived+=msglen;    datarowdesc=_c.portal->_datarowdesc;    int cols=_c.getint16();    int atext = _c.portal->_alltext; // cache locally for speed    string cenc=_runtimeparameter[CLIENT_ENCODING];    a=allocate(cols,UNDEFINED);    msglen-=2+4*cols; -  foreach(a;int i;) { -  int collen=_c.getint32(); -  if(collen>0) { -  msglen-=collen; +  foreach(a;int i;) +  { int collen=_c.getint32(); +  if(collen>0) +  { msglen-=collen;    mixed value;    switch(datarowdesc[i]->type)    { default:value=_c.getstring(collen);    break;    case TEXTOID:    case XMLOID:    case BPCHAROID:    case VARCHAROID:    value=_c.getstring(collen);    if(cenc==UTF8CHARSET)
pike.git/lib/modules/Sql.pmod/pgsql.pike:821:    break;    case 's':PD("PortalSuspended\n");    msglen-=4;    _mstate=portalsuspended;    break;    case 'C':PD("CommandComplete\n");    { msglen-=4;    if(msglen<1)    errtype=protocolerror;    string s=_c.getstring(msglen-1); -  if(_c.portal) { -  if(tprepared) +  if(_c.portal) +  { if(tprepared)    storetiming();    _c.portal->_statuscmdcomplete=s;    }    PD("%s\n",s);    if(_c.getbyte())    errtype=protocolerror;    msglen=0;    _mstate=commandcomplete;    break;    }
pike.git/lib/modules/Sql.pmod/pgsql.pike:847:    case '3':PD("CloseComplete\n");    msglen-=4;    _closesent=0;    break;    case 'd':PD("CopyData\n");    if(tprepared)    storetiming();    msglen-=4;    if(msglen<0)    errtype=protocolerror; -  if(_c.portal) { -  _c.portal->_bytesreceived+=msglen; +  if(_c.portal) +  { _c.portal->_bytesreceived+=msglen;    _c.portal->_datarows+=({({_c.getstring(msglen)})});    }    msglen=0;    _mstate=dataready;    break;    case 'H':PD("CopyOutResponse\n");    getcols();    break;    case 'G':PD("CopyInResponse\n");    getcols();    _mstate=copyinresponse;    break;    case 'c':PD("CopyDone\n");    msglen-=4;    break;    case 'E':PD("ErrorResponse\n");    { mapping(string:string) msgresponse;    msgresponse=getresponse();    warningsdropcount+=warningscollected;    warningscollected=0; -  switch(msgresponse->C) { -  case "P0001": +  switch(msgresponse->C) +  { case "P0001":    lastmessage=({sprintf("%s: %s",msgresponse->S,msgresponse->M)});    USERERROR(a2nls(lastmessage    +({pinpointerror(_c.portal->query,msgresponse->P)})));    break;    case "08P01":case "42P05":    errtype=protocolerror;    case "XX000":case "42883":case "42P01":    invalidatecache=1;    default:    lastmessage=({sprintf("%s %s:%s %s\n (%s:%s:%s)",
pike.git/lib/modules/Sql.pmod/pgsql.pike:892:    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}); -  switch(msgresponse->S) { -  case "PANIC":werror(a2nls(lastmessage)); +  switch(msgresponse->S) +  { case "PANIC":werror(a2nls(lastmessage));    }    USERERROR(a2nls(lastmessage));    }    break;    }    case 'N':PD("NoticeResponse\n");    { mapping(string:string) msgresponse;    msgresponse=getresponse(); -  if(clearmessage) { -  warningsdropcount+=warningscollected; +  if(clearmessage) +  { warningsdropcount+=warningscollected;    clearmessage=warningscollected=0;    lastmessage=({});    }    warningscollected++;    lastmessage=({sprintf("%s %s: %s",    msgresponse->S,msgresponse->C,msgresponse->M)});    break;    }    case 'A':PD("NotificationResponse\n");    { msglen-=4+4;    int pid=_c.getint32();    string condition,extrainfo=UNDEFINED;    { array(string) ts=getstrings(); -  switch(sizeof(ts)) { -  case 0:errtype=protocolerror; +  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);    runcallback(pid,condition,extrainfo);    break;    }    default: -  if(msgtype!=-1) { -  PD("Unknown message received %c\n",msgtype); +  if(msgtype!=-1) +  { PD("Unknown message received %c\n",msgtype);    msglen-=4;PD("%O\n",_c.getstring(msglen));msglen=0;    errtype=protocolunsupported;    } -  else { -  array(string) msg=lastmessage; -  if(!reconnect(1)) { -  sleep(RECONNECTDELAY); -  if(!reconnect(1)) { -  sleep(RECONNECTBACKOFF); +  else +  { array(string) msg=lastmessage; +  if(!reconnect(1)) +  { sleep(RECONNECTDELAY); +  if(!reconnect(1)) +  { sleep(RECONNECTBACKOFF);    reconnect(1);    }    }    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);    }    break;    }    if(msglen)    errtype=protocolerror; -  switch(errtype) { -  case protocolunsupported: +  switch(errtype) +  { case protocolunsupported:    ERROR("Unsupported servermessage received %c\n",msgtype);    break;    case protocolerror:    array(string) msg=lastmessage;    lastmessage=({});    reconnect(1);    msg+=lastmessage;    string s=sizeof(msg)?a2nls(msg):"";    ERROR("%sProtocol error with database %s\n",s,host_info());    break;
pike.git/lib/modules/Sql.pmod/pgsql.pike:976:    break;    }    if(zero_type(waitforstate))    break;    }    PD("Found state %O\n",_mstate);    return _mstate;   }      #ifndef UNBUFFEREDIO - private int read_cb(mixed foo, string d) { -  _c.unread(d); + private int read_cb(mixed foo, string d) + { _c.unread(d);    do _decodemsg();    while(_c.bpeek(0)==1);    return 0;   }   #endif      //! Closes the connection to the database, any running queries are   //! terminated instantly.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - void close() { -  cancelquery(); + void close() + { cancelquery();    if(_c)    _c.sendterminate();   }    - void destroy() { -  close(); + void destroy() + { close();   }    - private int reconnect(void|int force) { -  Thread.MutexKey connectmtxkey; -  if(_c) { -  reconnected++; + private int reconnect(void|int force) + { Thread.MutexKey connectmtxkey; +  if(_c) +  { reconnected++;    prepstmtused=0;   #ifdef DEBUG    ERROR("While debugging, reconnects are forbidden\n");    exit(1);   #endif    if(!force)    _c.sendterminate();    _c.close(); _c=0;    foreach(prepareds;;mapping tp)    m_delete(tp,"preparedname");    if(!(connectmtxkey = _stealmutex.trylock(2)))    return 0; // Recursive reconnect, bailing out    } -  if(!(_c=getsocket())) { -  string msg=sprintf("Couldn't connect to database on %s:%d",host,port); -  if(force) { -  lastmessage+=({msg}); +  if(!(_c=getsocket())) +  { string msg=sprintf("Couldn't connect to database on %s:%d",host,port); +  if(force) +  { lastmessage+=({msg});    return 0;    }    else    ERROR(msg+"\n");    }    _closesent=0;    _mstate=unauthenticated;    qstate=queryidle;    _runtimeparameter=([]);    array(string) plugbuf=({"",_c.plugint32(PG_PROTOCOL(3,0))});
pike.git/lib/modules/Sql.pmod/pgsql.pike:1053:    _c.write(plugbuf);    PD("%O\n",plugbuf);    { mixed err=catch(_decodemsg(readyforquery));    if(err)    if(force)    throw(err);    else    return 0;    }    PD("%O\n",_runtimeparameter); -  if(force) { -  lastmessage+=({sprintf("Reconnected to database %s",host_info())}); +  if(force) +  { lastmessage+=({sprintf("Reconnected to database %s",host_info())});    runcallback(backendpid,"_reconnect","");    }    return 1;   }      //! @decl void reload()   //!   //! For PostgreSQL this function performs the same function as @[resync()].   //!   //! @seealso   //! @[resync()], @[cancelquery()] - void reload() { -  resync(); + void reload() + { resync();   }      //! @decl void resync()   //!   //! Resyncs the database session; typically used to make sure the session is   //! not still in a dangling transaction.   //!   //! If called while queries/portals are still in-flight, this function   //! is a no-op.   //!
pike.git/lib/modules/Sql.pmod/pgsql.pike:1092:   //! If issued while inside a transaction, it will rollback the transaction,   //! close all open cursors, drop all temporary tables and reset all   //! session variables to their default values.   //!   //! @seealso   //! @[cancelquery()], @[reload()]   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - void resync(void|int special) { -  mixed err; + void resync(void|int special) + { mixed err;    int didsync; -  if(err = catch { -  sendclose(1); +  if(err = catch +  { sendclose(1);    PD("Portalsinflight: %d\n",portalsinflight); -  if(!portalsinflight) { -  if(!earlyclose) { -  PD("Sync\n"); +  if(!portalsinflight) +  { if(!earlyclose) +  { PD("Sync\n");    _c.sendcmd(({"S",_c.plugint32(4)}),2);    }    didsync=1; -  if(!special) { -  _decodemsg(readyforquery); -  switch(backendstatus) { -  case 'T':case 'E': -  foreach(prepareds;;mapping tp) { -  m_delete(tp,"datatypeoid"); +  if(!special) +  { _decodemsg(readyforquery); +  switch(backendstatus) +  { case 'T':case 'E': +  foreach(prepareds;;mapping tp) +  { m_delete(tp,"datatypeoid");    m_delete(tp,"datarowdesc");    }    big_query("ROLLBACK");    big_query("RESET ALL");    big_query("CLOSE ALL");    big_query("DISCARD TEMP");    }    }    }    earlyclose=0; -  }) { -  earlyclose=0; +  }) +  { earlyclose=0;    PD("%O\n",err);    if(!reconnect(1))    ERROR(a2nls(lastmessage));    }    else if(didsync && special==2)    _decodemsg(readyforquery);   #ifndef UNBUFFEREDIO    _c.set_read_callback(read_cb);   #endif   }
pike.git/lib/modules/Sql.pmod/pgsql.pike:1144:   //! restrictions of the Postgres frontend-backend protocol, you always   //! have to be connected to a database, so in fact this function just   //! allows you to connect to a different database on the same server.   //!   //! @note   //! This function @b{can@} raise exceptions if something goes wrong   //! (backend process not running, insufficient privileges...)   //!   //! @seealso   //! @[create()] - void select_db(string dbname) { -  database=dbname; + void select_db(string dbname) + { database=dbname;    reconnect();    reconnected=0;   }      //! With PostgreSQL you can LISTEN to NOTIFY events.   //! This function allows you to detect and handle such events.   //!   //! @param condition   //! Name of the notification event we're listening   //! to. A special case is the empty string, which matches all events,   //! and can be used as fallback function which is called only when the   //! specific condition is not handled. Another special case is   //! @ref{_reconnect@} which gets called whenever the connection unexpectedly   //! drops and reconnects to the database.   //!   //! @param notify_cb   //! Function to be called on receiving a notification-event of   //! condition @ref{condition@}.   //! The callback function is invoked with - //! @expr{void notify_cb(pid,condition,extrainfo, .. args);@} + //! @expr{void notify_cb(pid,condition,extrainfo, .. args);@}   //! @ref{pid@} is the process id of the database session that originated   //! the event. @ref{condition@} contains the current condition.   //! @ref{extrainfo@} contains optional extra information specified by   //! the database.   //! The rest of the arguments to @ref{notify_cb@} are passed   //! verbatim from @ref{args@}.   //! The callback function must return no value.   //!   //! @param selfnotify   //! Normally notify events generated by your own session are ignored.   //! If you want to receive those as well, set @ref{selfnotify@} to one.   //!   //! @param args   //! Extra arguments to pass to @ref{notify_cb@}.   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface.   void set_notify_callback(string condition,    void|function(int,string,string,mixed ...:void) notify_cb,void|int selfnotify, -  mixed ... args) { -  if(!notify_cb) +  mixed ... args) + { if(!notify_cb)    m_delete(notifylist,condition); -  else { -  array old=notifylist[condition]; +  else +  { array old=notifylist[condition];    if(!old)    old=({notify_cb});    if(selfnotify||args)    old+=({selfnotify});    if(args)    old+=args;    notifylist[condition]=old;    }   }    - final private void runcallback(int pid,string condition,string extrainfo) { -  array cb; + 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..]);   }      //! @returns   //! The given string, but escapes/quotes all contained magic characters   //! according to the quoting rules of the current session for non-binary   //! arguments in textual SQL-queries.   //!
pike.git/lib/modules/Sql.pmod/pgsql.pike:1238:   //!   //! @note   //! Quoting must not be done for parameters passed in bindings.   //!   //! @seealso   //! @[big_query()], @[quote()]   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - string quotebinary(string s) { -  return replace(s, ({ "'", "\\", "\0" }), ({ "''", "\\\\", "\\000" }) ); + string quotebinary(string s) + { return replace(s, ({ "'", "\\", "\0" }), ({ "''", "\\\\", "\\000" }) );   }      //! This function creates a new database (assuming we   //! have sufficient privileges to do this).   //!   //! @param db   //! Name of the new database.   //!   //! @seealso   //! @[drop_db()] - void create_db(string db) { -  big_query("CREATE DATABASE :db",([":db":db])); + void create_db(string db) + { big_query("CREATE DATABASE :db",([":db":db]));   }      //! This function destroys a database and all the data it contains (assuming   //! we have sufficient privileges to do so). It is not possible to delete   //! the database you're currently connected to. You can connect to database   //! @ref{template1@} to avoid connecting to any live database.   //!   //! @param db   //! Name of the database to be deleted.   //!   //! @seealso   //! @[create_db()] - void drop_db(string db) { -  big_query("DROP DATABASE :db",([":db":db])); + void drop_db(string db) + { big_query("DROP DATABASE :db",([":db":db]));   }      //! @returns   //! A string describing the server we are   //! talking to. It has the form @expr{"servername/serverversion"@}   //! (like the HTTP protocol description) and is most useful in   //! conjunction with the generic SQL-server module.   //!   //! @seealso   //! @[host_info()]   string server_info ()   { return DRIVERNAME"/"+(_runtimeparameter->server_version||"unknown");   }      //! @returns   //! An array of the databases available on the server.   //!   //! @param glob   //! If specified, list only those databases matching it. - array(string) list_dbs (void|string glob) { -  array row,ret=({}); + 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;   }      //! @returns   //! An array containing the names of all the tables and views in the   //! path in the currently selected database.   //!   //! @param glob   //! If specified, list only the tables with matching names. - array(string) list_tables (void|string glob) { -  array row,ret=({}); // This query might not work on PostgreSQL 7.4 + array(string) list_tables (void|string glob) + { array row,ret=({}); // This query might not work on PostgreSQL 7.4    object res=big_query( // due to missing schemasupport    "SELECT CASE WHEN 'public'=n.nspname THEN '' ELSE n.nspname||'.' END "    " ||c.relname AS name "    "FROM pg_catalog.pg_class c "    " LEFT JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace "    "WHERE c.relkind IN ('r','v') AND n.nspname<>'pg_catalog' "    " AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) "    " AND c.relname ILIKE :glob "    " ORDER BY 1",    ([":glob":glob2reg(glob)]));
pike.git/lib/modules/Sql.pmod/pgsql.pike:1327:    return ret;   }      //! @returns   //! A mapping, indexed on the column name, of mappings describing   //! the attributes of a table of the current database.   //! The currently defined fields are:   //!   //! @mapping   //! @member string schema - //! Schema the table belongs to + //! Schema the table belongs to   //! @member string table - //! Name of the table + //! Name of the table   //! @member string kind - //! Type of table + //! Type of table   //! @member string owner - //! Tableowner + //! Tableowner   //! @member int rowcount - //! Estimated rowcount of the table + //! Estimated rowcount of the table   //! @member int datasize - //! Estimated total datasize of the table in bytes + //! Estimated total datasize of the table in bytes   //! @member int indexsize - //! Estimated total indexsize of the table in bytes + //! Estimated total indexsize of the table in bytes   //! @member string name - //! Name of the column + //! Name of the column   //! @member string type - //! A textual description of the internal (to the server) column type-name + //! A textual description of the internal (to the server) column type-name   //! @member int typeoid - //! The OID of the internal (to the server) column type + //! The OID of the internal (to the server) column type   //! @member string length - //! Size of the columndatatype + //! Size of the columndatatype   //! @member mixed default - //! Default value for the column + //! Default value for the column   //! @member int is_shared   //! @member int has_index - //! If the table has any indices + //! If the table has any indices   //! @member int has_primarykey - //! If the table has a primary key + //! If the table has a primary key   //! @endmapping   //!   //! @param glob   //! If specified, list only the tables with matching names.   //! Setting it to @expr{*@} will include system columns in the list. - array(mapping(string:mixed)) list_fields(void|string table, void|string glob) { -  array row, ret=({}); + array(mapping(string:mixed)) list_fields(void|string table, void|string glob) + { array row, ret=({});    string schema=UNDEFINED;       sscanf(table||"*", "%s.%s", schema, table);       object res = big_typed_query(    "SELECT a.attname, a.atttypid, t.typname, a.attlen, "    " c.relhasindex, c.relhaspkey, CAST(c.reltuples AS BIGINT) AS reltuples, "    " (c.relpages "    " +COALESCE( "    " (SELECT SUM(tst.relpages) "
pike.git/lib/modules/Sql.pmod/pgsql.pike:1426:    "typname":"type",    "attlen":"length",    "typdefault":"default",    "relisshared":"is_shared",    "atttypid":"typeoid",    "relkind":"kind",    "relhasindex":"has_index",    "relhaspkey":"has_primarykey",    "reltuples":"rowcount",    ]); -  foreach(colnames;int i;mapping m) { -  string nf,field=m->name; +  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); +  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: + 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; //binary    } -  return 0; // text +  return 0; // text   }    - final void _sendexecute(int fetchlimit) { -  string portalname=_c.portal->_portalname; + final void _sendexecute(int fetchlimit) + { string portalname=_c.portal->_portalname;    PD("Execute portal %s fetchlimit %d\n",portalname,fetchlimit);    _c.sendcmd(({"E",_c.plugint32(4+sizeof(portalname)+1+4),portalname,    "\0",_c.plugint32(fetchlimit)}),!!fetchlimit); -  if(!fetchlimit) { -  _c.portal->_fetchlimit=0; // disables further Executes +  if(!fetchlimit) +  { _c.portal->_fetchlimit=0; // disables further Executes    earlyclose=1; -  if(sizeof(portalname)) { -  PD("Close portal %s & Sync\n",portalname); +  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);    }    else    _c.portal->_inflight+=fetchlimit;   }    - final private void sendclose(void|int hold) { -  string portalname; -  if(_c.portal && (portalname=_c.portal->_portalname)) { -  _c.portal->_portalname = UNDEFINED; + final private void sendclose(void|int hold) + { string portalname; +  if(_c.portal && (portalname=_c.portal->_portalname)) +  { _c.portal->_portalname = UNDEFINED;    _c.setportal();    portalsinflight--;   #ifdef DEBUGMORE    PD("Closetrace %O\n",backtrace());   #endif    if(!sizeof(portalname))    unnamedportalinuse--; -  if(sizeof(portalname)) { -  if(!earlyclose) { -  PD("Close portal %s\n",portalname); +  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;    }    }   }    - final private string trbackendst(int c) { -  switch(c) { -  case 'I':return "idle"; + final private string trbackendst(int c) + { switch(c) +  { case 'I':return "idle";    case 'T':return "intransaction";    case 'E':return "infailedtransaction";    }    return "";   }      //! @returns   //! The current commitstatus of the connection. Returns either one of:   //! @string   //! @value idle   //! @value intransaction   //! @value infailedtransaction   //! @endstring   //!   //! @note   //! This function is PostgreSQL-specific, and thus it is not available   //! through the generic SQL-interface. - final string status_commit() { -  return trbackendst(backendstatus); + final string status_commit() + { return trbackendst(backendstatus);   }    - final private array(string) closestatement(mapping tp) { -  string oldprep=tp->preparedname; + final private array(string) closestatement(mapping tp) + { string oldprep=tp->preparedname;    array(string) ret=({}); -  if(oldprep) { -  PD("Close statement %s\n",oldprep); +  if(oldprep) +  { PD("Close statement %s\n",oldprep);    ret=({"C",_c.plugint32(4+1+sizeof(oldprep)+1),    "S",oldprep,"\0"});    }    return ret;   }      //! @decl Sql.pgsql_util.pgsql_result big_query(string query)   //! @decl Sql.pgsql_util.pgsql_result big_query(string query, mapping bindings)   //!   //! This is the only provided interface which allows you to query the
pike.git/lib/modules/Sql.pmod/pgsql.pike:1584:   //! @note   //! This function does not support multiple queries in one querystring.   //! I.e. it allows for but does not require a trailing semicolon, but it   //! simply ignores any commands after the first unquoted semicolon. This can   //! be viewed as a limited protection against SQL-injection attacks.   //!   //! @seealso   //! @[big_typed_query()], @[Sql.Sql], @[Sql.sql_result],   //! @[Sql.Sql()->query()], @[Sql.pgsql_util.pgsql_result]   object big_query(string q,void|mapping(string|int:mixed) bindings, -  void|int _alltyped) { -  string preparedname=""; +  void|int _alltyped) + { string preparedname="";    string portalname="";    int forcecache=-1;    string cenc=_runtimeparameter[CLIENT_ENCODING];    switch(cenc)    { case UTF8CHARSET:    q=string_to_utf8(q);    break;    default:    if(String.width(q)>8)    ERROR("Don't know how to convert %O to %s encoding\n",q,cenc);    }    array(string|int) paramValues;    array(string) from,to; -  if(bindings) { -  int pi=0,rep=0; +  if(bindings) +  { int pi=0,rep=0;    paramValues=allocate(sizeof(bindings));    from=allocate(sizeof(bindings));    to=allocate(sizeof(bindings)); -  foreach(bindings; mixed name; mixed value) { -  if(stringp(name)) { // Throws if mapping key is empty string -  if(name[0]!=':') +  foreach(bindings; mixed name; mixed value) +  { if(stringp(name)) // Throws if mapping key is empty string +  { if(name[0]!=':')    name=":"+name; -  if(name[1]=='_') { // Special option parameter -  switch(name) { -  case ":_cache":forcecache=(int)value; +  if(name[1]=='_') // Special option parameter +  { switch(name) +  { case ":_cache":forcecache=(int)value;    break;    }    continue;    }    if(!has_value(q,name))    continue;    }    from[rep]=name;    string rval;    if(multisetp(value)) // multisets are taken literally
pike.git/lib/modules/Sql.pmod/pgsql.pike:1640:    paramValues= pi ? paramValues[..pi-1] : ({});    }    else    paramValues = ({});    if(String.width(q)>8)    ERROR("Wide string literals in %O not supported\n",q);    if(has_value(q,"\0"))    ERROR("Querystring %O contains invalid literal nul-characters\n",q);    mapping(string:mixed) tp;    int tstart; -  if(forcecache==1 || forcecache!=0 && sizeof(q)>=MINPREPARELENGTH) { -  array(string) plugbuf=({}); -  if(tp=prepareds[q]) { -  if(tp->preparedname) +  if(forcecache==1 || forcecache!=0 && sizeof(q)>=MINPREPARELENGTH) +  { array(string) plugbuf=({}); +  if(tp=prepareds[q]) +  { if(tp->preparedname)    prepstmtused++, preparedname=tp->preparedname;    else if((tstart=tp->trun)    && tp->tparse*FACTORPLAN>=tstart    && (zero_type(options->cache_autoprepared_statements)    || options->cache_autoprepared_statements))    preparedname=PREPSTMTPREFIX+(string)pstmtcount++;    } -  else { -  if(totalhits>=cachedepth) { -  foreach(prepareds;string ind;tp) { -  int oldhits=tp->hits; +  else +  { if(totalhits>=cachedepth) +  { foreach(prepareds;string ind;tp) +  { int oldhits=tp->hits;    totalhits-=oldhits-(tp->hits=oldhits>>1); -  if(oldhits<=1) { -  plugbuf+=closestatement(tp); +  if(oldhits<=1) +  { plugbuf+=closestatement(tp);    m_delete(prepareds,ind);    }    }    }    if(forcecache!=1 && createprefix->match(q)) // Flush cache on CREATE    invalidatecache=1;    else    prepareds[q]=tp=([]);    } -  if(invalidatecache) { -  invalidatecache=0; -  foreach(prepareds;;mapping np) { -  plugbuf+=closestatement(np); +  if(invalidatecache) +  { invalidatecache=0; +  foreach(prepareds;;mapping np) +  { plugbuf+=closestatement(np);    m_delete(np,"preparedname");    }    } -  if(sizeof(plugbuf)) { -  _c.sendcmd(plugbuf,1); // close expireds +  if(sizeof(plugbuf)) +  { _c.sendcmd(plugbuf,1); // close expireds    PD("%O\n",plugbuf);    }    tstart=gethrtime();    } // pgsql_result autoassigns to portal    else    tp=UNDEFINED;    .pgsql_util.pgsql_result(this,q,_fetchlimit,portalbuffersize,_alltyped);    if(unnamedportalinuse)    portalname=PORTALPREFIX+(string)pportalcount++;    else    unnamedportalinuse++;    _c.portal->_portalname=portalname;    qstate=inquery;    portalsinflight++; portalsopened++;    clearmessage=1;    mixed err; -  if(err = catch { -  if(!sizeof(preparedname) || !tp || !tp->preparedname) { -  PD("Parse statement %s\n",preparedname); +  if(err = catch +  { if(!sizeof(preparedname) || !tp || !tp->preparedname) +  { PD("Parse statement %s\n",preparedname);    // Even though the protocol doesn't require the Parse command to be    // followed by a flush, it makes a VERY noticeable difference in    // performance if it is omitted; seems like a flaw in the PostgreSQL    // server v8.3.3    _c.sendcmd(({"P",_c.plugint32(4+sizeof(preparedname)+1+sizeof(q)+1+2),    preparedname,"\0",q,"\0",_c.plugint16(0)}),3);    PD("Query: %O\n",q);    } // sends Parameter- and RowDescription for 'S' -  if(!tp || !tp->datatypeoid) { -  PD("Describe statement %s\n",preparedname); +  if(!tp || !tp->datatypeoid) +  { PD("Describe statement %s\n",preparedname);    _c.sendcmd(({"D",_c.plugint32(4+1+sizeof(preparedname)+1),    "S",preparedname,"\0"}),1);    } -  else { -  skippeddescribe++; +  else +  { skippeddescribe++;    _c.portal->_datatypeoid=tp->datatypeoid;    _c.portal->_datarowdesc=tp->datarowdesc;    }    { 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",    _c.plugint16(sizeof(paramValues))}); -  if(!tp || !tp->datatypeoid) { -  _decodemsg(gotparameterdescription); +  if(!tp || !tp->datatypeoid) +  { _decodemsg(gotparameterdescription);    if(tp)    tp->datatypeoid=_c.portal->_datatypeoid;    }    array dtoid=_c.portal->_datatypeoid;    if(sizeof(dtoid)!=sizeof(paramValues))    USERERROR(    sprintf("Invalid number of bindings, expected %d, got %d\n",    sizeof(dtoid),sizeof(paramValues)));    foreach(dtoid;;int textbin)    plugbuf+=({_c.plugint16(oidformat(textbin))});    plugbuf+=({_c.plugint16(sizeof(paramValues))}); -  foreach(paramValues;int i;mixed value) { -  if(zero_type(value)) +  foreach(paramValues;int i;mixed value) +  { if(zero_type(value))    plugbuf+=({_c.plugint32(-1)}); // NULL -  else if(stringp(value) && !sizeof(value)) { -  int k=0; -  switch(dtoid[i]) { -  default: +  else if(stringp(value) && !sizeof(value)) +  { int k=0; +  switch(dtoid[i]) +  { default:    k=-1; // cast empty strings to NULL for non-string types    case BYTEAOID:    case TEXTOID:    case XMLOID:    case BPCHAROID:    case VARCHAROID:;    }    plugbuf+=({_c.plugint32(k)});    }    else
pike.git/lib/modules/Sql.pmod/pgsql.pike:1809:    value=0;    break;    }    }    while(0);    plugbuf+=({_c.plugbyte(value)});    break;    case CHAROID:    if(intp(value))    len++,plugbuf+=({_c.plugint32(1),_c.plugbyte(value)}); -  else { -  value=(string)value; +  else +  { value=(string)value;    switch(sizeof(value))    { default:    ERROR("\"char\" types must be 1 byte wide, got %O\n",    value);    case 0:    plugbuf+=({_c.plugint32(-1)}); // NULL    break;    case 1:len++;    plugbuf+=({_c.plugint32(1),_c.plugbyte(value[0])});    }
pike.git/lib/modules/Sql.pmod/pgsql.pike:1835:    break;    case OIDOID:    case INT4OID:len+=4;    plugbuf+=({_c.plugint32(4),_c.plugint32((int)value)});    break;    case INT2OID:len+=2;    plugbuf+=({_c.plugint32(2),_c.plugint16((int)value)});    break;    }    } -  if(!tp || !tp->datarowdesc) { -  if(tp && dontcacheprefix->match(q)) // Don't cache FETCH/COPY +  if(!tp || !tp->datarowdesc) +  { if(tp && dontcacheprefix->match(q)) // Don't cache FETCH/COPY    m_delete(prepareds,q),tp=0;    _decodemsg(gotrowdescription);    if(tp)    tp->datarowdesc=_c.portal->_datarowdesc;    }    { array a;int i;    len+=(i=sizeof(a=_c.portal->_datarowdesc))*2;    plugbuf+=({_c.plugint16(i)});    foreach(a;;mapping col)    plugbuf+=({_c.plugint16(oidformat(col->type))});
pike.git/lib/modules/Sql.pmod/pgsql.pike:1859:    PD("Bind portal %s statement %s\n",portalname,preparedname);    _c.sendcmd(plugbuf);   #ifdef DEBUGMORE    PD("%O\n",plugbuf);   #endif    }    _c.portal->_statuscmdcomplete=UNDEFINED;    _sendexecute(_fetchlimit    && !limitpostfix->match(q) // Optimisation for LIMIT 1    && FETCHLIMITLONGRUN); -  if(tp) { -  _decodemsg(bindcomplete); +  if(tp) +  { _decodemsg(bindcomplete);    int tend=gethrtime();    if(tend==tstart)    m_delete(prepareds,q); -  else { -  tp->hits++; +  else +  { tp->hits++;    totalhits++; -  if(!tp->preparedname) { -  if(sizeof(preparedname)) +  if(!tp->preparedname) +  { if(sizeof(preparedname))    tp->preparedname=preparedname;    tstart=tend-tstart;    if(!tp->tparse || tp->tparse>tstart)    tp->tparse=tstart;    }    tp->trunstart=tend;    }    tprepared=tp;    } -  }) { -  PD("%O\n",err); +  }) +  { PD("%O\n",err);    resync(1);    backendstatus=UNDEFINED; -  if(to && sizeof(to)) { -  string val; +  if(to && sizeof(to)) +  { string val;    int i;    lastmessage+=({"Parameter bindings:"});    foreach(to;i;val)    lastmessage+=({sprintf("%16s %3s %.61s",    from[i],val,sprintf("%O",paramValues[i]))});    }    throw(err);    } -  { object tportal=_c.portal; // Make copy, because it might dislodge -  tportal->fetch_row(1); // upon initial fetch_row() +  { object tportal=_c.portal; // Make copy, because it might dislodge +  tportal->fetch_row(1); // upon initial fetch_row()    return tportal;    }   }      //! This is an alias for @[big_query()], since @[big_query()] already supports   //! streaming of multiple simultaneous queries through the same connection.   //!   //! @seealso   //! @[big_query()], @[big_typed_query()], @[Sql.Sql], @[Sql.sql_result] - object streaming_query(string q,void|mapping(string|int:mixed) bindings) { -  return big_query(q,bindings); + object streaming_query(string q,void|mapping(string|int:mixed) bindings) + { return big_query(q,bindings);   }      //! This function returns an object that allows streaming and typed   //! results.   //!   //! @seealso   //! @[big_query()], @[Sql.Sql], @[Sql.sql_result] - object big_typed_query(string q,void|mapping(string|int:mixed) bindings) { -  return big_query(q,bindings,1); + object big_typed_query(string q,void|mapping(string|int:mixed) bindings) + { return big_query(q,bindings,1);   }