gchar * gda_postgres_render_CREATE_DB (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; gchar *tmp; string = g_string_new ("CREATE DATABASE "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/DB_DEF_P/DB_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); value = gda_server_operation_get_value_at (op, "/DB_DEF_P/OWNER"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { g_string_append (string, " OWNER "); g_string_append (string, g_value_get_string (value)); } value = gda_server_operation_get_value_at (op, "/DB_DEF_P/TEMPLATE"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { g_string_append (string, " TEMPLATE "); g_string_append (string, g_value_get_string (value)); } value = gda_server_operation_get_value_at (op, "/DB_DEF_P/DB_CSET"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { GdaDataHandler *dh; gchar *str; dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING); str = gda_data_handler_get_sql_from_value (dh, value); if (str) { g_string_append (string, " ENCODING "); g_string_append (string, str); g_free (str); } } value = gda_server_operation_get_value_at (op, "/DB_DEF_P/TABLESPACE"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { g_string_append (string, " TABLESPACE "); g_string_append (string, g_value_get_string (value)); } sql = string->str; g_string_free (string, FALSE); return sql; }
GdaDataModel * gda_mysql_recordset_new_direct (GdaConnection *cnc, GdaDataModelAccessFlags flags, GType *col_types) { GdaMysqlRecordset *model; MysqlConnectionData *cdata; gint i; GdaDataModelAccessFlags rflags; GSList *columns = NULL; g_return_val_if_fail (GDA_IS_CONNECTION (cnc), NULL); cdata = (MysqlConnectionData*) gda_connection_internal_get_provider_data_error (cnc, NULL); if (!cdata) return NULL; /* determine access mode: RANDOM or CURSOR FORWARD are the only supported */ if (flags & GDA_DATA_MODEL_ACCESS_RANDOM) rflags = GDA_DATA_MODEL_ACCESS_RANDOM; else rflags = GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD; /* create data model */ model = g_object_new (GDA_TYPE_MYSQL_RECORDSET, "connection", cnc, "model-usage", rflags, NULL); model->priv->cnc = cnc; g_object_ref (G_OBJECT(cnc)); /* columns & types */ model->priv->ncols = mysql_field_count (cdata->mysql); model->priv->types = g_new0 (GType, model->priv->ncols); /* create columns */ for (i = 0; i < model->priv->ncols; i++) columns = g_slist_prepend (columns, gda_column_new ()); columns = g_slist_reverse (columns); if (col_types) { for (i = 0; ; i++) { if (col_types [i] > 0) { if (col_types [i] == G_TYPE_NONE) break; if (i >= model->priv->ncols) { g_warning (_("Column %d out of range (0-%d), ignoring its specified type"), i, model->priv->ncols - 1); break; } else model->priv->types [i] = col_types [i]; } } } /* fill bind result */ MYSQL_RES *mysql_res = mysql_store_result (cdata->mysql); MYSQL_FIELD *mysql_fields = mysql_fetch_fields (mysql_res); GSList *list; ((GdaDataSelect *) model)->advertized_nrows = mysql_affected_rows (cdata->mysql); for (i=0, list = columns; i < model->priv->ncols; i++, list = list->next) { GdaColumn *column = GDA_COLUMN (list->data); /* use C API to set columns' information using gda_column_set_*() */ MYSQL_FIELD *field = &mysql_fields[i]; GType gtype = model->priv->types [i]; if (gtype == GDA_TYPE_NULL) { gtype = _gda_mysql_type_to_gda (cdata, field->type, field->charsetnr); model->priv->types [i] = gtype; } gda_column_set_g_type (column, gtype); gda_column_set_name (column, field->name); gda_column_set_description (column, field->name); } gda_data_select_set_columns (GDA_DATA_SELECT (model), columns); /* load ALL data */ MYSQL_ROW mysql_row; gint rownum; GdaServerProvider *prov; prov = gda_connection_get_provider (cnc); for (mysql_row = mysql_fetch_row (mysql_res), rownum = 0; mysql_row; mysql_row = mysql_fetch_row (mysql_res), rownum++) { GdaRow *row = gda_row_new (model->priv->ncols); gint col; for (col = 0; col < model->priv->ncols; col++) { gint i = col; GValue *value = gda_row_get_value (row, i); GType type = model->priv->types[i]; char *data = mysql_row[i]; if (!data || (type == GDA_TYPE_NULL)) continue; gda_value_reset_with_type (value, type); if (type == G_TYPE_STRING) g_value_set_string (value, data); else { GdaDataHandler *dh; gboolean valueset = FALSE; dh = gda_server_provider_get_data_handler_g_type (prov, cnc, type); if (dh) { GValue *tmpvalue; tmpvalue = gda_data_handler_get_value_from_str (dh, data, type); if (tmpvalue) { *value = *tmpvalue; g_free (tmpvalue); valueset = TRUE; } } if (!valueset) gda_row_invalidate_value (row, value); } } gda_data_select_take_row ((GdaDataSelect*) model, row, rownum); } mysql_free_result (mysql_res); return GDA_DATA_MODEL (model); }
gchar * gda_postgres_render_CREATE_USER (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; gchar *tmp; gboolean with = FALSE, first, use_role = TRUE; gint nrows, i; PostgresConnectionData *cdata = NULL; if (cnc) { g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE); g_return_val_if_fail (gda_connection_get_provider (cnc) == provider, FALSE); cdata = (PostgresConnectionData*) gda_connection_internal_get_provider_data_error (cnc, error); } if (cdata && (cdata->reuseable->version_float < 8.1)) use_role = FALSE; if (use_role) string = g_string_new ("CREATE ROLE "); else string = g_string_new ("CREATE USER "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/USER_DEF_P/USER_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); value = gda_server_operation_get_value_at (op, "/USER_DEF_P/PASSWORD"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value) && (*g_value_get_string (value))) { GdaDataHandler *dh; const GValue *value2; g_string_append (string, " WITH"); with = TRUE; value2 = gda_server_operation_get_value_at (op, "/USER_DEF_P/PASSWORD_ENCRYPTED"); if (value2 && G_VALUE_HOLDS (value2, G_TYPE_BOOLEAN) && g_value_get_boolean (value2)) g_string_append (string, " ENCRYPTED"); g_string_append (string, " PASSWORD "); dh = gda_server_provider_get_data_handler_g_type (provider, cnc, G_TYPE_STRING); if (!dh) dh = gda_data_handler_get_default (G_TYPE_STRING); tmp = gda_data_handler_get_sql_from_value (dh, value); g_string_append (string, tmp); g_free (tmp); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/UID"); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append_printf (string, "SYSID %u", g_value_get_uint (value)); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_SUPERUSER"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " SUPERUSER"); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_CREATEDB"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " CREATEDB"); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_CREATEROLE"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " CREATEROLE"); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_CREATEUSER"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " CREATEUSER"); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_INHERIT"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " INHERIT"); } else { if (!with) { g_string_append (string, " WITH"); with = TRUE; } g_string_append (string, " NOINHERIT"); } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CAP_LOGIN"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { g_string_append (string, " LOGIN"); value = gda_server_operation_get_value_at (op, "/USER_DEF_P/CNX_LIMIT"); if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) g_string_append_printf (string, " CONNECTION LIMIT %d", g_value_get_int (value)); } nrows = gda_server_operation_get_sequence_size (op, "/GROUPS_S"); for (first = TRUE, i = 0; i < nrows; i++) { gchar *name; if (use_role) name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/GROUPS_S/%d/ROLE", error, i); else name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/GROUPS_S/%d/USER", error, i); if (name) { if (first) { first = FALSE; if (use_role) g_string_append (string, " IN ROLE "); else g_string_append (string, " IN GROUP "); } else g_string_append (string, ", "); g_string_append (string, name); g_free (name); } else { g_string_free (string, TRUE); return NULL; } } nrows = gda_server_operation_get_sequence_size (op, "/ROLES_S"); for (first = TRUE, i = 0; i < nrows; i++) { gchar *name; name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ROLES_S/%d/ROLE", error, i); if (name) { if (first) { first = FALSE; g_string_append (string, " ROLE "); } else g_string_append (string, ", "); g_string_append (string, name); g_free (name); } else { g_string_free (string, TRUE); return NULL; } } nrows = gda_server_operation_get_sequence_size (op, "/ADMINS_S"); for (first = TRUE, i = 0; i < nrows; i++) { gchar *name; name = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/ADMINS_S/%d/ROLE", error, i); if (name) { if (first) { first = FALSE; g_string_append (string, " ADMIN "); } else g_string_append (string, ", "); g_string_append (string, name); g_free (name); } else { g_string_free (string, TRUE); return NULL; } } value = gda_server_operation_get_value_at (op, "/USER_DEF_P/VALIDITY"); if (value && G_VALUE_HOLDS (value, GDA_TYPE_TIMESTAMP)) { if (value) { GdaDataHandler *dh; if (!with) { g_string_append (string, " WITH"); with = TRUE; } dh = gda_server_provider_get_data_handler_g_type (provider, cnc, GDA_TYPE_TIMESTAMP); if (!dh) dh = gda_data_handler_get_default (GDA_TYPE_TIMESTAMP); g_string_append (string, " VALID UNTIL "); tmp = gda_data_handler_get_sql_from_value (dh, value); g_string_append (string, tmp); g_free (tmp); } } sql = string->str; g_string_free (string, FALSE); return sql; }