END_FASTDB_NAMESPACE USE_FASTDB_NAMESPACE int cli_open_fdb(char const* server_url, int max_connect_attempts, int reconnect_timeout_sec) { socket_t* sock; int n_addresses = 1; char const* start = server_url; char const* end; while ((end = strchr(start, ',')) != NULL) { start = end + 1; n_addresses += 1; } if (n_addresses == 1) { sock = socket_t::connect(server_url, socket_t::sock_any_domain, max_connect_attempts, reconnect_timeout_sec); } else { char** addresses = new char*[n_addresses]; start = server_url; for (int i = 0; i < n_addresses; i++) { end = strchr(start, ','); if (end == NULL) { end = start + strlen(start); } int len = end - start; char* addr = new char[len+1]; memcpy(addr, start, len); addr[len] = '\0'; start = end + 1; addresses[i] = addr; } sock = replication_socket_t::connect((char const**)addresses, n_addresses, max_connect_attempts, reconnect_timeout_sec); while (--n_addresses >= 0) { delete[] addresses[n_addresses]; } delete[] addresses; } if (!sock->is_ok()) { delete sock; return cli_connection_refused; } session_desc* session = sessions.allocate(); session->sock = sock; session->stmts = NULL; return session->id; }
int cli_open(char const* server_url, int max_connect_attempts, int reconnect_timeout_sec) { socket_t* sock = socket_t::connect(server_url, socket_t::sock_any_domain, max_connect_attempts, reconnect_timeout_sec); if (!sock->is_ok()) { delete sock; return cli_connection_refused; } session_desc* session = sessions.allocate(); session->sock = sock; session->stmts = NULL; return session->id; }
int cli_statement(int session, char const* stmt_str) { session_desc* s = sessions.get(session); if (s == NULL) { return cli_bad_descriptor; } statement_desc* stmt = statements.allocate(); stmt->stmt = new char[strlen(stmt_str)+1]; stmt->columns = NULL; stmt->params = NULL; stmt->session = s; stmt->for_update = 0; stmt->prepared = false; stmt->n_params = 0; stmt->n_columns = 0; stmt->columns_len = 0; stmt->oid = 0; stmt->next = s->stmts; s->stmts = stmt; char const* p = stmt_str; char* dst = stmt->stmt; parameter_binding** last = &stmt->params; while (*p != '\0') { if (*p == '\'') { do { do { *dst++ = *p++; } while (*p != '\0' && *p != '\''); *dst++ = *p; if (*p == '\0') { *last = NULL; stmt->free(); statements.free(stmt); return cli_bad_statement; } } while (*++p == '\''); } else if (*p == '%') { stmt->n_params += 1; char const* q = p++; while (isalnum((unsigned char)*p)) p += 1; if (*p == '%') { *last = NULL; stmt->free(); statements.free(stmt); return cli_bad_statement; } parameter_binding* pb = new parameter_binding; int len = p - q; pb->name = new char[len+1]; memcpy(pb->name, q, len); pb->name[len] = '\0'; *last = pb; last = &pb->next; pb->var_ptr = NULL; *dst++ = '\0'; } else { *dst++ = *p++; } } if (dst == stmt->stmt || *(dst-1) != '\0') { *dst++ = '\0'; } stmt->stmt_len = dst - stmt->stmt; *last = NULL; return stmt->id; }