From ea9e4a73a559af0adcfb393e033b1d06b4f25ff9 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 31 Jul 2014 00:33:54 +0200 Subject: [PATCH] Add function ag_db_get_chart_data_by_id() It loads one single chart from the database and fills an AgDbSave struct with its data --- src/ag-db.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ag-db.h | 2 + 2 files changed, 220 insertions(+) diff --git a/src/ag-db.c b/src/ag-db.c index 7cf9422..8473d84 100644 --- a/src/ag-db.c +++ b/src/ag-db.c @@ -21,6 +21,52 @@ G_DEFINE_QUARK(ag_db_error_quark, ag_db_error); G_DEFINE_TYPE_WITH_PRIVATE(AgDb, ag_db, G_TYPE_OBJECT); +typedef enum { + COLUMN_ID, + COLUMN_NAME, + COLUMN_COUNTRY, + COLUMN_CITY, + COLUMN_LONGITUDE, + COLUMN_LATITUDE, + COLUMN_ALTITUDE, + COLUMN_YEAR, + COLUMN_MONTH, + COLUMN_DAY, + COLUMN_HOUR, + COLUMN_MINUTE, + COLUMN_SECOND, + COLUMN_TIMEZONE, + COLUMN_HOUSE_SYSTEM, + COLUMN_NOTE, + + /* Leave this as the last element */ + COLUMN_COUNT +} ChartTableColumn; + +typedef struct { + ChartTableColumn id; + gchar *name; +} ChartTableColumnDef; + +static ChartTableColumnDef chart_table_column[] = { + { COLUMN_ID, "id" }, + { COLUMN_NAME, "name" }, + { COLUMN_COUNTRY, "country_name" }, + { COLUMN_CITY, "city_name" }, + { COLUMN_LONGITUDE, "longitude" }, + { COLUMN_LATITUDE, "latitude" }, + { COLUMN_ALTITUDE, "altitude" }, + { COLUMN_YEAR, "year" }, + { COLUMN_MONTH, "month" }, + { COLUMN_DAY, "day" }, + { COLUMN_HOUR, "hour" }, + { COLUMN_MINUTE, "minute" }, + { COLUMN_SECOND, "second" }, + { COLUMN_TIMEZONE, "timezone" }, + { COLUMN_HOUSE_SYSTEM, "house_system" }, + { COLUMN_NOTE, "note" }, +}; + static void ag_db_non_select(AgDb *db, const gchar *sql) { @@ -684,3 +730,175 @@ ag_db_get_chart_list(AgDb *db, GError **err) return g_list_reverse(ret); } + +AgDbSave * +ag_db_get_chart_data_by_id(AgDb *db, guint row_id, GError **err) +{ + AgDbSave *save_data; + const GValue *value; + GdaValueAttribute attributes; + gchar *query, + *columns; + guint i; + GdaDataModel *result; + GError *local_err = NULL; + + columns = NULL; + + for (i = 1; i < COLUMN_COUNT; i++) { + gchar *tmp; + + if (i == 1) { + columns = g_strjoin( + ", ", + chart_table_column[0].name, + chart_table_column[1].name, + NULL + ); + } else { + tmp = g_strjoin(", ", columns, chart_table_column[i].name, NULL); + g_free(columns); + columns = tmp; + } + } + + query = g_strdup_printf( + "SELECT %s FROM chart WHERE id = ##id::gint", + columns + ); + g_free(columns); + + result = ag_db_select(db, &local_err, query, "id", row_id, NULL); + g_free(query); + + if (local_err && (local_err->message)) { + return NULL; + } + + if (gda_data_model_get_n_rows(result) < 1) { + g_set_error( + err, + AG_DB_ERROR, AG_DB_ERROR_NO_CHART, + "Chart does not exist" + ); + + return NULL; + } + + save_data = g_new0(AgDbSave, 1); + + /* id */ + value = gda_data_model_get_value_at(result, COLUMN_ID, 0, NULL); + save_data->db_id = g_value_get_int(value); + + /* name */ + value = gda_data_model_get_value_at(result, COLUMN_NAME, 0, NULL); + save_data->name = g_strdup(g_value_get_string(value)); + + /* country */ + value = gda_data_model_get_value_at(result, COLUMN_COUNTRY, 0, NULL); + attributes = gda_data_model_get_attributes_at(result, COLUMN_COUNTRY, 0); + + if (attributes | GDA_VALUE_ATTR_IS_NULL) { + save_data->country = NULL; + } else { + save_data->country = g_strdup(g_value_get_string(value)); + } + + value = gda_data_model_get_value_at(result, COLUMN_CITY, 0, NULL); + attributes = gda_data_model_get_attributes_at(result, COLUMN_CITY, 0); + + if (attributes | GDA_VALUE_ATTR_IS_NULL) { + save_data->city = NULL; + } else { + save_data->city = g_strdup(g_value_get_string(value)); + } + + value = gda_data_model_get_value_at( + result, + COLUMN_LONGITUDE, + 0, + NULL + ); + save_data->longitude = g_value_get_double(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_LATITUDE, + 0, + NULL + ); + save_data->latitude = g_value_get_double(value); + + value = gda_data_model_get_value_at(result, COLUMN_ALTITUDE, 0, NULL); + attributes = gda_data_model_get_attributes_at(result, COLUMN_ALTITUDE, 0); + + if (attributes | GDA_VALUE_ATTR_IS_NULL) { + /* TODO: this value should be macroified */ + save_data->altitude = 280.0; + } else { + save_data->altitude = g_value_get_double(value); + } + + value = gda_data_model_get_value_at(result, COLUMN_YEAR, 0, NULL); + save_data->year = g_value_get_int(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_MONTH, + 0, + NULL + ); + save_data->month = g_value_get_uint(value); + + value = gda_data_model_get_value_at(result, COLUMN_DAY, 0, NULL); + save_data->day = g_value_get_uint(value); + + value = gda_data_model_get_value_at(result, COLUMN_HOUR, 0, NULL); + save_data->hour = g_value_get_uint(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_MINUTE, + 0, + NULL + ); + save_data->minute = g_value_get_uint(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_SECOND, + 0, + NULL + ); + save_data->second = g_value_get_uint(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_TIMEZONE, + 0, + NULL + ); + save_data->timezone = g_value_get_double(value); + + value = gda_data_model_get_value_at( + result, + COLUMN_HOUSE_SYSTEM, + 0, + NULL + ); + save_data->house_system = g_strdup(g_value_get_string(value)); + + value = gda_data_model_get_value_at(result, COLUMN_NOTE, 0, NULL); + attributes = gda_data_model_get_attributes_at(result, 15, 0); + + if (attributes | GDA_VALUE_ATTR_IS_NULL) { + save_data->note = NULL; + } else { + save_data->note = g_strdup(g_value_get_string(value)); + } + + g_object_unref(result); + + return save_data; +} diff --git a/src/ag-db.h b/src/ag-db.h index 104ad3b..47ddb26 100644 --- a/src/ag-db.h +++ b/src/ag-db.h @@ -66,6 +66,8 @@ gboolean ag_db_save_chart(AgDb *db, GList *ag_db_get_chart_list(AgDb *db, GError **err); +AgDbSave *ag_db_get_chart_data_by_id(AgDb *db, guint row_id, GError **err); + #define AG_DB_ERROR (ag_db_error_quark()) GQuark ag_db_error_quark(void);