[libgda] Use a constructor for GdaDataModelImport
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Use a constructor for GdaDataModelImport
- Date: Mon, 11 Nov 2013 20:49:30 +0000 (UTC)
commit 8a32caf000723f37c925599ccb7118d25e72bd9f
Author: Vivien Malerba <malerba gnome-db org>
Date: Mon Nov 11 13:53:40 2013 +0100
Use a constructor for GdaDataModelImport
libgda/gda-data-model-import.c | 418 ++++++++++++++++++++++------------------
1 files changed, 229 insertions(+), 189 deletions(-)
---
diff --git a/libgda/gda-data-model-import.c b/libgda/gda-data-model-import.c
index 5940f87..3655384 100644
--- a/libgda/gda-data-model-import.c
+++ b/libgda/gda-data-model-import.c
@@ -146,6 +146,9 @@ enum
#define CSV_DATA_BUFFER_SIZE 2048
static void gda_data_model_import_class_init (GdaDataModelImportClass *klass);
+static GObject *gda_data_model_import_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties);
static void gda_data_model_import_init (GdaDataModelImport *model,
GdaDataModelImportClass *klass);
static void gda_data_model_import_dispose (GObject *object);
@@ -294,6 +297,7 @@ gda_data_model_import_class_init (GdaDataModelImportClass *klass)
G_PARAM_CONSTRUCT));
/* virtual functions */
+ object_class->constructor = gda_data_model_import_constructor;
object_class->dispose = gda_data_model_import_dispose;
object_class->finalize = gda_data_model_import_finalize;
}
@@ -350,6 +354,226 @@ gda_data_model_import_init (GdaDataModelImport *model, G_GNUC_UNUSED GdaDataMode
model->priv->strict = FALSE;
}
+static void init_csv_import (GdaDataModelImport *model);
+static void init_xml_import (GdaDataModelImport *model);
+static void init_node_import (GdaDataModelImport *model);
+
+static GObject *
+gda_data_model_import_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GObject *object;
+
+ /* construct parent */
+ object = G_OBJECT_CLASS (parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties);
+
+ /* parse construct properties */
+ GdaDataModelImport *model;
+ guint i;
+ model = GDA_DATA_MODEL_IMPORT (object);
+ for (i = 0; i< n_construct_properties; i++) {
+ GObjectConstructParam *prop = &(construct_properties[i]);
+ if (!strcmp (g_param_spec_get_name (prop->pspec), "random-access")) {
+ model->priv->random_access = g_value_get_boolean (prop->value);
+ if (model->priv->format == FORMAT_XML_NODE)
+ model->priv->random_access = TRUE;
+ }
+ else if (!strcmp (g_param_spec_get_name (prop->pspec), "filename")) {
+ const gchar *string;
+ string = g_value_get_string (prop->value);
+ if (!string)
+ continue;
+
+ model->priv->is_mapped = TRUE;
+ model->priv->src.mapped.filename = g_strdup (g_value_get_string (prop->value));
+
+ /* file opening */
+ model->priv->src.mapped.fd = open (model->priv->src.mapped.filename, O_RDONLY); /*
Flawfinder: ignore */
+ if (model->priv->src.mapped.fd < 0) {
+ /* error */
+ add_error (model, strerror(errno));
+ continue;
+ }
+
+ /* file mmaping */
+ struct stat _stat;
+
+ if (fstat (model->priv->src.mapped.fd, &_stat) < 0) {
+ /* error */
+ add_error (model, strerror(errno));
+ continue;
+ }
+ model->priv->src.mapped.length = _stat.st_size;
+#ifndef G_OS_WIN32
+ model->priv->src.mapped.start = mmap (NULL, model->priv->src.mapped.length,
+ PROT_READ, MAP_PRIVATE,
+ model->priv->src.mapped.fd, 0);
+ if (model->priv->src.mapped.start == MAP_FAILED) {
+ /* error */
+ add_error (model, strerror(errno));
+ model->priv->src.mapped.start = NULL;
+ continue;
+ }
+#else
+ HANDLE hFile = CreateFile (model->priv->src.mapped.filename,
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (!hFile) {
+ LPVOID lpMsgBuf;
+ DWORD dw = GetLastError();
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL);
+ add_error (model, (gchar *)lpMsgBuf);
+ continue;
+ }
+ HANDLE view = CreateFileMapping(hFile,
+ NULL, PAGE_READONLY|SEC_COMMIT, 0,0 , NULL);
+ if (!view) {
+ /* error */
+ LPVOID lpMsgBuf;
+ DWORD dw = GetLastError();
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL);
+ add_error (model, (gchar *)lpMsgBuf);
+ continue;
+ }
+ model->priv->src.mapped.start = MapViewOfFile(view, FILE_MAP_READ, 0, 0,
+ model->priv->src.mapped.length);
+ if (!model->priv->src.mapped.start) {
+ /* error */
+ LPVOID lpMsgBuf;
+ DWORD dw = GetLastError();
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL);
+ add_error (model, (gchar *)lpMsgBuf);
+ continue;
+ }
+#endif
+ model->priv->data_start = model->priv->src.mapped.start;
+ model->priv->data_length = model->priv->src.mapped.length;
+ }
+ else if (!strcmp (g_param_spec_get_name (prop->pspec), "data-string")) {
+ const gchar *string;
+ string = g_value_get_string (prop->value);
+ if (!string)
+ continue;
+ model->priv->is_mapped = FALSE;
+ model->priv->src.string = g_strdup (g_value_get_string (prop->value));
+ model->priv->data_start = model->priv->src.string;
+ model->priv->data_length = strlen (model->priv->src.string);
+ }
+ else if (!strcmp (g_param_spec_get_name (prop->pspec), "xml-node")) {
+ gpointer data = g_value_get_pointer (prop->value);
+ if (!data)
+ continue;
+ model->priv->format = FORMAT_XML_NODE;
+ model->priv->extract.node.node = data;
+ }
+ else if (!strcmp (g_param_spec_get_name (prop->pspec), "options")) {
+ if (model->priv->options)
+ g_object_unref(model->priv->options);
+
+ model->priv->options = g_value_get_object (prop->value);
+ if (model->priv->options) {
+ if (!GDA_IS_SET (model->priv->options)) {
+ g_warning (_("\"options\" property is not a GdaSet object"));
+ model->priv->options = NULL;
+ }
+ else
+ g_object_ref (model->priv->options);
+ }
+ }
+ else if (!strcmp (g_param_spec_get_name (prop->pspec), "strict")) {
+ model->priv->strict = g_value_get_boolean (prop->value);
+ }
+ }
+
+ if (model->priv->errors)
+ return object;
+
+ /* finish construction */
+ /* determine the real kind of data (CVS text of XML) */
+ if (model->priv->format != FORMAT_XML_NODE
+ && model->priv->data_start) {
+ if (!strncmp (model->priv->data_start, "<?xml", 5))
+ model->priv->format = FORMAT_XML_DATA;
+ else
+ model->priv->format = FORMAT_CSV;
+ }
+
+ /* analyze common options and init */
+ if (! model->priv->init_done) {
+ model->priv->init_done = TRUE;
+ switch (model->priv->format) {
+ case FORMAT_XML_DATA:
+ init_xml_import (model);
+ break;
+
+ case FORMAT_CSV:
+ model->priv->extract.csv.quote = '"';
+ if (model->priv->options) {
+ const gchar *option;
+ option = find_option_as_string (model, "ENCODING");
+ if (option)
+ model->priv->extract.csv.encoding = g_strdup (option);
+ option = find_option_as_string (model, "SEPARATOR");
+ if (option)
+ model->priv->extract.csv.delimiter = *option;
+ model->priv->extract.csv.quote = '"';
+ option = find_option_as_string (model, "QUOTE");
+ if (option)
+ model->priv->extract.csv.quote = *option;
+ }
+ init_csv_import (model);
+ break;
+
+ case FORMAT_XML_NODE:
+ model->priv->random_access = TRUE;
+ init_node_import (model);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ /* for random access, create a new GdaDataModelArray model and copy the contents
+ from this model */
+ if (model->priv->random_access && model->priv->columns && !model->priv->random_access_model) {
+ GdaDataModel *ramodel;
+
+ ramodel = gda_data_access_wrapper_new ((GdaDataModel *) model);
+ model->priv->random_access_model = ramodel;
+ }
+ }
+
+ return object;
+}
+
+
static void
csv_free_stored_rows (GdaDataModelImport *model)
{
@@ -516,10 +740,6 @@ find_option_as_boolean (GdaDataModelImport *model, const gchar *pname, gboolean
return defaults;
}
-static void init_csv_import (GdaDataModelImport *model);
-static void init_xml_import (GdaDataModelImport *model);
-static void init_node_import (GdaDataModelImport *model);
-
static void
gda_data_model_import_set_property (GObject *object,
guint param_id,
@@ -532,138 +752,13 @@ gda_data_model_import_set_property (GObject *object,
model = GDA_DATA_MODEL_IMPORT (object);
if (model->priv) {
switch (param_id) {
- case PROP_RANDOM_ACCESS:
- model->priv->random_access = g_value_get_boolean (value);
- if (model->priv->format == FORMAT_XML_NODE)
- model->priv->random_access = TRUE;
- return;
- break;
- case PROP_FILENAME:
- string = g_value_get_string (value);
- if (!string)
- return;
- model->priv->is_mapped = TRUE;
- model->priv->src.mapped.filename = g_strdup (g_value_get_string (value));
-
- /* file opening */
- model->priv->src.mapped.fd = open (model->priv->src.mapped.filename, O_RDONLY); /*
Flawfinder: ignore */
- if (model->priv->src.mapped.fd < 0) {
- /* error */
- add_error (model, strerror(errno));
- return;
- }
- else {
- /* file mmaping */
- struct stat _stat;
-
- if (fstat (model->priv->src.mapped.fd, &_stat) < 0) {
- /* error */
- add_error (model, strerror(errno));
- return;
- }
- model->priv->src.mapped.length = _stat.st_size;
-#ifndef G_OS_WIN32
- model->priv->src.mapped.start = mmap (NULL, model->priv->src.mapped.length,
- PROT_READ, MAP_PRIVATE,
- model->priv->src.mapped.fd, 0);
- if (model->priv->src.mapped.start == MAP_FAILED) {
- /* error */
- add_error (model, strerror(errno));
- model->priv->src.mapped.start = NULL;
- return;
- }
-#else
- HANDLE hFile = CreateFile (model->priv->src.mapped.filename,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (!hFile) {
- LPVOID lpMsgBuf;
- DWORD dw = GetLastError();
- FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL);
- add_error (model, (gchar *)lpMsgBuf);
- return;
- }
- HANDLE view = CreateFileMapping(hFile,
- NULL, PAGE_READONLY|SEC_COMMIT, 0,0 , NULL);
- if (!view) {
- /* error */
- LPVOID lpMsgBuf;
- DWORD dw = GetLastError();
- FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL);
- add_error (model, (gchar *)lpMsgBuf);
- return;
- }
- model->priv->src.mapped.start = MapViewOfFile(view, FILE_MAP_READ, 0, 0,
- model->priv->src.mapped.length);
- if (!model->priv->src.mapped.start) {
- /* error */
- LPVOID lpMsgBuf;
- DWORD dw = GetLastError();
- FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL);
- add_error (model, (gchar *)lpMsgBuf);
- return;
- }
-#endif
- model->priv->data_start = model->priv->src.mapped.start;
- model->priv->data_length = model->priv->src.mapped.length;
- }
- break;
+ case PROP_OPTIONS:
+ case PROP_XML_NODE:
case PROP_DATA_STRING:
- string = g_value_get_string (value);
- if (!string)
- return;
- model->priv->is_mapped = FALSE;
- model->priv->src.string = g_strdup (g_value_get_string (value));
- model->priv->data_start = model->priv->src.string;
- model->priv->data_length = strlen (model->priv->src.string);
- break;
- case PROP_XML_NODE: {
- gpointer data = g_value_get_pointer (value);
- if (!data)
- return;
- model->priv->format = FORMAT_XML_NODE;
- model->priv->extract.node.node = data;
+ case PROP_FILENAME:
+ case PROP_RANDOM_ACCESS:
+ /* handled in the constructor */
break;
- }
- case PROP_OPTIONS:
- if (model->priv->options)
- g_object_unref(model->priv->options);
-
- model->priv->options = g_value_get_object (value);
- if (model->priv->options) {
- if (!GDA_IS_SET (model->priv->options)) {
- g_warning (_("\"options\" property is not a GdaSet object"));
- model->priv->options = NULL;
- }
- else
- g_object_ref (model->priv->options);
- }
- return;
case PROP_STRICT:
model->priv->strict = g_value_get_boolean (value);
break;
@@ -672,61 +767,6 @@ gda_data_model_import_set_property (GObject *object,
break;
}
}
-
- /* here we now have a valid data to analyze, try to determine the real kind of data
- * (CVS text of XML) */
- if (model->priv->format != FORMAT_XML_NODE
- && model->priv->data_start) {
- if (!strncmp (model->priv->data_start, "<?xml", 5))
- model->priv->format = FORMAT_XML_DATA;
- else
- model->priv->format = FORMAT_CSV;
- }
-
- /* analyze common options and init.
- * WARNING when adding properties: we need to avoid double initialization here... */
- if (! model->priv->init_done) {
- model->priv->init_done = TRUE;
- switch (model->priv->format) {
- case FORMAT_XML_DATA:
- init_xml_import (model);
- break;
-
- case FORMAT_CSV:
- model->priv->extract.csv.quote = '"';
- if (model->priv->options) {
- const gchar *option;
- option = find_option_as_string (model, "ENCODING");
- if (option)
- model->priv->extract.csv.encoding = g_strdup (option);
- option = find_option_as_string (model, "SEPARATOR");
- if (option)
- model->priv->extract.csv.delimiter = *option;
- model->priv->extract.csv.quote = '"';
- option = find_option_as_string (model, "QUOTE");
- if (option)
- model->priv->extract.csv.quote = *option;
- }
- init_csv_import (model);
- break;
-
- case FORMAT_XML_NODE:
- model->priv->random_access = TRUE;
- init_node_import (model);
- break;
- default:
- g_assert_not_reached ();
- }
-
- /* for random access, create a new GdaDataModelArray model and copy the contents
- from this model */
- if (model->priv->random_access && model->priv->columns && !model->priv->random_access_model) {
- GdaDataModel *ramodel;
-
- ramodel = gda_data_access_wrapper_new ((GdaDataModel *) model);
- model->priv->random_access_model = ramodel;
- }
- }
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]