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; }
static int cdbi_connect_database (cdbi_database_t *db) /* {{{ */ { dbi_driver driver; dbi_conn connection; size_t i; int status; if (db->connection != NULL) { status = dbi_conn_ping (db->connection); if (status != 0) /* connection is alive */ return (0); dbi_conn_close (db->connection); db->connection = NULL; } driver = dbi_driver_open_r (db->driver, dbi_instance); if (driver == NULL) { ERROR ("dbi plugin: cdbi_connect_database: dbi_driver_open_r (%s) failed.", db->driver); INFO ("dbi plugin: Maybe the driver isn't installed? " "Known drivers are:"); for (driver = dbi_driver_list_r (NULL, dbi_instance); driver != NULL; driver = dbi_driver_list_r (driver, dbi_instance)) { INFO ("dbi plugin: * %s", dbi_driver_get_name (driver)); } return (-1); } connection = dbi_conn_open (driver); if (connection == NULL) { ERROR ("dbi plugin: cdbi_connect_database: dbi_conn_open (%s) failed.", db->driver); return (-1); } /* Set all the driver options. Because this is a very very very generic * interface, the error handling is kind of long. If an invalid option is * encountered, it will get a list of options understood by the driver and * report that as `INFO'. This way, users hopefully don't have too much * trouble finding out how to configure the plugin correctly.. */ for (i = 0; i < db->driver_options_num; i++) { if (db->driver_options[i].is_numeric) { status = dbi_conn_set_option_numeric (connection, db->driver_options[i].key, db->driver_options[i].value.numeric); if (status != 0) { char errbuf[1024]; ERROR ("dbi plugin: cdbi_connect_database (%s): " "dbi_conn_set_option_numeric (\"%s\", %i) failed: %s.", db->name, db->driver_options[i].key, db->driver_options[i].value.numeric, cdbi_strerror (connection, errbuf, sizeof (errbuf))); } } else { status = dbi_conn_set_option (connection, db->driver_options[i].key, db->driver_options[i].value.string); if (status != 0) { char errbuf[1024]; ERROR ("dbi plugin: cdbi_connect_database (%s): " "dbi_conn_set_option (\"%s\", \"%s\") failed: %s.", db->name, db->driver_options[i].key, db->driver_options[i].value.string, cdbi_strerror (connection, errbuf, sizeof (errbuf))); } } if (status != 0) { char const *opt; INFO ("dbi plugin: This is a list of all options understood " "by the `%s' driver:", db->driver); for (opt = dbi_conn_get_option_list (connection, NULL); opt != NULL; opt = dbi_conn_get_option_list (connection, opt)) { INFO ("dbi plugin: * %s", opt); } dbi_conn_close (connection); return (-1); } } /* for (i = 0; i < db->driver_options_num; i++) */ status = dbi_conn_connect (connection); if (status != 0) { char errbuf[1024]; ERROR ("dbi plugin: cdbi_connect_database (%s): " "dbi_conn_connect failed: %s", db->name, cdbi_strerror (connection, errbuf, sizeof (errbuf))); dbi_conn_close (connection); return (-1); } if (db->select_db != NULL) { status = dbi_conn_select_db (connection, db->select_db); if (status != 0) { char errbuf[1024]; WARNING ("dbi plugin: cdbi_connect_database (%s): " "dbi_conn_select_db (%s) failed: %s. Check the `SelectDB' option.", db->name, db->select_db, cdbi_strerror (connection, errbuf, sizeof (errbuf))); dbi_conn_close (connection); return (-1); } } db->connection = connection; return (0); } /* }}} int cdbi_connect_database */
/** * check if requested driver is provided by local DBI installation * * @param driver_name string with the name of the driver * @return 1 if exists, 0 otherwise */ int tagsistant_driver_is_available(const char *driver_name) { int counter = 0; int driver_found = 0; dbi_driver driver = NULL; dbg('b', LOG_INFO, "Available drivers:"); #if TAGSISTANT_REENTRANT_DBI while ((driver = dbi_driver_list_r(driver, tagsistant.dbi_instance)) != NULL) { #else while ((driver = dbi_driver_list(driver)) != NULL) { #endif counter++; dbg('b', LOG_INFO, " Driver #%d: %s - %s", counter, dbi_driver_get_name(driver), dbi_driver_get_filename(driver)); if (g_strcmp0(dbi_driver_get_name(driver), driver_name) == 0) { driver_found = 1; } } if (!counter) { dbg('b', LOG_ERR, "No SQL driver found! Exiting now."); return(0); } if (!driver_found) { dbg('b', LOG_ERR, "No %s driver found!", driver_name); return(0); } return(1); } /** * Contains DBI parsed options */ struct { int backend; gchar *backend_name; gchar *host; gchar *db; gchar *username; gchar *password; } dboptions; #if TAGSISTANT_ENABLE_TAG_ID_CACHE /** a map tag_name -> tag_id */ GHashTable *tagsistant_tag_cache = NULL; #endif /** regular expressions used to escape query parameters */ GRegex *RX1, *RX2, *RX3; /** * Initialize libDBI structures */ void tagsistant_db_init() { // initialize DBI library #if TAGSISTANT_REENTRANT_DBI dbi_initialize_r(NULL, &(tagsistant.dbi_instance)); #else dbi_initialize(NULL); #endif #if TAGSISTANT_USE_QUERY_MUTEX g_mutex_init(&tagsistant_query_mutex); #endif #if TAGSISTANT_ENABLE_TAG_ID_CACHE tagsistant_tag_cache = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); #endif // by default, DBI backend provides intersect tagsistant.sql_backend_have_intersect = 1; tagsistant.sql_database_driver = TAGSISTANT_NULL_BACKEND; dboptions.backend = TAGSISTANT_NULL_BACKEND; // if no database option has been passed, use default SQLite3 if (strlen(tagsistant.dboptions) == 0) { tagsistant.dboptions = g_strdup("sqlite3::::"); dboptions.backend_name = g_strdup("sqlite3"); dboptions.backend = TAGSISTANT_DBI_SQLITE_BACKEND; dbg('b', LOG_INFO, "Using default driver: sqlite3"); } dbg('b', LOG_INFO, "Database options: %s", tagsistant.dboptions); // split database option value up to 5 tokens gchar **_dboptions = g_strsplit(tagsistant.dboptions, ":", 5); // set failsafe DB options if (_dboptions[0]) { if (strcmp(_dboptions[0], "sqlite3") == 0) { tagsistant.sql_database_driver = TAGSISTANT_DBI_SQLITE_BACKEND; dboptions.backend = TAGSISTANT_DBI_SQLITE_BACKEND; dboptions.backend_name = g_strdup("sqlite3"); } else if (strcmp(_dboptions[0], "mysql") == 0) { tagsistant.sql_database_driver = TAGSISTANT_DBI_MYSQL_BACKEND; dboptions.backend = TAGSISTANT_DBI_MYSQL_BACKEND; dboptions.backend_name = g_strdup("mysql"); } } if (TAGSISTANT_DBI_MYSQL_BACKEND == dboptions.backend) { if (_dboptions[1] && strlen(_dboptions[1])) { dboptions.host = g_strdup(_dboptions[1]); if (_dboptions[2] && strlen(_dboptions[2])) { dboptions.db = g_strdup(_dboptions[2]); if (_dboptions[3] && strlen(_dboptions[3])) { dboptions.username = g_strdup(_dboptions[3]); if (_dboptions[4] && strlen(_dboptions[4])) { dboptions.password = g_strdup(_dboptions[4]); } else { dboptions.password = g_strdup("tagsistant"); } } else { dboptions.password = g_strdup("tagsistant"); dboptions.username = g_strdup("tagsistant"); } } else { dboptions.password = g_strdup("tagsistant"); dboptions.username = g_strdup("tagsistant"); dboptions.db = g_strdup("tagsistant"); } } else { dboptions.password = g_strdup("tagsistant"); dboptions.username = g_strdup("tagsistant"); dboptions.db = g_strdup("tagsistant"); dboptions.host = g_strdup("localhost"); } } g_strfreev(_dboptions); #if 0 dbg('b', LOG_INFO, "Database driver: %s", dboptions.backend_name); // list configured options const char *option = NULL; int counter = 0; dbg('b', LOG_INFO, "Connection settings: "); while ((option = dbi_conn_get_option_list(tagsistant_dbi_conn, option)) != NULL ) { counter++; dbg('b', LOG_INFO, " Option #%d: %s = %s", counter, option, dbi_conn_get_option(tagsistant_dbi_conn, option)); } // tell if backend have INTERSECT if (tagsistant.sql_backend_have_intersect) { dbg('b', LOG_INFO, "Database supports INTERSECT operator"); } else { dbg('b', LOG_INFO, "Database does not support INTERSECT operator"); } #endif /* initialize the regular expressions used to escape the SQL queries */ RX1 = g_regex_new("[\"']", 0, 0, NULL); RX2 = g_regex_new("'", 0, 0, NULL); RX3 = g_regex_new("<><>", 0, 0, NULL); }
void gnc_module_init_backend_dbi (void) { const char* driver_dir; int num_drivers; gboolean have_sqlite3_driver = FALSE; gboolean have_mysql_driver = FALSE; gboolean have_pgsql_driver = FALSE; /* Initialize libdbi and see which drivers are available. Only register qof backends which have drivers available. */ driver_dir = g_getenv ("GNC_DBD_DIR"); if (driver_dir == nullptr) { PINFO ("GNC_DBD_DIR not set: using libdbi built-in default\n"); } /* dbi_initialize returns -1 in case of errors */ #if HAVE_LIBDBI_R if (dbi_instance) return; num_drivers = dbi_initialize_r (driver_dir, &dbi_instance); #else num_drivers = dbi_initialize (driver_dir); #endif if (num_drivers <= 0) { gchar* dir = g_build_filename (gnc_path_get_libdir (), "dbd", nullptr); #if HAVE_LIBDBI_R if (dbi_instance) return; num_drivers = dbi_initialize_r (dir, &dbi_instance); #else num_drivers = dbi_initialize (dir); #endif g_free (dir); } if (num_drivers <= 0) { PWARN ("No DBD drivers found\n"); } else { dbi_driver driver = nullptr; PINFO ("%d DBD drivers found\n", num_drivers); do { #if HAVE_LIBDBI_R driver = dbi_driver_list_r (driver, dbi_instance); #else driver = dbi_driver_list (driver); #endif if (driver != nullptr) { const gchar* name = dbi_driver_get_name (driver); PINFO ("Driver: %s\n", name); if (strcmp (name, "sqlite3") == 0) { have_sqlite3_driver = TRUE; } else if (strcmp (name, "mysql") == 0) { have_mysql_driver = TRUE; } else if (strcmp (name, "pgsql") == 0) { have_pgsql_driver = TRUE; } } } while (driver != nullptr); } if (have_sqlite3_driver) { const char* name = "GnuCash Libdbi (SQLITE3) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_SQLITE>{name, FILE_URI_TYPE}); qof_backend_register_provider(std::move(prov)); prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_SQLITE>{name, SQLITE3_URI_TYPE}); qof_backend_register_provider(std::move(prov)); } if (have_mysql_driver) { const char *name = "GnuCash Libdbi (MYSQL) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_MYSQL>{name, "mysql"}); qof_backend_register_provider(std::move(prov)); } if (have_pgsql_driver) { const char* name = "GnuCash Libdbi (POSTGRESQL) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_PGSQL>{name, "postgres"}); qof_backend_register_provider(std::move(prov)); } /* If needed, set log level to DEBUG so that SQl statements will be put into the gnucash.trace file. */ /* qof_log_set_level( log_module, QOF_LOG_DEBUG ); */ }
/* Connects to database */ static GSM_Error SMSDDBI_Connect(GSM_SMSDConfig * Config) { int rc; struct GSM_SMSDdbobj *db = Config->db; rc = dbi_initialize(Config->driverspath); if (rc == 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI did not find any drivers, try using DriversPath option"); dbi_shutdown(); return ERR_DB_DRIVER; } else if (rc < 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to initialize!"); return ERR_DB_DRIVER; } Config->conn.dbi = dbi_conn_new(Config->driver); if (Config->conn.dbi == NULL) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to init %s driver!", Config->driver); dbi_shutdown(); return ERR_DB_DRIVER; } else { SMSD_Log(DEBUG_SQL, Config, "Using DBI driver '%s'", dbi_driver_get_name(dbi_conn_get_driver(Config->conn.dbi))); } dbi_conn_error_handler(Config->conn.dbi, SMSDDBI_Callback, Config); if (dbi_conn_set_option(Config->conn.dbi, "sqlite_dbdir", Config->dbdir) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set sqlite_dbdir!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "sqlite3_dbdir", Config->dbdir) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set sqlite3_dbdir!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "host", Config->host) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set host!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "username", Config->user) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set username!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "password", Config->password) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set password!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "dbname", Config->database) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set dbname!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_set_option(Config->conn.dbi, "encoding", "UTF-8") != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set encoding!"); SMSDDBI_Free(Config); return ERR_DB_CONFIG; } if (dbi_conn_connect(Config->conn.dbi) != 0) { SMSD_Log(DEBUG_ERROR, Config, "DBI failed to connect!"); SMSDDBI_Free(Config); return ERR_DB_CONNECT; } Config->db = db; return ERR_NONE; }
static apr_status_t init_ftpd_dbi(apr_pool_t * p, apr_pool_t * plog, apr_pool_t * ptemp, server_rec * s) { apr_status_t rv = APR_SUCCESS; int rval; dbi_driver dbi_driver; void *data; apr_hash_index_t *idx; char *key; ftpd_dbi_config *val; apr_ssize_t len; const char *userdata_key = "mod_ftpd_dbi_init"; /* dbi_config *conf = ap_get_module_config(s->module_config, * &ftpd_dbi_module); */ apr_pool_userdata_get(&data, userdata_key, s->process->pool); ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, plog, "[mod_ftpd_dbi.c] init."); if (!data) { apr_pool_userdata_set((const void *) 1, userdata_key, apr_pool_cleanup_null, s->process->pool); return OK; } ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, p, "[mod_ftpd_dbi.c] Running DBI init Code"); if ((rval = dbi_initialize(dbi_global_config.driverdir)) > 0) { if (dbi_global_config.driverdir == NULL) { ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, plog, "[mod_ftpd_dbi.c] Initialization of libdbi found %d drivers in default driver directory", rval); } else { ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, plog, "[mod_ftpd_dbi.c] Initialization of libdbi found %d drivers in directory %s", rval, dbi_global_config.driverdir); } if (s->loglevel >= APLOG_DEBUG) { dbi_driver = NULL; while ((dbi_driver = dbi_driver_list(dbi_driver)) != NULL) { ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, plog, "[mod_ftpd_dbi.c] Driver '%s' was loaded.", dbi_driver_get_name(dbi_driver)); } } } else { /* An error was returned or libdbi found 0 drivers */ if (dbi_global_config.driverdir == NULL) { ap_log_perror(APLOG_MARK, APLOG_EMERG, 0, plog, "[mod_ftpd_dbi.c] - Initlialization of libdbi with default driver directory failed"); } else { ap_log_perror(APLOG_MARK, APLOG_EMERG, 0, plog, "[mod_ftpd_dbi.c] - Initlialization of libdbi with FtpDbiDriverDir %s failed", dbi_global_config.driverdir); } return !APR_SUCCESS; } /* loop the hashed config stuff... */ for (idx = apr_hash_first(p, ftpd_dbi_config_hash); idx; idx = apr_hash_next(idx)) { apr_hash_this(idx, (void *) &key, &len, (void *) &val); apr_reslist_create(&val->pool, val->rec.conn_min, /* hard minimum */ val->rec.conn_soft, /* soft maximum */ val->rec.conn_max, /* hard maximum */ val->rec.conn_ttl, /* Time to live -- dbi server might override/disconnect! */ safe_dbi_new_conn, /* Make a New Connection */ safe_dbi_kill_conn, /* Kill Old Connection */ (void *) &val->rec, p); apr_hash_set(ftpd_dbi_config_hash, key, APR_HASH_KEY_STRING, val); } apr_pool_cleanup_register(p, p, kill_dbi, apr_pool_cleanup_null); ap_add_version_component(p, "mod_ftpd_dbi/" MOD_FTPD_DBI_VERSION); return rv; }