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; }
gchar * _gda_sqlite_render_DROP_VIEW (G_GNUC_UNUSED 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 ("DROP VIEW"); value = gda_server_operation_get_value_at (op, "/VIEW_DESC_P/VIEW_IFEXISTS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " IF EXISTS"); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/VIEW_DESC_P/VIEW_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append_c (string, ' '); g_string_append (string, tmp); g_free (tmp); sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * gda_postgres_render_DROP_INDEX (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 ("DROP INDEX "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DESC_P/INDEX_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, "/INDEX_DESC_P/REFERENCED_ACTION"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { g_string_append_c (string, ' '); g_string_append (string, g_value_get_string (value)); } sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * _gda_sqlite_render_CREATE_VIEW (G_GNUC_UNUSED GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gboolean allok = TRUE; gchar *sql = NULL; gchar *tmp; string = g_string_new ("CREATE "); value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_TEMP"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "TEMP "); g_string_append (string, "VIEW "); value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_IFNOTEXISTS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "IF NOT EXISTS "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/VIEW_DEF_P/VIEW_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); if (allok) { value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_DEF"); g_assert (value && G_VALUE_HOLDS (value, G_TYPE_STRING)); g_string_append (string, " AS "); g_string_append (string, g_value_get_string (value)); } if (allok) { sql = string->str; g_string_free (string, FALSE); } else { sql = NULL; g_string_free (string, TRUE); } return sql; }
gchar * gda_postgres_render_DROP_USER (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; gchar *tmp; gboolean use_role = TRUE; 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 ("DROP ROLE "); else string = g_string_new ("DROP USER "); value = gda_server_operation_get_value_at (op, "/USER_DESC_P/USER_IFEXISTS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " IF EXISTS"); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/USER_DESC_P/USER_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append_c (string, ' '); g_string_append (string, tmp); g_free (tmp); sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * gda_capi_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, GError **error) { GString *string; const GValue *value; gboolean allok = TRUE; gboolean hasfields = FALSE; gint nrows; gint i; gboolean first; GSList *pkfields = NULL; /* list of GValue* composing the pkey */ gint nbpkfields = 0; gchar *tmp; /* CREATE TABLE */ string = g_string_new ("CREATE TABLE "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME"); g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ("); /* FIELDS */ if (allok) { GdaServerOperationNode *node; node = gda_server_operation_get_node_info (op, "/FIELDS_A"); g_assert (node); /* finding if there is a composed primary key */ nrows = gda_data_model_get_n_rows (node->model); for (i = 0; i < nrows; i++) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FIELDS_A/@COLUMN_NAME/%d", i); pkfields = g_slist_append (pkfields, tmp); nbpkfields++; } } /* manually defined fields */ first = TRUE; for (i = 0; i < nrows; i++) { hasfields = TRUE; if (first) first = FALSE; else g_string_append (string, ", "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FIELDS_A/@COLUMN_NAME/%d", i); g_string_append (string, tmp); g_free (tmp); g_string_append_c (string, ' '); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i); g_string_append (string, g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " DEFAULT "); g_string_append (string, str); } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " NOT NULL"); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " UNIQUE"); if (nbpkfields == 1) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " PRIMARY KEY"); } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " CHECK ("); g_string_append (string, str); g_string_append_c (string, ')'); } } } } /* composed primary key */ if (nbpkfields > 1) { GSList *list; g_string_append (string, ", PRIMARY KEY ("); for (list = pkfields; list; list = list->next) { if (list != pkfields) g_string_append (string, ", "); g_string_append (string, (gchar*) list->data); } g_string_append_c (string, ')'); } g_slist_foreach (pkfields, (GFunc) g_free, NULL); g_slist_free (pkfields); g_string_append (string, ")"); if (!hasfields) { allok = FALSE; g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("Table to create must have at least one row")); } return g_string_free (string, FALSE); }
gchar * _gda_sqlite_render_CREATE_INDEX (G_GNUC_UNUSED GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; GdaServerOperationNode *node; gint nrows, i; gchar *tmp; /* CREATE INDEX */ string = g_string_new ("CREATE "); value = gda_server_operation_get_value_at (op, "/INDEX_DEF_P/INDEX_TYPE"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value) && *g_value_get_string (value)) { g_string_append (string, g_value_get_string (value)); g_string_append_c (string, ' '); } g_string_append (string, "INDEX "); value = gda_server_operation_get_value_at (op, "/INDEX_DEF_P/INDEX_IFNOTEXISTS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " IF NOT EXISTS "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/INDEX_DEF_P/INDEX_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ON "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/INDEX_DEF_P/INDEX_ON_TABLE", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); /* fields or expressions the index is on */ g_string_append (string, " ("); node = gda_server_operation_get_node_info (op, "/INDEX_FIELDS_S"); g_assert (node); nrows = gda_server_operation_get_sequence_size (op, "/INDEX_FIELDS_S"); for (i = 0; i < nrows; i++) { tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/INDEX_FIELDS_S/%d/INDEX_FIELD", error, i); if (tmp) { if (i != 0) g_string_append (string, ", "); g_string_append (string, tmp); g_free (tmp); value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_COLLATE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " COLLATE "); g_string_append (string, str); } } value = gda_server_operation_get_value_at (op, "/INDEX_FIELDS_S/%d/INDEX_SORT_ORDER", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append_c (string, ' '); g_string_append (string, str); } } } else { g_string_free (string, TRUE); return NULL; } } g_string_append (string, ")"); sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * _gda_sqlite_render_ADD_COLUMN (G_GNUC_UNUSED GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; gchar *tmp; /* DROP TABLE */ string = g_string_new ("ALTER TABLE "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/COLUMN_DEF_P/TABLE_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ADD COLUMN "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/COLUMN_DEF_P/COLUMN_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, "/COLUMN_DEF_P/COLUMN_TYPE"); g_assert (value && G_VALUE_HOLDS (value, G_TYPE_STRING)); g_string_append_c (string, ' '); g_string_append (string, g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/COLUMN_DEF_P/COLUMN_SIZE"); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) { g_string_append_printf (string, "(%d", g_value_get_uint (value)); value = gda_server_operation_get_value_at (op, "/COLUMN_DEF_P/COLUMN_SCALE"); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) g_string_append_printf (string, ",%d)", g_value_get_uint (value)); else g_string_append (string, ")"); } value = gda_server_operation_get_value_at (op, "/COLUMN_DEF_P/COLUMN_DEFAULT"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " DEFAULT "); g_string_append (string, str); } } value = gda_server_operation_get_value_at (op, "/COLUMN_DEF_P/COLUMN_NNUL"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " NOT NULL"); value = gda_server_operation_get_value_at (op, "/COLUMN_DEF_P/COLUMN_CHECK"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " CHECK ("); g_string_append (string, str); g_string_append_c (string, ')'); } } sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * _gda_sqlite_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, GError **error) { g_return_val_if_fail (provider, NULL); g_return_val_if_fail (cnc, NULL); g_return_val_if_fail (op, NULL); g_return_val_if_fail (gda_server_operation_get_op_type (op) == GDA_SERVER_OPERATION_CREATE_TABLE, NULL); GString *string; const GValue *value; const GValue *value1; gboolean allok = TRUE; gboolean hasfields = FALSE; gint nrows; gint i; gboolean first; GSList *pkfields = NULL; /* list of GValue* composing the pkey */ gint nbpkfields = 0; gchar *sql = NULL; gchar *conflict_algo = NULL; gchar *tmp; /* CREATE TABLE */ string = g_string_new ("CREATE "); value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_TEMP"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "TEMP "); g_string_append (string, "TABLE "); value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_IFNOTEXISTS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "IF NOT EXISTS "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/TABLE_DEF_P/TABLE_NAME", error); if (!tmp) { g_string_free (string, TRUE); if (error != NULL) { if (*error == NULL) { g_warning (_("Internal error, creating table in SQLite provider")); } } return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ("); GdaServerOperationNode *node; /* FIELDS */ if (allok) { node = gda_server_operation_get_node_info (op, "/FIELDS_A"); if (node == NULL) { g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("No fields are defined for CREATE TABLE operation")); return NULL; } /* finding if there is a composed primary key */ nrows = gda_data_model_get_n_rows (node->model); for (i = 0; i < nrows; i++) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/FIELDS_A/@COLUMN_NAME/%d", error, i); if (!tmp) { g_string_free (string, TRUE); g_assert (*error != NULL); return NULL; } pkfields = g_slist_append (pkfields, tmp); nbpkfields++; } } /* manually defined fields */ first = TRUE; for (i = 0; i < nrows; i++) { gboolean pkautoinc = FALSE; hasfields = TRUE; if (first) first = FALSE; else g_string_append (string, ", "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/FIELDS_A/@COLUMN_NAME/%d", error, i); if (!tmp) { g_string_free (string, TRUE); g_assert (*error != NULL); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append_c (string, ' '); if (nbpkfields == 1) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { const gchar *tmp; value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i); tmp = g_value_get_string (value); if (!g_ascii_strcasecmp (tmp, "gint") || !g_ascii_strcasecmp (tmp, "int")) { g_string_append (string, "INTEGER PRIMARY KEY AUTOINCREMENT"); pkautoinc = TRUE; } } } if (!pkautoinc) { value1 = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i); g_string_append (string, g_value_get_string (value1)); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) { g_string_append_printf (string, "(%d", g_value_get_uint (value)); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) g_string_append_printf (string, ",%d)", g_value_get_uint (value)); else g_string_append (string, ")"); } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " DEFAULT "); const gchar* valtmp = g_value_get_string (value1); if (!g_ascii_strcasecmp (valtmp,"string") || !g_ascii_strcasecmp (valtmp,"gchararray")) { g_string_append_c (string,'\''); g_string_append (string, str); g_string_append_c (string,'\''); } else { g_string_append (string, str); } } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " NOT NULL"); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " UNIQUE"); if (nbpkfields == 1) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { g_string_append (string, " PRIMARY KEY"); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CONFLICT/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " ON CONFLICT "); g_string_append (string, str); } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { g_string_append (string, " AUTOINCREMENT"); } } } else { if (!conflict_algo) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CONFLICT/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) conflict_algo = g_strdup (str); } } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " CHECK ("); g_string_append (string, str); g_string_append_c (string, ')'); } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_COLLATE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " COLLATE "); g_string_append (string, str); } } } } } /* composed primary key */ if (nbpkfields > 1) { GSList *list; g_string_append (string, ", PRIMARY KEY ("); for (list = pkfields; list; list = list->next) { if (list != pkfields) g_string_append (string, ", "); g_string_append (string, (gchar *) list->data); } g_string_append_c (string, ')'); if (conflict_algo) { g_string_append (string, " ON CONFLICT "); g_string_append (string, conflict_algo); } } g_slist_free_full (pkfields, (GDestroyNotify) g_free); node = gda_server_operation_get_node_info (op, "/FKEY_S"); if (node) { nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S"); for (i = 0; i < nrows; i++) { gint nbfields = 0, j; g_string_append (string, ", FOREIGN KEY ("); node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i); if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) { g_string_free (string, TRUE); g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("No field specified in foreign key constraint")); return NULL; } else { for (j = 0; j < nbfields; j++) { if (j != 0) g_string_append (string, ", "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d", error, i, j); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } } g_string_append (string, ") REFERENCES "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/FKEY_S/%d/FKEY_REF_TABLE", error, i); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } g_string_append (string, " ("); for (j = 0; j < nbfields; j++) { if (j != 0) g_string_append (string, ", "); tmp = gda_connection_operation_get_sql_identifier_at (cnc, op, "/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d", error, i, j); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } g_string_append_c (string, ')'); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " %s", g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " ON UPDATE %s", g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " ON DELETE %s", g_value_get_string (value)); } } g_free (conflict_algo); g_string_append (string, ")"); if (!hasfields) { allok = FALSE; g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("Table to create must have at least one field")); g_string_free (string, TRUE); return NULL; } sql = string->str; g_string_free (string, FALSE); #ifdef GDA_DEBUG g_print ("Renderer SQL for SQLite: %s\n", sql); #endif return sql; }
static void assistant_applied_cb (GtkAssistant *assist, G_GNUC_UNUSED gpointer data) { gboolean allok = TRUE; GString *cnc_string = NULL; GdauiDsnAssistant *assistant = (GdauiDsnAssistant *) assist; g_return_if_fail (GDAUI_IS_DSN_ASSISTANT (assistant)); /* clear the internal dsn_info */ if (assistant->priv->dsn_info) { data_source_info_free (assistant->priv->dsn_info); assistant->priv->dsn_info = NULL; } /* New database creation first */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->choose_toggle))) { if (!gda_server_operation_is_valid (assistant->priv->create_db_op, NULL, NULL)) { _gdaui_utility_show_error (NULL, _("Missing mandatory information, to create database")); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } else { GdaProviderInfo *prov_info; GSList *dsn_params; GError *error = NULL; allok = gda_server_operation_perform_create_database (assistant->priv->create_db_op, NULL, &error); if (!allok) { gchar *str; str = g_strdup_printf (_("Error creating database: %s"), error && error->message ? error->message : _("Unknown error")); _gdaui_utility_show_error (NULL, str); g_free (str); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } /* make the connection string for the data source */ prov_info = gda_config_get_provider_info (gdaui_provider_selector_get_provider (GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); g_return_if_fail (prov_info); for (dsn_params = prov_info->dsn_params->holders; dsn_params; dsn_params = dsn_params->next) { GdaHolder *param = GDA_HOLDER (dsn_params->data); const GValue *value; value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/DB_DEF_P/%s", gda_holder_get_id (param)); if (!value) value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/SERVER_CNX_P/%s", gda_holder_get_id (param)); if (value && !gda_value_is_null ((GValue *) value)) { gchar *str; if (dsn_params == prov_info->dsn_params->holders) cnc_string = g_string_new (""); else g_string_append (cnc_string, ";"); str = gda_value_stringify ((GValue *) value); g_string_append_printf (cnc_string, "%s=%s", gda_holder_get_id (param), str); g_free (str); } } } } /* Data source declaration */ if (allok) { assistant->priv->dsn_info = g_new0 (GdaDsnInfo, 1); assistant->priv->dsn_info->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_name))); assistant->priv->dsn_info->provider = g_strdup ( gdaui_provider_selector_get_provider ( GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); if (cnc_string) { assistant->priv->dsn_info->cnc_string = cnc_string->str; g_string_free (cnc_string, FALSE); } else assistant->priv->dsn_info->cnc_string = _gdaui_provider_spec_editor_get_specs (GDAUI_PROVIDER_SPEC_EDITOR (assistant->priv->provider_detail)); assistant->priv->dsn_info->description = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_description))); assistant->priv->dsn_info->auth_string = NULL; if (assistant->priv->auth_detail) assistant->priv->dsn_info->auth_string = _gdaui_provider_auth_editor_get_auth (GDAUI_PROVIDER_AUTH_EDITOR (assistant->priv->auth_detail)); if (gda_config_can_modify_system_config ()) assistant->priv->dsn_info->is_system = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->general_is_system)); else assistant->priv->dsn_info->is_system = FALSE; } /* notify listeners */ g_signal_emit (G_OBJECT (assistant), config_assistant_signals[FINISHED], 0, !allok); }
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; }
gchar * gda_postgres_render_CREATE_VIEW (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 "); value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_OR_REPLACE"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "OR REPLACE "); value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_TEMP"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "TEMP "); g_string_append (string, "VIEW "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/VIEW_DEF_P/VIEW_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); GdaServerOperationNode *node; node = gda_server_operation_get_node_info (op, "/FIELDS_A"); if (node) { gint i, nrows; GString *cols = NULL; nrows = gda_data_model_get_n_rows (node->model); for (i = 0; i < nrows; i++) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FIELDS_A/@COLUMN_NAME/%d", error, i); if (!tmp) { g_string_free (string, TRUE); return NULL; } if (cols) g_string_append (cols, ", "); g_string_append (cols, tmp); g_string_append_c (cols, ' '); g_free (tmp); } if (cols) { g_string_append_c (cols, ')'); g_string_append (string, cols->str); g_string_free (cols, TRUE); } } value = gda_server_operation_get_value_at (op, "/VIEW_DEF_P/VIEW_DEF"); g_assert (value && G_VALUE_HOLDS (value, G_TYPE_STRING)); g_string_append (string, " AS "); g_string_append (string, g_value_get_string (value)); sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * gda_postgres_render_CREATE_INDEX (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, G_GNUC_UNUSED GError **error) { GString *string; const GValue *value; gchar *sql = NULL; GdaServerOperationNode *node; gint nrows, i; gchar *tmp; string = g_string_new ("CREATE "); value = gda_server_operation_get_value_at (op, "/INDEX_DEF_P/INDEX_TYPE"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value) && *g_value_get_string (value)) { g_string_append (string, g_value_get_string (value)); g_string_append_c (string, ' '); } g_string_append (string, "INDEX "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ON "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_DEF_P/INDEX_ON_TABLE", 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, "/INDEX_DEF_P/INDEX_METHOD"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { g_string_append (string, " USING "); g_string_append (string, g_value_get_string (value)); } /* fields or expressions the index is on */ g_string_append (string, " ("); node = gda_server_operation_get_node_info (op, "/INDEX_FIELDS_S"); g_assert (node); nrows = gda_server_operation_get_sequence_size (op, "/INDEX_FIELDS_S"); for (i = 0; i < nrows; i++) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/INDEX_FIELDS_S/%d/INDEX_FIELD", error, i); if (tmp) { if (i != 0) g_string_append (string, ", "); g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } g_string_append (string, ")"); /* options */ value = gda_server_operation_get_value_at (op, "/INDEX_DEF_P/INDEX_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)); } value = gda_server_operation_get_value_at (op, "/INDEX_DEF_P/INDEX_PREDICATE"); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) { g_string_append (string, " WHERE "); g_string_append (string, g_value_get_string (value)); } sql = string->str; g_string_free (string, FALSE); return sql; }
gchar * gda_postgres_render_CREATE_TABLE (GdaServerProvider *provider, GdaConnection *cnc, GdaServerOperation *op, GError **error) { GString *string; const GValue *value; gboolean hasfields = FALSE; gint nrows; gint i; gboolean first; GSList *pkfields = NULL; /* list of GValue* composing the pkey */ gint nbpkfields = 0; gchar *sql = NULL; gchar *tmp; string = g_string_new ("CREATE "); value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_TEMP"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "TEMP "); g_string_append (string, "TABLE "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_DEF_P/TABLE_NAME", error); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append (string, " ("); /* FIELDS */ GdaServerOperationNode *node; node = gda_server_operation_get_node_info (op, "/FIELDS_A"); g_assert (node); /* finding if there is a composed primary key */ nrows = gda_data_model_get_n_rows (node->model); for (i = 0; i < nrows; i++) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FIELDS_A/@COLUMN_NAME/%d", error, i); if (!tmp) { g_string_free (string, TRUE); return NULL; } pkfields = g_slist_append (pkfields, tmp); nbpkfields ++; } } /* manually defined fields */ first = TRUE; for (i = 0; i < nrows; i++) { hasfields = TRUE; if (first) first = FALSE; else g_string_append (string, ", "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FIELDS_A/@COLUMN_NAME/%d", error, i); if (!tmp) { g_string_free (string, TRUE); return NULL; } g_string_append (string, tmp); g_free (tmp); g_string_append_c (string, ' '); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_AUTOINC/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, "serial"); else { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_TYPE/%d", i); g_string_append (string, g_value_get_string (value)); } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SIZE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) { g_string_append_printf (string, "(%d", g_value_get_uint (value)); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_SCALE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_UINT)) g_string_append_printf (string, ",%d)", g_value_get_uint (value)); else g_string_append (string, ")"); } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_DEFAULT/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " DEFAULT "); g_string_append (string, str); } } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_NNUL/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " NOT NULL"); value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_UNIQUE/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " UNIQUE"); if (nbpkfields == 1) { value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_PKEY/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " PRIMARY KEY"); } value = gda_server_operation_get_value_at (op, "/FIELDS_A/@COLUMN_CHECK/%d", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING)) { const gchar *str = g_value_get_string (value); if (str && *str) { g_string_append (string, " CHECK ("); g_string_append (string, str); g_string_append_c (string, ')'); } } } /* LIKE inheritance */ nrows = gda_server_operation_get_sequence_size (op, "/TABLE_PARENTS_S"); for (i = 0; i < nrows; i++) { value = gda_server_operation_get_value_at (op, "/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && !g_value_get_boolean (value)) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE", error, i); if (!tmp) { g_string_free (string, TRUE); return NULL; } hasfields = TRUE; if (first) first = FALSE; else g_string_append (string, ", "); g_string_append (string, "LIKE "); g_string_append (string, tmp); value = gda_server_operation_get_value_at (op, "/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY_DEFAULTS", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " INCLUDING DEFAULTS"); g_free (tmp); } } /* composed primary key */ if (nbpkfields > 1) { GSList *list; g_string_append (string, ", PRIMARY KEY ("); for (list = pkfields; list; list = list->next) { if (list != pkfields) g_string_append (string, ", "); g_string_append (string, (gchar*) list->data); } g_string_append_c (string, ')'); } g_slist_foreach (pkfields, (GFunc) g_free, NULL); g_slist_free (pkfields); /* foreign keys */ first = TRUE; node = gda_server_operation_get_node_info (op, "/FKEY_S"); if (node) { nrows = gda_server_operation_get_sequence_size (op, "/FKEY_S"); for (i = 0; i < nrows; i++) { gint nbfields = 0; gint j; g_string_append (string, ", FOREIGN KEY ("); node = gda_server_operation_get_node_info (op, "/FKEY_S/%d/FKEY_FIELDS_A", i); if (!node || ((nbfields = gda_data_model_get_n_rows (node->model)) == 0)) { g_string_free (string, TRUE); g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("No field specified in foreign key constraint")); return NULL; } else { for (j = 0; j < nbfields; j++) { if (j != 0) g_string_append (string, ", "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FKEY_S/%d/FKEY_FIELDS_A/@FK_FIELD/%d", error, i, j); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } } g_string_append (string, ") REFERENCES "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FKEY_S/%d/FKEY_REF_TABLE", error, i); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } g_string_append (string, " ("); for (j = 0; j < nbfields; j++) { if (j != 0) g_string_append (string, ", "); tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/FKEY_S/%d/FKEY_FIELDS_A/@FK_REF_PK_FIELD/%d", error, i, j); if (tmp) { g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } g_string_append_c (string, ')'); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_MATCH_TYPE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " %s", g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONUPDATE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " ON UPDATE %s", g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_ONDELETE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " ON DELETE %s", g_value_get_string (value)); value = gda_server_operation_get_value_at (op, "/FKEY_S/%d/FKEY_DEFERRABLE", i); if (value && G_VALUE_HOLDS (value, G_TYPE_STRING) && g_value_get_string (value)) g_string_append_printf (string, " %s", g_value_get_string (value)); } } g_string_append (string, ")"); /* INHERITS */ first = TRUE; nrows = gda_server_operation_get_sequence_size (op, "/TABLE_PARENTS_S"); for (i = 0; i < nrows; i++) { value = gda_server_operation_get_value_at (op, "/TABLE_PARENTS_S/%d/TABLE_PARENT_COPY", i); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) { tmp = gda_server_operation_get_sql_identifier_at (op, cnc, provider, "/TABLE_PARENTS_S/%d/TABLE_PARENT_TABLE", error, i); if (tmp) { hasfields = TRUE; if (first) { g_string_append (string, " INHERITS "); first = FALSE; } else g_string_append (string, ", "); g_string_append (string, tmp); g_free (tmp); } else { g_string_free (string, TRUE); return NULL; } } } if (!hasfields) { g_string_free (string, TRUE); g_set_error (error, GDA_SERVER_OPERATION_ERROR, GDA_SERVER_OPERATION_INCORRECT_VALUE_ERROR, "%s", _("Table to create must have at least one row")); return NULL; } value = gda_server_operation_get_value_at (op, "/TABLE_DEF_P/TABLE_WITH_OIDS"); if (value && G_VALUE_HOLDS (value, G_TYPE_BOOLEAN) && g_value_get_boolean (value)) g_string_append (string, " WITH OIDS"); sql = string->str; g_string_free (string, FALSE); return sql; }