IoObject *IoDBI_drivers(IoDBI *self, IoObject *locals, IoMessage *m) { /*doc DBI drivers Get a list of drivers and its associated information: <ol> <li>name</li> <li>description</li> <li>filename</li> <li>version</li> <li>date compiled</li> <li>maintainer</li> <li>url</li> </ol> */ IoList *list = IOREF(IoList_new(IOSTATE)); dbi_driver driver = NULL; while((driver = dbi_driver_list(driver)) != NULL) { IoList *dlist = IOREF(IoList_new(IOSTATE)); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_name(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_description(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_filename(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_version(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_date_compiled(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_maintainer(driver))); IoList_rawAppend_(dlist, IOSYMBOL(dbi_driver_get_url(driver))); IoList_rawAppend_(list, dlist); } return list; }
dbi_result _db_rawquery(const char *file, int line, database *db, int log_dupes, char *qry) { dbi_result result; const char *errmsg; int tries = 0; if (debug > 4) { LOGRAW(LOG_DEBUG, qry); } if (!dbi_conn_ping(db->conn)) { if (db->conn) dbi_conn_close(db->conn); db->conn = dbi_conn_new(db->driver); if (db->conn == NULL) { perror(db->driver); exit(1); } dbi_conn_set_option(db->conn, "host", db->host); dbi_conn_set_option(db->conn, "port", db->port); dbi_conn_set_option(db->conn, "username", db->username); dbi_conn_set_option(db->conn, "password", db->password); dbi_conn_set_option(db->conn, "dbname", db->name); retry: if (++tries == 3) exit(1); if (dbi_conn_connect(db->conn) < 0) { dbi_conn_error(db->conn, &errmsg); _logsrce = file; _logline = line; _LOG(LOG_ERR, "%s connection failed to %s:%s:%s %s", db->driver, db->host, db->port, db->name, errmsg); sleep(3); goto retry; } { char versionstring[VERSIONSTRING_LENGTH]; dbi_driver driver; driver = dbi_conn_get_driver(db->conn); dbi_conn_get_engine_version_string(db->conn, versionstring); LOG(LOG_INFO, "using driver: %s, version %s, compiled %s", dbi_driver_get_filename(driver), dbi_driver_get_version(driver), dbi_driver_get_date_compiled(driver)); LOG(LOG_INFO, "connected to %s:%s:%s, server version %s", db->host, db->port, db->name, versionstring); } } if (debug > 2) { char *src, *dst, buf[4096]; for (dst = buf, src = qry; *src; src++, dst++) { if (*src == '%') *dst++ = '%'; *dst = *src; } *dst = 0; LOG(LOG_INFO, buf); } result = dbi_conn_query(db->conn, qry); if (result == NULL) { int ret = dbi_conn_error(db->conn, &errmsg); _logsrce = file; _logline = line; _LOG(LOG_ERR, "query failed: %s (%s)", errmsg, qry); if (ret == DBI_ERROR_NOCONN) { dbi_conn_close(db->conn); db->conn = NULL; sleep(3); goto retry; } } return(result); }