/** * wmud_db_init: * @err: a GError to put error messages in it * * Initializes the wMUD database system. Checks and opens database files. */ gboolean wmud_db_init(GError **err) { GError *local_err = NULL; g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Initializing database"); gda_init(); g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Database DSN is \"%s\"", active_config->database_dsn); dbh = gda_connection_open_from_string(NULL, active_config->database_dsn, NULL, GDA_CONNECTION_OPTIONS_THREAD_SAFE, &local_err); if (dbh == NULL) { g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_CANTOPEN, "Can not open databsae (%s): %s", active_config->database_dsn, local_err->message); return FALSE; } parser = gda_sql_parser_new(); g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Database initialization finished."); return TRUE; }
/* * Open a connection to the example.db file */ GdaConnection * open_connection (void) { GdaConnection *cnc; GError *error = NULL; cnc = gda_connection_open_from_string ("SQLite", "DB_DIR=.;DB_NAME=ddl_db", NULL, GDA_CONNECTION_OPTIONS_NONE, &error); if (!cnc) { g_print ("Could not open connection to SQLite database in example_db.db file: %s\n", error && error->message ? error->message : "No detail"); exit (1); } return cnc; }
int main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) { int number_failed = 0; gchar **env; const gchar *cnc_string; GError *error = NULL; env = g_get_environ (); cnc_string = g_environ_getenv (env, "MYSQL_CNC_PARAMS"); if (cnc_string == NULL) { g_message ("No enviroment variable MYSQL_CNC_PARAMS was set. No PostgreSQL provider tests will be performed." "Set this environment variable in order to get access to your server. Example: export MYSQL_CNC_PARAMS=\"DB_NAME=$MYSQL_DB;HOST=$MYSQL_HOST;USERNAME=$MYSQL_USER;PASSWORD=$MYSQL_PASSWORD\""); g_strfreev (env); return EXIT_SUCCESS; } gda_init (); pinfo = gda_config_get_provider_info (PROVIDER); if (!pinfo) { g_warning ("Could not find provider information for %s", PROVIDER); return EXIT_SUCCESS; } g_print ("Provider now tested: %s\n", pinfo->id); cnc = gda_connection_open_from_string (pinfo->id, cnc_string, NULL, GDA_CONNECTION_OPTIONS_NONE, &error); if (cnc == NULL) { g_warning ("Error opening connection: %s", error && error->message ? error->message : "No error was set"); return EXIT_FAILURE; } if (cnc) { number_failed += prov_test_common_check_timestamp (); number_failed += prov_test_common_check_meta_full (); number_failed += prov_test_common_check_meta_partial (); number_failed += prov_test_common_check_meta_partial2 (); number_failed += prov_test_common_check_meta_partial3 (); number_failed += prov_test_common_clean (); } if (! params_provided) return EXIT_SUCCESS; else { g_print ("Test %s\n", (number_failed == 0) ? "Ok" : "failed"); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } }
gboolean __midgard_connection_open( MidgardConnection *mgd, GHashTable **hashtable, gboolean init_schema) { g_return_val_if_fail(mgd != NULL, FALSE); MIDGARD_ERRNO_SET (mgd, MGD_ERR_OK); gchar *host, *dbname, *dbuser, *dbpass, *loglevel, *tmpstr; guint port = 0; gchar *auth = NULL; MidgardConfig *config = mgd->priv->config; host = config->host; dbname = config->database; dbuser = config->dbuser; dbpass = config->dbpass; loglevel = config->loglevel; port = config->dbport; gboolean enable_threads = config->gdathreads; /* Get 30% performance boost for non threaded applications */ if(!enable_threads) g_setenv("LIBGDA_NO_THREADS", "yes", TRUE); /* Initialize libgda */ gda_init (); midgard_connection_set_loglevel(mgd, loglevel, NULL); if(config->priv->dbtype == MIDGARD_DB_TYPE_SQLITE) { gchar *path = NULL; gchar *dbdir = config->dbdir; if (!dbdir || *dbdir == '\0') { const gchar *sqlite_dir[] = {"data", NULL}; path = midgard_core_config_build_path(sqlite_dir, NULL, TRUE); } else { path = g_strdup(dbdir); } tmpstr = g_strconcat("DB_DIR=", path, ";", "DB_NAME=", dbname, NULL); g_free(path); } else if (config->priv->dbtype == MIDGARD_DB_TYPE_ORACLE) { GString *cnc = g_string_sized_new(100); cnc_add_part(cnc, "TNSNAME", dbname, MGD_MYSQL_HOST); cnc_add_part(cnc, "HOST", host, MGD_MYSQL_HOST); cnc_add_part(cnc, "DB_NAME", dbname, MGD_MYSQL_DATABASE); tmpstr = g_string_free(cnc, FALSE); cnc = g_string_sized_new(100); cnc_add_part(cnc, "USERNAME", dbuser, MGD_MYSQL_USERNAME); cnc_add_part(cnc, "PASSWORD", dbpass, MGD_MYSQL_PASSWORD); auth = g_string_free(cnc, FALSE); } else { GString *cnc = g_string_sized_new(100); cnc_add_part(cnc, "HOST", host, MGD_MYSQL_HOST); if (port > 0) { GString *_strp = g_string_new(""); g_string_append_printf (_strp, "%d", port); cnc_add_part (cnc, "PORT", _strp->str, ""); g_string_free (_strp, TRUE); } cnc_add_part(cnc, "DB_NAME", dbname, MGD_MYSQL_DATABASE); tmpstr = g_string_free(cnc, FALSE); GString *auth_str = g_string_sized_new(100); cnc_add_part(auth_str, "USERNAME", dbuser, MGD_MYSQL_USERNAME); cnc_add_part(auth_str, "PASSWORD", dbpass, MGD_MYSQL_PASSWORD); auth = g_string_free(auth_str, FALSE); } GError *error = NULL; GdaConnection *connection = gda_connection_open_from_string( config->dbtype, tmpstr, auth, GDA_CONNECTION_OPTIONS_NONE, &error); g_free(auth); if(connection == NULL) { MIDGARD_ERRNO_SET_STRING (mgd, MGD_ERR_NOT_CONNECTED, " Database [%s]. %s", tmpstr, error->message); g_free(tmpstr); return FALSE; } g_free(tmpstr); mgd->priv->parser = gda_connection_create_parser (connection); if (!mgd->priv->parser) mgd->priv->parser = gda_sql_parser_new(); g_assert (mgd->priv->parser != NULL); mgd->priv->connection = connection; midgard_core_connection_connect_error_callback (mgd); if(init_schema) { if(!g_type_from_name("midgard_quota")) { MidgardSchema *schema = g_object_new(MIDGARD_TYPE_SCHEMA, NULL); gchar *path = g_build_path(G_DIR_SEPARATOR_S, config->sharedir, "MidgardObjects.xml", NULL); midgard_schema_init(schema, (const gchar *)path); g_free(path); midgard_schema_read_dir(schema, config->sharedir); mgd->priv->schema = schema; } } //midgard_connection_set_loglevel(mgd, loglevel, NULL); /* Loads available authentication types */ midgard_core_connection_initialize_auth_types(mgd); g_signal_emit (mgd, MIDGARD_CONNECTION_GET_CLASS (mgd)->signal_id_connected, 0); return TRUE; }
/* * Creates an SQLite .db file from the definitions in @sqlfile */ gboolean create_sqlite_db (const gchar *dir, const gchar *dbname, const gchar *sqlfile, GError **error) { GdaBatch *batch; GdaSqlParser *parser; GdaServerProvider *prov; GdaConnection *cnc; /* create batch */ prov = gda_config_get_provider ("SQLite", NULL); if (!prov) { g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "%s", "Cannot find the SQLite provider"); return FALSE; } parser = gda_server_provider_create_parser (prov, NULL); if (!parser) parser = gda_sql_parser_new (); batch = gda_sql_parser_parse_file_as_batch (parser, sqlfile, error); g_object_unref (parser); if (!batch) return FALSE; /* clean any previous DB file */ gchar *fname, *tmp; tmp = g_strdup_printf ("%s.db", dbname); fname = g_build_filename (dir, tmp, NULL); g_free (tmp); g_unlink (fname); g_free (fname); /* open a connection */ gchar *cnc_string; gchar *edir, *edbname; edir = gda_rfc1738_encode (dir); edbname = gda_rfc1738_encode (dbname); cnc_string = g_strdup_printf ("DB_DIR=%s;DB_NAME=%s", edir, edbname); g_free (edir); g_free (edbname); cnc = gda_connection_open_from_string ("SQLite", cnc_string, NULL, GDA_CONNECTION_OPTIONS_NONE, error); g_free (cnc_string); if (!cnc) { g_object_unref (batch); return FALSE; } /* execute batch */ GSList *list; const GSList *stmt_list; gboolean retval = TRUE; list = gda_connection_batch_execute (cnc, batch, NULL, GDA_STATEMENT_MODEL_RANDOM_ACCESS, error); stmt_list = gda_batch_get_statements (batch); if (g_slist_length (list) != g_slist_length ((GSList *) stmt_list)) retval = FALSE; g_slist_foreach (list, (GFunc) g_object_unref, NULL); g_slist_free (list); g_assert (gda_connection_close (cnc, NULL)); g_object_unref (cnc); g_object_unref (batch); return retval; }
/* * Open a connection */ static GdaConnection* open_connection (const gchar *cnc_string, GError **error) { GdaConnection *cnc = NULL; GdaDsnInfo *info; gchar *user, *pass, *real_cnc, *real_provider, *real_auth_string = NULL; gda_connection_string_split (cnc_string, &real_cnc, &real_provider, &user, &pass); if (!real_cnc) { g_free (user); g_free (pass); g_free (real_provider); g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_DSN_NOT_FOUND_ERROR, "Malformed connection string '%s'", cnc_string); return NULL; } if (ask_pass) { if (user && !*user) { gchar buf[80]; g_print ("\tUsername for '%s': ", cnc_string); if (scanf ("%80s", buf) == -1) { g_free (real_cnc); g_free (user); g_free (pass); g_free (real_provider); g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_DSN_NOT_FOUND_ERROR, "No username for '%s'", cnc_string); return NULL; } g_free (user); user = g_strdup (buf); } if (pass && !*pass) { gchar buf[80]; g_print ("\tPassword for '%s': ", cnc_string); if (scanf ("%80s", buf) == -1) { g_free (real_cnc); g_free (user); g_free (pass); g_free (real_provider); g_set_error (error, GDA_CONNECTION_ERROR, GDA_CONNECTION_DSN_NOT_FOUND_ERROR, "No password for '%s'", cnc_string); return NULL; } g_free (pass); pass = g_strdup (buf); } if (user || pass) { gchar *s1; s1 = gda_rfc1738_encode (user); if (pass) { gchar *s2; s2 = gda_rfc1738_encode (pass); real_auth_string = g_strdup_printf ("USERNAME=%s;PASSWORD=%s", s1, s2); g_free (s2); } else real_auth_string = g_strdup_printf ("USERNAME=%s", s1); g_free (s1); } } info = gda_config_get_dsn_info (real_cnc); if (info && !real_provider) cnc = gda_connection_open_from_dsn (cnc_string, real_auth_string, 0, error); else cnc = gda_connection_open_from_string (NULL, cnc_string, real_auth_string, 0, error); g_free (real_cnc); g_free (user); g_free (pass); g_free (real_provider); g_free (real_auth_string); return cnc; }
int main (int argc, char **argv) { GError *error = NULL; GOptionContext *context; GdaConnection *cnc; gchar *auth_string = NULL; gchar *blob_data; /* command line parsing */ context = g_option_context_new ("Tests opening a connection"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_warning ("Can't parse arguments: %s", error->message); exit (1); } g_option_context_free (context); if (direct && dsn) { g_print ("DSN and connection string are exclusive\n"); exit (1); } if (!direct && !dsn) { g_print ("You must specify a connection to open either as a DSN or a connection string\n"); exit (1); } if (direct && !prov) { g_print ("You must specify a provider when using a connection string\n"); exit (1); } gda_init (); /* open connection */ if (user) { if (pass) auth_string = g_strdup_printf ("USERNAME=%s;PASSWORD=%s", user, pass); else auth_string = g_strdup_printf ("USERNAME=%s", user); } if (dsn) { GdaDsnInfo *info = NULL; info = gda_config_get_dsn_info (dsn); if (!info) g_error (_("DSN '%s' is not declared"), dsn); else { cnc = gda_connection_open_from_dsn (info->name, auth_string ? auth_string : info->auth_string, 0, &error); if (!cnc) { g_warning (_("Can't open connection to DSN %s: %s\n"), info->name, error && error->message ? error->message : "???"); exit (1); } prov = info->provider; } } else { cnc = gda_connection_open_from_string (prov, direct, auth_string, 0, &error); if (!cnc) { g_warning (_("Can't open specified connection: %s\n"), error && error->message ? error->message : "???"); exit (1); } } g_free (auth_string); g_print (_("Connection successfully opened!\n")); parser = gda_connection_create_parser (cnc); gda_connection_begin_transaction (cnc, NULL, GDA_TRANSACTION_ISOLATION_UNKNOWN, NULL); /* * clear all blobs */ if (!clear_blobs (cnc, &error)) g_error ("Blobs clear error: %s", error && error->message ? error->message : "No detail"); /* insert a blob */ blob_data = "Blob Data 1"; if (!insert_blob (cnc, 1, blob_data, strlen (blob_data), &error)) g_error ("Blob insert error: %s", error && error->message ? error->message : "No detail"); else if (error) { g_print ("Msg: %s\n", error->message); g_error_free (error); error = NULL; } /* insert a blob */ blob_data = "Blob Data 2"; if (!insert_blob (cnc, 2, blob_data, strlen (blob_data), &error)) g_error ("Blob insert error: %s", error && error->message ? error->message : "No detail"); else if (error) { g_print ("Msg: %s\n", error->message); g_error_free (error); error = NULL; } if (!display_blobs (cnc, &error)) g_error ("Blobs display error: %s", error && error->message ? error->message : "No detail"); /* update blob */ blob_data = "New blob 1 contents is now this one..."; if (!update_blob (cnc, 1, blob_data, strlen (blob_data), &error)) g_error ("Blob update error: %s", error && error->message ? error->message : "No detail"); else if (error) { g_print ("Msg: %s\n", error->message); g_error_free (error); error = NULL; } if (!display_blobs (cnc, &error)) g_error ("Blobs display error: %s", error && error->message ? error->message : "No detail"); /* update blob */ blob_data = "After several blobs updated"; if (!update_multiple_blobs (cnc, blob_data, strlen (blob_data), &error)) g_error ("Multiple blob update error: %s", error && error->message ? error->message : "No detail"); else if (error) { g_print ("Msg: %s\n", error->message); g_error_free (error); error = NULL; } if (!display_blobs (cnc, &error)) g_error ("Blobs display error: %s", error && error->message ? error->message : "No detail"); /* SQL Postgres: create table blobs (id serial not null primary key, name varchar (50), data oid); SQL Oracle: CREATE TABLE blobs (id number primary key, name varchar2 (50), data BLOB); */ gda_connection_commit_transaction (cnc, NULL, NULL); if (! gda_connection_close (cnc, &error)) g_error ("Can't close connection: %s", error && error->message ? error->message : "No detail"); return 0; }
int main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char** argv) { xmlDocPtr doc; xmlNodePtr root, node; gint failures = 0; gint ntests = 0; gchar *fname; gda_init (); /* open connection */ gchar *cnc_string; fname = g_build_filename (ROOT_DIR, "data", NULL); cnc_string = g_strdup_printf ("DB_DIR=%s;DB_NAME=sales_test", fname); g_free (fname); cnc = gda_connection_open_from_string ("SQLite", cnc_string, NULL, GDA_CONNECTION_OPTIONS_READ_ONLY, NULL); if (!cnc) { g_print ("Failed to open connection, cnc_string = %s\n", cnc_string); exit (1); } if (!gda_connection_update_meta_store (cnc, NULL, NULL)) { g_print ("Failed to update meta store, cnc_string = %s\n", cnc_string); exit (1); } g_free (cnc_string); /* load file */ fname = g_build_filename (ROOT_DIR, "tests", "parser", "testvalid.xml", NULL); if (! g_file_test (fname, G_FILE_TEST_EXISTS)) { g_print ("File '%s' does not exist\n", fname); exit (1); } /* use test data */ doc = xmlParseFile (fname); g_free (fname); g_assert (doc); root = xmlDocGetRootElement (doc); g_assert (!strcmp ((gchar*) root->name, "testdata")); for (node = root->children; node; node = node->next) { if (strcmp ((gchar*) node->name, "test")) continue; xmlNodePtr snode; xmlChar *sql = NULL; xmlChar *id; gboolean valid = FALSE; id = xmlGetProp (node, BAD_CAST "id"); for (snode = node->children; snode; snode = snode->next) { if (!strcmp ((gchar*) snode->name, "sql")) { sql = xmlNodeGetContent (snode); xmlChar *prop; prop = xmlGetProp (snode, (const xmlChar*) "valid"); if (prop) { if ((*prop == 't') || (*prop == 'T') || (*prop == '1')) valid = TRUE; xmlFree (prop); } } } if (sql) { if (!do_test (id, sql, valid)) failures++; ntests++; } /* mem free */ if (sql) xmlFree (sql); if (id) xmlFree (id); } xmlFreeDoc (doc); g_print ("TESTS COUNT: %d\n", ntests); g_print ("FAILURES: %d\n", failures); return failures != 0 ? 1 : 0; }
GdaConnection * test_cnc_open_connection (const gchar *provider, const gchar *dbname, GError **error) { GdaConnection *cnc = NULL; gchar *str, *upname; const gchar *cnc_params; GdaProviderInfo *prov_info; GdaQuarkList *db_quark_list = NULL, *cnc_quark_list = NULL; gboolean db_created = FALSE; g_return_val_if_fail (dbname && *dbname, NULL); prov_info = gda_config_get_provider_info (provider); if (!prov_info) { g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "Provider '%s' not found", provider); return NULL; } /* open connection to database */ upname = prov_name_upcase (prov_info->id); str = g_strdup_printf ("%s_CNC_PARAMS", upname); cnc_params = getenv (str); g_free (str); if (cnc_params) cnc_quark_list = gda_quark_list_new_from_string (cnc_params); if (db_quark_list || cnc_quark_list) { Data1 data; data.string = g_string_new (""); data.ql = NULL; data.requested_db_name = NULL; if (db_quark_list) gda_quark_list_foreach (db_quark_list, (GHFunc) cnc_quark_foreach_func, &data); data.ql = db_quark_list; if (cnc_quark_list) gda_quark_list_foreach (cnc_quark_list, (GHFunc) cnc_quark_foreach_func, &data); if (*(data.string->str) != 0) g_string_append_c (data.string, ';'); g_string_append_printf (data.string, "DB_NAME=%s", data.requested_db_name ? data.requested_db_name : dbname); g_print ("Open connection string: %s\n", data.string->str); gchar *auth_string = NULL; GSList *current = prov_info->auth_params->holders; while (current) { GdaHolder *holder = (GdaHolder *) current->data; const gchar *id = gda_holder_get_id (holder); const gchar *env = NULL; if (g_strrstr (id, "USER") != NULL) { str = g_strdup_printf ("%s_USER", upname); env = getenv (str); g_free (str); } else if (g_strrstr (id, "PASS") != NULL) { str = g_strdup_printf ("%s_PASS", upname); env = getenv (str); g_free (str); } if (env) { str = g_strdup_printf ("%s=%s;", id, env); gchar *tmp = auth_string; auth_string = g_strconcat (auth_string, str, NULL); g_free (str); g_free (tmp); } current = g_slist_next (current); } cnc = gda_connection_open_from_string (prov_info->id, data.string->str, auth_string, GDA_CONNECTION_OPTIONS_NONE, error); g_free (auth_string); g_string_free (data.string, TRUE); } if (db_quark_list) gda_quark_list_free (db_quark_list); if (cnc_quark_list) gda_quark_list_free (cnc_quark_list); if (!cnc_params) g_set_error (error, TEST_ERROR, TEST_ERROR_GENERIC, "Connection parameters not specified, test not executed (define %s_CNC_PARAMS or %s_DBCREATE_PARAMS to create a test DB)\n", upname, upname); g_free (upname); return cnc; }