Diff for /sql/pgsql/parser3pgsql.C between versions 1.49 and 1.51

version 1.49, 2021/11/03 16:27:15 version 1.51, 2021/11/08 08:57:16
Line 140  public: Line 140  public:
                 char* host=rsplit(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 *options=lsplit(db, '?');                  char *options=lsplit(db, '?');
   
                 char* charset=0;                  char* charset=0;
                 char* datestyle=0;                  char* datestyle=0;
   
                   char* pq_options=0;
                   size_t  pq_options_len=options ? strlen(options) : 0;
   
                 Connection& connection=*(Connection *)services.malloc(sizeof(Connection));                  Connection& connection=*(Connection *)services.malloc(sizeof(Connection));
   
                 *connection_ref=&connection;                  *connection_ref=&connection;
Line 159  public: Line 161  public:
                         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){ // transcoding with parser
                                                         toupper_str(value, value, strlen(value));                                                          toupper_str(value, value, strlen(value));
                                                         connection.client_charset=value;                                                          connection.client_charset=value;
                                                 } else if(strcasecmp(key, "charset")==0){                                                  } else if(strcasecmp(key, "charset")==0){ // transcoding with server
                                                         charset=value;                                                          charset=value;
                                                 } else if(strcasecmp(key, "datestyle")==0){                                                  } else if(strcasecmp(key, "datestyle")==0){
                                                         datestyle=value;                                                          datestyle=value;
Line 172  public: Line 174  public:
                                                 } else if(strcasecmp(key, "standard_conforming_strings")==0){                                                  } else if(strcasecmp(key, "standard_conforming_strings")==0){
                                                         if(atoi(value)==0)                                                          if(atoi(value)==0)
                                                                 connection.standard_conforming_strings=false;                                                                  connection.standard_conforming_strings=false;
                                                 } else                                                  } else {
                                                         services._throw("unknown connect option" /*key*/);                                                          if(!pq_options) {
                                                                   pq_options=(char*)services.malloc_atomic(pq_options_len+2);
                                                                   strcpy(pq_options, "?");
                                                           } else {
                                                                   strcat(pq_options, "&");
                                                           }
                                                           strcat(pq_options, key);
                                                           strcat(pq_options, "=");
                                                           strcat(pq_options, value);
                                                   }
                                         } else                                           } else 
                                                 services._throw("connect option without =value" /*key*/);                                                  services._throw("connect option without =value" /*key*/);
                                 }                                  }
                         }                          }
                 }                  }
   
                 connection.conn=PQsetdbLogin( (host && strcasecmp(host, "local") == 0) ? NULL /* local Unix domain socket */ : host, port, NULL, NULL, db, user, pwd);                  if(host && (strchr(host, ',') || pq_options)){ // pq_options can exist only if host and db are not null
                           char pq_url[MAX_STRING];
                           snprintf(pq_url, MAX_STRING, "postgresql://%s/%s%s", host, db ? db : "", pq_options ? pq_options : "");
                           connection.conn=PQsetdbLogin(NULL, NULL, NULL, NULL, pq_url, user, pwd);
                   } else {
                           char* port=lsplit(host, ':');
                           connection.conn=PQsetdbLogin( (host && strcasecmp(host, "local") == 0) ? NULL /* local Unix domain socket */ : host, port, NULL, NULL, db, user, pwd);
                   }
   
                 if(!connection.conn)                  if(!connection.conn)
                         services._throw("PQsetdbLogin failed");                          services._throw("PQsetdbLogin failed");
Line 189  public: Line 207  public:
                         throwPQerror;                          throwPQerror;
   
                 if(charset){                  if(charset){
                         char statement[MAX_STRING+1]="SET CLIENT_ENCODING=";                          char statement[MAX_STRING];
                         strncat(statement, charset, MAX_STRING);                          snprintf(statement, MAX_STRING, "SET CLIENT_ENCODING=%s", charset);
   
                         _execute_cmd(connection, statement);                          _execute_cmd(connection, statement);
                 }                  }
   
                 if(datestyle){                  if(datestyle){
                         char statement[MAX_STRING+1]="SET DATESTYLE=";                          char statement[MAX_STRING];
                         strncat(statement, datestyle, MAX_STRING);                          snprintf(statement, MAX_STRING, "SET DATESTYLE=%s", datestyle);
   
                         _execute_cmd(connection, statement);                          _execute_cmd(connection, statement);
                 }                  }
   
                 if(!connection.autocommit)                  if(!connection.autocommit)
                         _execute_cmd(connection, "set AUTOCOMMIT off");                          _execute_cmd(connection, "BEGIN");
         }          }
   
         void disconnect(void *aconnection){          void disconnect(void *aconnection){
Line 636  private: // conn client library funcs Line 652  private: // conn client library funcs
   
 private: // conn client library funcs linking  private: // conn client library funcs linking
   
         const char *dlink(const char *dlopen_file_spec) {          const char *dlink(char *dlopen_file_spec) {
                 if(lt_dlinit()){                  if(lt_dlinit()){
                         if(const char* result=lt_dlerror())                          if(const char* result=lt_dlerror())
                                 return result;                                  return result;
                         return "can not prepare to dynamic loading";                          return "can not prepare to dynamic loading";
                 }                  }
   
                 lt_dlhandle handle=lt_dlopen(dlopen_file_spec);                  lt_dlhandle handle;
                   do {
                           char *next=lsplit(dlopen_file_spec, ',');
                           handle=lt_dlopen(dlopen_file_spec);
                           dlopen_file_spec=next;
                   } while (!handle && dlopen_file_spec);
   
                 if(!handle){                  if(!handle){
                         if(const char* result=lt_dlerror())                          if(const char* result=lt_dlerror())
Line 657  private: // conn client library funcs li Line 678  private: // conn client library funcs li
                                         action;                                          action;
   
                 #define DLINK(name) DSLINK(name, return "function " #name " was not found")                  #define DLINK(name) DSLINK(name, return "function " #name " was not found")
                   
                 DLINK(PQsetdbLogin);                  DLINK(PQsetdbLogin);
                 DLINK(PQerrorMessage);                  DLINK(PQerrorMessage);
                 DLINK(PQstatus);                  DLINK(PQstatus);

Removed from v.1.49  
changed lines
  Added in v.1.51


E-mail: