Diff for /sql/pgsql/parser3pgsql.C between versions 1.41 and 1.44

version 1.41, 2012/06/15 09:09:33 version 1.44, 2015/10/26 16:00:51
Line 1 Line 1
 /** @file  /** @file
         Parser PgSQL driver.          Parser PgSQL driver.
   
         Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)          Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com)
   
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
Line 100  struct Connection { Line 100  struct Connection {
         const char* client_charset;          const char* client_charset;
         bool autocommit;          bool autocommit;
         bool without_default_transactions;          bool without_default_transactions;
           bool standard_conforming_strings;
 };  };
   
 /**  /**
Line 134  public: Line 135  public:
                         charset=value&                  // transcode by server with 'SET CLIENT_ENCODING=value'                          charset=value&                  // transcode by server with 'SET CLIENT_ENCODING=value'
                         datestyle=value&                // 'SET DATESTYLE=value' available values are: ISO|SQL|Postgres|European|US|German [default=ISO]                          datestyle=value&                // 'SET DATESTYLE=value' available values are: ISO|SQL|Postgres|European|US|German [default=ISO]
                         autocommit=1&                   // each transaction is commited automatically (default)                          autocommit=1&                   // each transaction is commited automatically (default)
                         WithoutDefaultTransaction=0     // 1 -- disable any BEGIN TRAN/COMMIT/ROLLBACK [can NOT be used with autocommit option]                          standard_conforming_strings=1& // 0 -- escape \ char that could be needed for old servers
                           WithoutDefaultTransaction=0        // 1 -- disable any BEGIN TRAN/COMMIT/ROLLBACK [can NOT be used with autocommit option]
         */          */
         void connect(          void connect(
                                 char* url,                                   char* url, 
Line 158  public: Line 160  public:
                 connection.client_charset=0;                      connection.client_charset=0;    
                 connection.autocommit=true;                  connection.autocommit=true;
                 connection.without_default_transactions=false;                  connection.without_default_transactions=false;
                   connection.standard_conforming_strings=true;
   
                 connection.conn=PQsetdbLogin(                  connection.conn=PQsetdbLogin(
                         (host&&strcasecmp(host, "local")==0)?NULL/* local Unix domain socket */:host, port,                           (host&&strcasecmp(host, "local")==0)?NULL/* local Unix domain socket */:host, port, 
Line 192  public: Line 195  public:
                                                                 connection.without_default_transactions=true;                                                                  connection.without_default_transactions=true;
                                                                 connection.autocommit=false;                                                                  connection.autocommit=false;
                                                         }                                                          }
                                                   } else if(strcasecmp(key, "standard_conforming_strings")==0){
                                                           if(atoi(value)==0)
                                                                   connection.standard_conforming_strings=false;
                                                 } else                                                  } else
                                                         services._throw("unknown connect option" /*key*/);                                                          services._throw("unknown connect option" /*key*/);
                                         } else                                           } else 
Line 244  public: Line 250  public:
         // thus we can't use the sql server quoting support          // thus we can't use the sql server quoting support
         const char* quote(void *aconnection, const char *str, unsigned int length)           const char* quote(void *aconnection, const char *str, unsigned int length) 
         {          {
                   Connection& connection=*static_cast<Connection*>(aconnection);
   
                 const char* from;                  const char* from;
                 const char* from_end=str+length;                  const char* from_end=str+length;
   
                 size_t quoted=0;                  size_t quoted=0;
   
                 for(from=str; from<from_end; from++){                  if(connection.standard_conforming_strings){
                         switch (*from) {                          for(from=str; from<from_end; from++){
                         case '\'':                                  if(*from=='\'')
                         case '\\':                                          quoted++;
                                 quoted++;                          }
                   } else {
                           for(from=str; from<from_end; from++){
                                   switch (*from) {
                                   case '\'':
                                   case '\\':
                                           quoted++;
                                   }
                         }                          }
                 }                  }
   
                 if(!quoted)                  if(!quoted)
                         return str;                          return str;
   
                 Connection& connection=*static_cast<Connection*>(aconnection);  
                 char *result=(char*)connection.services->malloc_atomic(length + quoted + 1);                  char *result=(char*)connection.services->malloc_atomic(length + quoted + 1);
                 char *to = result;                  char *to = result;
   
                 for(from=str; from<from_end; from++){                  if(connection.standard_conforming_strings){
                         switch (*from) {                          for(from=str; from<from_end; from++){
                         case '\'': // "'" -> "''"                                  if(*from=='\'')
                                 *to++='\'';                                          *to++= '\''; // "'" -> "''"
                                 break;                                  *to++=*from;
                         case '\\': // "\" -> "\\"                          }
                                 *to++='\\';                  } else {
                                 break;                          for(from=str; from<from_end; from++){
                                   switch (*from) {
                                   case '\'': // "'" -> "''"
                                           *to++= '\'';
                                           break;
                                   case '\\': // "\" -> "\\"
                                           *to++='\\';
                                           break;
                                   }
                                   *to++=*from;
                         }                          }
                         *to++=*from;  
                 }                  }
                                   
                 *to=0;                  *to=0;

Removed from v.1.41  
changed lines
  Added in v.1.44


E-mail: