Diff for /sql/pgsql/parser3pgsql.C between versions 1.18 and 1.25

version 1.18, 2004/03/05 10:16:41 version 1.25, 2004/12/23 16:54:52
Line 58  static char *lsplit(char **string_ref, c Line 58  static char *lsplit(char **string_ref, c
     return result;      return result;
 }  }
   
 static void toupper(char *out, const char *in, size_t size) {  static char* rsplit(char* string, char delim) {
       if(string) {
                   char* v=strrchr(string, delim); 
                   if(v) {
                           *v=0;
                           return v+1;
                   }
       }
       return NULL;        
   }
   
   static void toupper_str(char *out, const char *in, size_t size) {
         while(size--)          while(size--)
                 *out++=(char)toupper(*in++);                  *out++=(char)toupper(*in++);
 }  }
Line 95  public: Line 106  public:
         #define PQclear_throwPQerror PQclear_throw(PQerrorMessage(connection.conn))          #define PQclear_throwPQerror PQclear_throw(PQerrorMessage(connection.conn))
   
         /**     connect          /**     connect
                 @param used_only_in_connect_url                  @param url
                         format: @b user:pass@host[:port]|[local]/database                          format: @b user:pass@host[:port]|[local]/database
         */          */
         void connect(          void connect(
                 char *used_only_in_connect_url,                   char *url, 
                 SQL_Driver_services& services,                   SQL_Driver_services& services, 
                 void **connection_ref ///< output: Connection*                  void **connection_ref ///< output: Connection*
                 ) {                  ) {
                 char *user=used_only_in_connect_url;                  char *user=url;
                 char *host=lsplit(user, '@');                  char *host=rsplit(user, '@');
                 char *db=lsplit(host, '/');                  char *db=lsplit(host, '/');
                 char *pwd=lsplit(user, ':');                  char *pwd=lsplit(user, ':');
                 char *port=lsplit(host, ':');                  char *port=lsplit(host, ':');
Line 127  public: Line 138  public:
   
                 char *charset=0;                  char *charset=0;
                 char *datestyle=0;                  char *datestyle=0;
                   isDefaultTransaction = true;
   
                 while(options) {                  while(options) {
                         if(char *key=lsplit(&options, '&')) {                          if(char *key=lsplit(&options, '&')) {
                                 if(*key) {                                  if(*key) {
                                         if(char *value=lsplit(key, '=')) {                                          if(char *value=lsplit(key, '=')) {
                                                 if(strcmp(key, "ClientCharset" ) == 0) {                                                  if(strcmp(key, "ClientCharset" ) == 0) {
                                                         toupper(value, value, strlen(value));                                                          toupper_str(value, value, strlen(value));
                                                         connection.cstrClientCharset=value;                                                          connection.cstrClientCharset=value;
                                                 } else if(strcasecmp(key, "charset")==0) { // left for backward compatibility, consider using ClientCharset                                                  } else if(strcasecmp(key, "charset")==0) { // left for backward compatibility, consider using ClientCharset
                                                         cstrBackwardCompAskServerToTranscode=value;                                                          cstrBackwardCompAskServerToTranscode=value;
                                                 } else if(strcasecmp(key, "datestyle")==0) {                                                  } else if(strcasecmp(key, "datestyle")==0) {
                                                         datestyle=value;                                                          datestyle=value;
                                                   } else if(strcmp(key, "WithoutDefaultTransaction")==0) {
                                                           isDefaultTransaction = false;
                                                 } else                                                  } else
                                                         services._throw("unknown connect option" /*key*/);                                                          services._throw("unknown connect option" /*key*/);
                                         } else                                           } else 
Line 182  public: Line 196  public:
                 connection.conn=0;                  connection.conn=0;
         }          }
         void commit(void *aconnection) {          void commit(void *aconnection) {
                 Connection& connection=*static_cast<Connection*>(aconnection);                  if(isDefaultTransaction)
                   {
                 if(PGresult *res=PQexec(connection.conn, "COMMIT"))                          Connection& connection=*static_cast<Connection*>(aconnection);
                         PQclear(res);  
                 else                          if(PGresult *res=PQexec(connection.conn, "COMMIT"))
                         throwPQerror;                                  PQclear(res);
                 begin_transaction(connection);                          else
                                   throwPQerror;
                           begin_transaction(connection);
                   }
         }          }
         void rollback(void *aconnection) {          void rollback(void *aconnection) {
                 Connection& connection=*static_cast<Connection*>(aconnection);                  if(isDefaultTransaction)
                   {
                 if(PGresult *res=PQexec(connection.conn, "ROLLBACK"))                          Connection& connection=*static_cast<Connection*>(aconnection);
                         PQclear(res);  
                 else                          if(PGresult *res=PQexec(connection.conn, "ROLLBACK"))
                         throwPQerror;                                  PQclear(res);
                 begin_transaction(connection);                          else
                                   throwPQerror;
                           begin_transaction(connection);
                   }
         }          }
   
         bool ping(void *aconnection) {          bool ping(void *aconnection) {
Line 228  public: Line 248  public:
                 return result;                  return result;
                 }                  }
         void query(void *aconnection,           void query(void *aconnection, 
                 const char *astatement, unsigned long offset, unsigned long limit,                  const char *astatement, 
                   size_t placeholders_count, Placeholder* placeholders, 
                   unsigned long offset, unsigned long limit,
                 SQL_Driver_query_event_handlers& handlers) {                  SQL_Driver_query_event_handlers& handlers) {
 //              _asm int 3;  //              _asm int 3;
                 Connection& connection=*static_cast<Connection*>(aconnection);                  Connection& connection=*static_cast<Connection*>(aconnection);
                   const char* cstrClientCharset=connection.cstrClientCharset;
                 SQL_Driver_services& services=*connection.services;                  SQL_Driver_services& services=*connection.services;
                 PGconn *conn=connection.conn;                  PGconn *conn=connection.conn;
   
                   if(placeholders_count>0)
                           services._throw("bind variables not supported (yet)");
   
                 // transcode from $request:charset to connect-string?client_charset                  // transcode from $request:charset to connect-string?client_charset
                 if(const char* cstrClientCharset=connection.cstrClientCharset) {                  if(cstrClientCharset) {
                         size_t transcoded_statement_size;                          size_t transcoded_statement_size;
                         services.transcode(astatement, strlen(astatement),                          services.transcode(astatement, strlen(astatement),
                                 astatement, transcoded_statement_size,                                  astatement, transcoded_statement_size,
Line 281  public: Line 307  public:
                 for(int i=0; i<column_count; i++){                  for(int i=0; i<column_count; i++){
                         char *name=PQfname(res, i);                          char *name=PQfname(res, i);
                         size_t length=strlen(name);                          size_t length=strlen(name);
                         char* str=(char*)services.malloc(length+1);                          char* strm=(char*)services.malloc(length+1);
                         memcpy(str, name, length+1);                          memcpy(strm, name, length+1);
                           const char* str=strm;
   
                         // transcode to $request:charset from connect-string?client_charset                          // transcode to $request:charset from connect-string?client_charset
                         if(const char* cstrClientCharset=connection.cstrClientCharset) {                          if(cstrClientCharset) 
                                 services.transcode(str, length,                                  services.transcode(str, length,
                                         str, length,                                          str, length,
                                         cstrClientCharset,                                          cstrClientCharset,
                                         services.request_charset());                                          services.request_charset());
                         }  
   
                         CHECK(handlers.add_column(sql_error, str, length));                          CHECK(handlers.add_column(sql_error, str, length));
                 }                  }
Line 303  public: Line 329  public:
                                 for(int i=0; i<column_count; i++){                                  for(int i=0; i<column_count; i++){
                                         const char *cell=PQgetvalue(res, r, i);                                          const char *cell=PQgetvalue(res, r, i);
                                         size_t length;                                          size_t length;
                                         char* str;                                          const char* str;
                                         if(PQftype(res, i)==OIDOID) {                                          if(PQftype(res, i)==OIDOID) {
                                                 // ObjectID column, read object bytes                                                  // ObjectID column, read object bytes
   
Line 324  public: Line 350  public:
                                                         length=(size_t)size_tell;                                                          length=(size_t)size_tell;
                                                         if(length) {                                                          if(length) {
                                                                 // read                                                                   // read 
                                                                 str=(char*)services.malloc(length+1);                                                                  char* strm=(char*)services.malloc(length+1);
                                                                 if(!lo_read_ex(conn, fd, str, size_tell))                                                                  if(!lo_read_ex(conn, fd, strm, size_tell))
                                                                         PQclear_throw("lo_read can not read all bytes of object");                                                                          PQclear_throw("lo_read can not read all bytes of object");
                                                                 str[length]=0;                                                                  strm[length]=0;
                                                                   str=strm;
                                                         } else                                                          } else
                                                                 str=0;                                                                  str=0;
                                                         if(lo_close(conn, fd)<0)                                                          if(lo_close(conn, fd)<0)
Line 338  public: Line 365  public:
                                                 // normal column, read it normally                                                  // normal column, read it normally
                                                 length=(size_t)PQgetlength(res, r, i);                                                  length=(size_t)PQgetlength(res, r, i);
                                                 if(length) {                                                  if(length) {
                                                         str=(char*)services.malloc(length+1);                                                          char* strm=(char*)services.malloc(length+1);
                                                         memcpy(str, cell, length+1);                                                          memcpy(strm, cell, length+1);
                                                           str=strm;
                                                 } else                                                  } else
                                                         str=0;                                                          str=0;
                                         }                                          }
   
                                         if(str && length) {                                          if(str && length) {
                                                 // transcode to $request:charset from connect-string?client_charset                                                  // transcode to $request:charset from connect-string?client_charset
                                                 if(const char* cstrClientCharset=connection.cstrClientCharset)                                                  if(cstrClientCharset)
                                                         services.transcode(str, length,                                                          services.transcode(str, length,
                                                                 str, length,                                                                  str, length,
                                                                 cstrClientCharset,                                                                  cstrClientCharset,
Line 365  cleanup: Line 393  cleanup:
 private: // private funcs  private: // private funcs
   
         void begin_transaction(Connection& connection) {          void begin_transaction(Connection& connection) {
                 if(PGresult *res=PQexec(connection.conn, "BEGIN"))                  if(isDefaultTransaction)
                         PQclear(res);                  {
                 else                          if(PGresult *res=PQexec(connection.conn, "BEGIN"))
                         throwPQerror;                                  PQclear(res);
                           else
                                   throwPQerror;
                   }
         }          }
   
         const char *preprocess_statement(Connection& connection,          const char *preprocess_statement(Connection& connection,
Line 552  private: // conn client library funcs li Line 583  private: // conn client library funcs li
                 return 0;                  return 0;
         }          }
   
           bool isDefaultTransaction;
 };  };
   
 extern "C" SQL_Driver *SQL_DRIVER_CREATE() {  extern "C" SQL_Driver *SQL_DRIVER_CREATE() {

Removed from v.1.18  
changed lines
  Added in v.1.25


E-mail: