/** * gom_repository_finalize: * @object: (in): A #GomRepository. * * Finalizer for a #GomRepository instance. Frees any resources held by * the instance. */ static void gom_repository_finalize (GObject *object) { GomRepositoryPrivate *priv = GOM_REPOSITORY(object)->priv; g_clear_object(&priv->adapter); G_OBJECT_CLASS(gom_repository_parent_class)->finalize(object); }
static void migrate_cb (GObject *object, GAsyncResult *result, gpointer user_data) { gboolean ret; GError *error = NULL; ret = gom_repository_migrate_finish (GOM_REPOSITORY (object), result, &error); if (!ret) { GRL_WARNING ("Failed to migrate database: %s", error->message); g_error_free (error); } }
/** * gom_repository_set_property: * @object: (in): A #GObject. * @prop_id: (in): The property identifier. * @value: (in): The given property. * @pspec: (in): A #ParamSpec. * * Set a given #GObject property. */ static void gom_repository_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GomRepository *repository = GOM_REPOSITORY(object); switch (prop_id) { case PROP_ADAPTER: gom_repository_set_adapter(repository, g_value_get_object(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } }
static void gom_repository_find_cb (GomAdapter *adapter, gpointer user_data) { GSimpleAsyncResult *simple = user_data; GomCommandBuilder *builder = NULL; GomResourceGroup *ret; GomRepository *repository = NULL; GomCommand *command; GomCursor *cursor; GomFilter *filter; GError *error = NULL; GType resource_type; GAsyncQueue *queue; guint count; g_return_if_fail(GOM_IS_ADAPTER(adapter)); g_return_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple)); repository = GOM_REPOSITORY(g_async_result_get_source_object(G_ASYNC_RESULT(simple))); g_assert(GOM_IS_REPOSITORY(repository)); resource_type = GPOINTER_TO_SIZE(g_object_get_data(G_OBJECT(simple), "resource-type")); g_assert(g_type_is_a(resource_type, GOM_TYPE_RESOURCE)); filter = g_object_get_data(G_OBJECT(simple), "filter"); g_assert(!filter || GOM_IS_FILTER(filter)); queue = g_object_get_data(G_OBJECT(simple), "queue"); builder = g_object_new(GOM_TYPE_COMMAND_BUILDER, "adapter", adapter, "resource-type", resource_type, "filter", filter, NULL); command = gom_command_builder_build_count(builder); g_assert(GOM_IS_COMMAND(command)); if (!gom_command_execute(command, &cursor, &error)) { g_simple_async_result_take_error(simple, error); goto out; } g_assert(GOM_IS_CURSOR(cursor)); if (!gom_cursor_next(cursor)) { g_assert_not_reached(); goto out; } count = gom_cursor_get_column_uint(cursor, 0); ret = g_object_new(GOM_TYPE_RESOURCE_GROUP, "adapter", adapter, "count", count, "filter", filter, "repository", repository, "resource-type", resource_type, NULL); g_simple_async_result_set_op_res_gpointer(simple, ret, g_object_unref); out: if (!queue) g_simple_async_result_complete_in_idle(simple); else g_async_queue_push(queue, GINT_TO_POINTER(TRUE)); g_object_unref(repository); g_clear_object(&cursor); g_clear_object(&command); g_clear_object(&builder); }
static void gom_repository_migrate_cb (GomAdapter *adapter, gpointer user_data) { GomRepositoryMigrator migrator; GSimpleAsyncResult *simple = user_data; GomRepository *repository; GomCommand *command = NULL; gpointer migrate_data; GError *error = NULL; guint current; guint i; guint version; GAsyncQueue *queue; g_return_if_fail(GOM_IS_ADAPTER(adapter)); g_return_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple)); repository = GOM_REPOSITORY(g_async_result_get_source_object(G_ASYNC_RESULT(simple))); version = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(simple), "version")); migrator = g_object_get_data(G_OBJECT(simple), "migrator"); migrate_data = g_object_get_data(G_OBJECT(simple), "migrator_data"); queue = g_object_get_data(G_OBJECT(simple), "queue"); g_assert(GOM_IS_REPOSITORY(repository)); g_assert_cmpint(version, >, 0); g_assert(migrator != NULL); if (-1 == (current = gom_repository_query_version(repository, &error))) { g_warning("Failed to determine schema version: %s", error->message); goto error; } if (version == current) { g_simple_async_result_set_op_res_gboolean(simple, TRUE); goto out; } EXECUTE_OR_GOTO(adapter, "PRAGMA synchronous = NORMAL;", &error, rollback); EXECUTE_OR_GOTO(adapter, "PRAGMA journal_mode = PERSIST;", &error, rollback); EXECUTE_OR_GOTO(adapter, "BEGIN;", &error, rollback); for (i = MAX(current, 1); i <= version; i++) { if (!migrator(repository, adapter, i, migrate_data, &error)) { if (!error) g_warning ("Migration function failed without returning a error"); goto rollback; } command = g_object_new(GOM_TYPE_COMMAND, "adapter", adapter, "sql", "INSERT INTO _gom_version (" " version" ") VALUES (?);", NULL); gom_command_set_param_uint(command, 0, i); if (!gom_command_execute(command, NULL, &error)) { g_object_unref(command); goto rollback; } g_object_unref(command); } EXECUTE_OR_GOTO(adapter, "COMMIT;", &error, rollback); g_simple_async_result_set_op_res_gboolean(simple, TRUE); goto out; rollback: EXECUTE_OR_GOTO(adapter, "ROLLBACK;", NULL, error); error: g_assert(error); g_simple_async_result_take_error(simple, error); out: g_object_unref(repository); if (!queue) g_simple_async_result_complete_in_idle(simple); else g_async_queue_push(queue, GINT_TO_POINTER(TRUE)); }
static void find_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GomResourceGroup *group; OperationSpec *os = user_data; GError *local_error = NULL; GError *error = NULL; guint idx, count, num_left; group = gom_repository_find_finish (GOM_REPOSITORY (object), res, &local_error); if (!group) { GRL_WARNING ("Failed to find bookmarks: %s", local_error->message); error = g_error_new (GRL_CORE_ERROR, os->error_code, _("Failed to find bookmarks: %s"), local_error->message); g_error_free (local_error); os->callback (os->source, os->operation_id, NULL, 0, os->user_data, error); g_error_free (error); goto out; } count = gom_resource_group_get_count (group); if (os->skip >= count) { os->callback (os->source, os->operation_id, NULL, 0, os->user_data, NULL); goto out; } if (!gom_resource_group_fetch_sync (group, os->skip, os->count, &local_error)) { GRL_WARNING ("Failed to find bookmarks: %s", local_error->message); error = g_error_new (GRL_CORE_ERROR, os->error_code, _("Failed to find bookmarks: %s"), local_error->message); g_error_free (local_error); os->callback (os->source, os->operation_id, NULL, 0, os->user_data, error); g_error_free (error); goto out; } idx = os->skip; num_left = MIN (count - os->skip, os->count); for (idx = os->skip; num_left > 0 ; idx++) { GomResource *resource; GrlMedia *media; resource = gom_resource_group_get_index (group, idx); media = build_media_from_resource (NULL, resource, os->type_filter); if (media == NULL) { num_left--; if (num_left == 0) os->callback (os->source, os->operation_id, NULL, 0, os->user_data, NULL); continue; } os->callback (os->source, os->operation_id, media, --num_left, os->user_data, NULL); } g_object_unref (group); out: g_slice_free (OperationSpec, os); }