static int _doConnect(T C, char **error) { #define ERROR(e) do {*error = Str_dup(e); goto error;} while (0) /* User */ if (URL_getUser(C->url)) StringBuffer_append(C->sb, "user='******' ", URL_getUser(C->url)); else if (URL_getParameter(C->url, "user")) StringBuffer_append(C->sb, "user='******' ", URL_getParameter(C->url, "user")); else ERROR("no username specified in URL"); /* Password */ if (URL_getPassword(C->url)) StringBuffer_append(C->sb, "password='******' ", URL_getPassword(C->url)); else if (URL_getParameter(C->url, "password")) StringBuffer_append(C->sb, "password='******' ", URL_getParameter(C->url, "password")); else ERROR("no password specified in URL"); /* Host */ if (URL_getParameter(C->url, "unix-socket")) { if (URL_getParameter(C->url, "unix-socket")[0] != '/') ERROR("invalid unix-socket directory"); StringBuffer_append(C->sb, "host='%s' ", URL_getParameter(C->url, "unix-socket")); } else if (URL_getHost(C->url)) { StringBuffer_append(C->sb, "host='%s' ", URL_getHost(C->url)); /* Port */ if (URL_getPort(C->url) > 0) StringBuffer_append(C->sb, "port=%d ", URL_getPort(C->url)); else ERROR("no port specified in URL"); } else ERROR("no host specified in URL"); /* Database name */ if (URL_getPath(C->url)) StringBuffer_append(C->sb, "dbname='%s' ", URL_getPath(C->url) + 1); else ERROR("no database specified in URL"); /* Options */ StringBuffer_append(C->sb, "sslmode='%s' ", IS(URL_getParameter(C->url, "use-ssl"), "true") ? "require" : "disable"); if (URL_getParameter(C->url, "connect-timeout")) { TRY StringBuffer_append(C->sb, "connect_timeout=%d ", Str_parseInt(URL_getParameter(C->url, "connect-timeout"))); ELSE ERROR("invalid connect timeout value"); END_TRY; } else StringBuffer_append(C->sb, "connect_timeout=%d ", SQL_DEFAULT_TCP_TIMEOUT); if (URL_getParameter(C->url, "application-name")) StringBuffer_append(C->sb, "application_name='%s' ", URL_getParameter(C->url, "application-name")); /* Connect */ C->db = PQconnectdb(StringBuffer_toString(C->sb)); if (PQstatus(C->db) == CONNECTION_OK) return true; *error = Str_dup(PQerrorMessage(C->db)); error: return false; }
static int _doConnect(T C, URL_T url, char** error) { #undef ERROR #define ERROR(e) do {*error = Str_dup(e); return false;} while (0) #define ORAERROR(e) do{ *error = Str_dup(OracleConnection_getLastError(e)); return false;} while(0) const char *database, *username, *password; const char *host = URL_getHost(url); int port = URL_getPort(url); if (! (username = URL_getUser(url))) if (! (username = URL_getParameter(url, "user"))) ERROR("no username specified in URL"); if (! (password = URL_getPassword(url))) if (! (password = URL_getParameter(url, "password"))) ERROR("no password specified in URL"); if (! (database = URL_getPath(url))) ERROR("no database specified in URL"); ++database; /* Create a thread-safe OCI environment with N' substitution turned on. */ if (OCIEnvCreate(&C->env, OCI_THREADED | OCI_OBJECT | OCI_NCHAR_LITERAL_REPLACE_ON, 0, 0, 0, 0, 0, 0)) ERROR("Create a OCI environment failed"); /* allocate an error handle */ if (OCI_SUCCESS != OCIHandleAlloc(C->env, (dvoid**)&C->err, OCI_HTYPE_ERROR, 0, 0)) ERROR("Allocating error handler failed"); /* server contexts */ if (OCI_SUCCESS != OCIHandleAlloc(C->env, (dvoid**)&C->srv, OCI_HTYPE_SERVER, 0, 0)) ERROR("Allocating server context failed"); /* allocate a service handle */ if (OCI_SUCCESS != OCIHandleAlloc(C->env, (dvoid**)&C->svc, OCI_HTYPE_SVCCTX, 0, 0)) ERROR("Allocating service handle failed"); StringBuffer_clear(C->sb); /* Oracle connect string is on the form: //host[:port]/service name */ if (host) { StringBuffer_append(C->sb, "//%s", host); if (port > 0) StringBuffer_append(C->sb, ":%d", port); StringBuffer_append(C->sb, "/%s", database); } else /* Or just service name */ StringBuffer_append(C->sb, "%s", database); /* Create a server context */ C->lastError = OCIServerAttach(C->srv, C->err, StringBuffer_toString(C->sb), StringBuffer_length(C->sb), 0); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); /* Set attribute server context in the service context */ C->lastError = OCIAttrSet(C->svc, OCI_HTYPE_SVCCTX, C->srv, 0, OCI_ATTR_SERVER, C->err); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); C->lastError = OCIHandleAlloc(C->env, (void**)&C->usr, OCI_HTYPE_SESSION, 0, NULL); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); C->lastError = OCIAttrSet(C->usr, OCI_HTYPE_SESSION, (dvoid *)username, (int)strlen(username), OCI_ATTR_USERNAME, C->err); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); C->lastError = OCIAttrSet(C->usr, OCI_HTYPE_SESSION, (dvoid *)password, (int)strlen(password), OCI_ATTR_PASSWORD, C->err); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); C->lastError = OCISessionBegin(C->svc, C->err, C->usr, OCI_CRED_RDBMS, OCI_DEFAULT); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) ORAERROR(C); OCIAttrSet(C->svc, OCI_HTYPE_SVCCTX, C->usr, 0, OCI_ATTR_SESSION, C->err); return true; }
static MYSQL *doConnect(URL_T url, char **error) { #define MYSQL_ERROR(e) do {*error = Str_dup(e); goto error;} while (0) int port; my_bool yes = 1; my_bool no = 0; volatile int connectTimeout = SQL_DEFAULT_TCP_TIMEOUT; unsigned long clientFlags = CLIENT_MULTI_STATEMENTS; const char *user, *password, *host, *database, *charset, *timeout; const char *unix_socket = URL_getParameter(url, "unix-socket"); MYSQL *db = mysql_init(NULL); if (! db) { *error = Str_dup("unable to allocate mysql handler"); return NULL; } if (! (user = URL_getUser(url))) if (! (user = URL_getParameter(url, "user"))) MYSQL_ERROR("no username specified in URL"); if (! (password = URL_getPassword(url))) if (! (password = URL_getParameter(url, "password"))) MYSQL_ERROR("no password specified in URL"); if (unix_socket) { host = "localhost"; // Make sure host is localhost if unix socket is to be used } else if (! (host = URL_getHost(url))) MYSQL_ERROR("no host specified in URL"); if ((port = URL_getPort(url)) <= 0) MYSQL_ERROR("no port specified in URL"); if (! (database = URL_getPath(url))) MYSQL_ERROR("no database specified in URL"); else database++; /* Options */ if (IS(URL_getParameter(url, "compress"), "true")) clientFlags |= CLIENT_COMPRESS; if (IS(URL_getParameter(url, "use-ssl"), "true")) mysql_ssl_set(db, 0,0,0,0,0); if (IS(URL_getParameter(url, "secure-auth"), "true")) mysql_options(db, MYSQL_SECURE_AUTH, (const char*)&yes); else mysql_options(db, MYSQL_SECURE_AUTH, (const char*)&no); if ((timeout = URL_getParameter(url, "connect-timeout"))) { TRY connectTimeout = Str_parseInt(timeout); ELSE MYSQL_ERROR("invalid connect timeout value"); END_TRY; } mysql_options(db, MYSQL_OPT_CONNECT_TIMEOUT, (const char*)&connectTimeout); if ((charset = URL_getParameter(url, "charset"))) mysql_options(db, MYSQL_SET_CHARSET_NAME, charset); #if MYSQL_VERSION_ID >= 50013 mysql_options(db, MYSQL_OPT_RECONNECT, (const char*)&yes); #endif /* Connect */ if (mysql_real_connect(db, host, user, password, database, port, unix_socket, clientFlags)) return db; *error = Str_dup(mysql_error(db)); error: mysql_close(db); return NULL; }