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

version» Context lines:

pike.git/lib/modules/Sql.pmod/rsql.pike:16:      #define ERROR(X ...) predef::error(X)      protected object(Stdio.File) sock;   protected int seqno = 0;      protected private string host, user, pw;   protected private int port;   protected private mapping options;    + protected private string db; +    protected void low_reconnect()   {    object losock = Stdio.File();    if(sock)    destruct(sock);    if (host == "") {   #ifdef ENABLE_SPAWN_RSQLD    Process.spawn_pike(({ "-x", "rsqld", "--stdin" }), ([    "stdin":losock->pipe(),    ]));
pike.git/lib/modules/Sql.pmod/rsql.pike:67:    low_reconnect();   }      protected mixed do_request(int cmd, mixed|void arg, int|void noreconnect)   {    LOCK;    if(!sock)    if(noreconnect) {    UNLOCK;    ERROR("No connection\n"); -  } else +  } else { +  UNLOCK;    low_reconnect(); -  +  select_db(db); +  LOCK; +  noreconnect = 1; +  }    arg = (arg? encode_value(arg) : "");    sock->write("?<%c>%4c%4c%s", cmd, ++seqno, sizeof(arg), arg);    string res;    int rlen;    if((res = sock->read(12)) && sizeof(res)==12 &&    res[1..7]==sprintf("<%c>%4c", cmd, seqno) &&    sscanf(res[8..11], "%4c", rlen)==1 && (res[0]=='.' || res[0]=='!')) {    mixed rdat = (rlen? sock->read(rlen) : "");    if((!rdat) || sizeof(rdat)!=rlen) {    destruct(sock);    UNLOCK;    if(noreconnect)    ERROR("RSQL Phase error, disconnected\n"); -  else return do_request(cmd, arg, 1); +  else return do_request(cmd, arg);    }    UNLOCK;    rdat = (sizeof(rdat)? decode_value(rdat):0);    switch(res[0]) {    case '.': return rdat;    case '!': ERROR(rdat);    }    ERROR("Internal error\n");    } else {    destruct(sock);    UNLOCK;    if(noreconnect) -  ERROR("RSQL Phase error, disconnected\n"); -  else return do_request(cmd, arg, 1); +  ERROR("RSQL connection closed\n"); +  else return do_request(cmd, arg);    }   }    - void select_db(string db) + void select_db(string the_db)   { -  do_request('D', db); +  do_request('D', the_db); +  db = the_db;   }      int|string error()   {    return do_request('E');   }      void create_db(string db)   {    do_request('C', db);