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_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; }
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_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; }
static void extract_named_parameters (GdaServerOperation *op, const gchar *root_path, GtkTextBuffer *tbuffer) { GdaServerOperationNode *node; GtkTextIter iter; gchar *str; node = gda_server_operation_get_node_info (op, root_path); g_return_if_fail (node); gtk_text_buffer_get_end_iter (tbuffer, &iter); gtk_text_buffer_insert (tbuffer, &iter, " * ", -1); if (node->status == GDA_SERVER_OPERATION_STATUS_REQUIRED) gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, root_path, -1, "req_pathname", NULL); else gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, root_path, -1, "opt_pathname", NULL); gtk_text_buffer_insert (tbuffer, &iter, " (", -1); switch (node->type) { case GDA_SERVER_OPERATION_NODE_PARAMLIST: { GSList *params; str = g_strdup_printf ("GdaSet @%p)\n", node->plist); gtk_text_buffer_insert (tbuffer, &iter, str, -1); g_free (str); for (params = node->plist->holders; params; params = params->next) { gchar *npath; npath = g_strdup_printf ("%s/%s", root_path, gda_holder_get_id (GDA_HOLDER (params->data))); extract_named_parameters (op, npath, tbuffer); g_free (npath); } break; } case GDA_SERVER_OPERATION_NODE_DATA_MODEL: { gint i, ncols; str = g_strdup_printf ("GdaDataModel @%p)\n", node->model); gtk_text_buffer_insert (tbuffer, &iter, str, -1); g_free (str); ncols = gda_data_model_get_n_columns (node->model); for (i = 0; i < ncols; i++) { GdaColumn *col = gda_data_model_describe_column (node->model, i); gchar *npath, *str; g_object_get (G_OBJECT (col), "id", &str, NULL); npath = g_strdup_printf ("%s/@%s", root_path, str); g_free (str); extract_named_parameters (op, npath, tbuffer); g_free (npath); } break; } case GDA_SERVER_OPERATION_NODE_PARAM: { gchar *str; const GValue *value; gtk_text_buffer_insert (tbuffer, &iter, "GdaHolder) = ", -1); value = gda_holder_get_value (node->param); str = gda_value_stringify (value); gtk_text_buffer_insert (tbuffer, &iter, str, -1); gtk_text_buffer_insert (tbuffer, &iter, "\n", -1); g_free (str); break; } case GDA_SERVER_OPERATION_NODE_SEQUENCE: { gtk_text_buffer_insert (tbuffer, &iter, "Sequence)\n", -1); guint i, size = gda_server_operation_get_sequence_size (op, root_path); for (i = 0; i < size; i++) { gchar **names; names = gda_server_operation_get_sequence_item_names (op, root_path); guint n; for (n = 0; names [n]; n++) { gchar *npath; npath = g_strdup_printf ("%s/%u%s", root_path, i, names [n]); extract_named_parameters (op, npath, tbuffer); g_free (npath); } g_strfreev (names); } break; } case GDA_SERVER_OPERATION_NODE_SEQUENCE_ITEM: gtk_text_buffer_insert (tbuffer, &iter, "Sequence item)\n", -1); break; case GDA_SERVER_OPERATION_NODE_DATA_MODEL_COLUMN: { gint j, nrows; gtk_text_buffer_insert (tbuffer, &iter, "Model column)\n", -1); nrows = gda_data_model_get_n_rows (node->model); for (j = 0; j < nrows; j++) { gchar *npath, *str; const GValue *value; npath = g_strdup_printf ("%s/%d", root_path, j); value = gda_data_model_get_value_at (node->model, gda_column_get_position (node->column), j, NULL); if (value) str = gda_value_stringify (value); else str = g_strdup ("Error: could not read data model's value"); gtk_text_buffer_insert (tbuffer, &iter, " * ", -1); gtk_text_buffer_insert_with_tags_by_name (tbuffer, &iter, npath, -1, "opt_pathname", NULL); g_free (npath); gtk_text_buffer_insert (tbuffer, &iter, " (GValue) = ", -1); gtk_text_buffer_insert (tbuffer, &iter, str, -1); gtk_text_buffer_insert (tbuffer, &iter, "\n", -1); g_free (str); } break; } default: gtk_text_buffer_insert (tbuffer, &iter, "???", -1); break; } }