gom: backport upstream patches-epoch1 Signed-off-by: Zhiqiang Liu <lzhq28@mail.ustc.edu.cn>
254 lines
8.0 KiB
Diff
254 lines
8.0 KiB
Diff
From 4ce0cb6cadfe6f08e26f2e88ad7f002bc0d775ac Mon Sep 17 00:00:00 2001
|
|
From: Bastien Nocera <hadess@hadess.net>
|
|
Date: Wed, 9 Aug 2017 12:32:51 +0200
|
|
Subject: [PATCH 01/29] tests: Add test for invalid table names
|
|
|
|
https://bugzilla.gnome.org/show_bug.cgi?id=785983
|
|
---
|
|
tests/meson.build | 1 +
|
|
tests/test-gom-table-name.c | 220 ++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 221 insertions(+)
|
|
create mode 100644 tests/test-gom-table-name.c
|
|
|
|
diff --git a/tests/meson.build b/tests/meson.build
|
|
index 340e8c1..1df4884 100644
|
|
--- a/tests/meson.build
|
|
+++ b/tests/meson.build
|
|
@@ -6,6 +6,7 @@ tests = [
|
|
'test-gom-migration',
|
|
'test-gom-repository',
|
|
'test-gom-sorting',
|
|
+ 'test-gom-table-name',
|
|
'test-gom-update',
|
|
]
|
|
|
|
diff --git a/tests/test-gom-table-name.c b/tests/test-gom-table-name.c
|
|
new file mode 100644
|
|
index 0000000..7c099d0
|
|
--- /dev/null
|
|
+++ b/tests/test-gom-table-name.c
|
|
@@ -0,0 +1,220 @@
|
|
+#include <gom/gom.h>
|
|
+#include <glib/gstdio.h>
|
|
+
|
|
+enum {
|
|
+ PROP_0,
|
|
+ PROP_ID,
|
|
+ PROP_FIRST_NAME,
|
|
+ PROP_SURNAME,
|
|
+ LAST_PROP
|
|
+};
|
|
+
|
|
+#define ITEM_TYPE_RESOURCE (item_resource_get_type())
|
|
+#define ITEM_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ITEM_TYPE_RESOURCE, ItemResource))
|
|
+#define ITEM_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ITEM_TYPE_RESOURCE, ItemResourceClass))
|
|
+#define ITEM_IS_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ITEM_TYPE_RESOURCE))
|
|
+#define ITEM_IS_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ITEM_TYPE_RESOURCE))
|
|
+#define ITEM_RESOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ITEM_TYPE_RESOURCE, ItemResourceClass))
|
|
+
|
|
+typedef struct {
|
|
+ int id;
|
|
+ char *first_name;
|
|
+ char *surname;
|
|
+} ItemResourcePrivate;
|
|
+
|
|
+typedef struct {
|
|
+ GomResource parent;
|
|
+ ItemResourcePrivate *priv;
|
|
+} ItemResource;
|
|
+
|
|
+typedef struct {
|
|
+ GomResourceClass parent_class;
|
|
+} ItemResourceClass;
|
|
+
|
|
+GType item_resource_get_type(void);
|
|
+
|
|
+G_DEFINE_TYPE(ItemResource, item_resource, GOM_TYPE_RESOURCE)
|
|
+
|
|
+static GParamSpec *item_specs[LAST_PROP];
|
|
+
|
|
+static void
|
|
+item_resource_finalize (GObject *object)
|
|
+{
|
|
+ ItemResource *resource = ITEM_RESOURCE(object);
|
|
+ g_clear_pointer(&resource->priv->first_name, g_free);
|
|
+ g_clear_pointer(&resource->priv->surname, g_free);
|
|
+}
|
|
+
|
|
+static void
|
|
+item_resource_get_property (GObject *object,
|
|
+ guint prop_id,
|
|
+ GValue *value,
|
|
+ GParamSpec *pspec)
|
|
+{
|
|
+ ItemResource *resource = ITEM_RESOURCE(object);
|
|
+
|
|
+ switch (prop_id) {
|
|
+ case PROP_ID:
|
|
+ g_value_set_int(value, resource->priv->id);
|
|
+ break;
|
|
+ case PROP_FIRST_NAME:
|
|
+ g_value_set_string(value, resource->priv->first_name);
|
|
+ break;
|
|
+ case PROP_SURNAME:
|
|
+ g_value_set_string(value, resource->priv->surname);
|
|
+ break;
|
|
+ default:
|
|
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+item_resource_set_property (GObject *object,
|
|
+ guint prop_id,
|
|
+ const GValue *value,
|
|
+ GParamSpec *pspec)
|
|
+{
|
|
+ ItemResource *resource = ITEM_RESOURCE(object);
|
|
+
|
|
+ switch (prop_id) {
|
|
+ case PROP_ID:
|
|
+ resource->priv->id = g_value_get_int(value);
|
|
+ break;
|
|
+ case PROP_FIRST_NAME:
|
|
+ g_clear_pointer(&resource->priv->first_name, g_free);
|
|
+ resource->priv->first_name = g_value_dup_string(value);
|
|
+ break;
|
|
+ case PROP_SURNAME:
|
|
+ g_clear_pointer(&resource->priv->surname, g_free);
|
|
+ resource->priv->surname = g_value_dup_string(value);
|
|
+ break;
|
|
+ default:
|
|
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+item_resource_class_init (ItemResourceClass *klass)
|
|
+{
|
|
+ GObjectClass *object_class;
|
|
+ GomResourceClass *resource_class;
|
|
+
|
|
+ object_class = G_OBJECT_CLASS(klass);
|
|
+ object_class->finalize = item_resource_finalize;
|
|
+ object_class->get_property = item_resource_get_property;
|
|
+ object_class->set_property = item_resource_set_property;
|
|
+ g_type_class_add_private(object_class, sizeof(ItemResourcePrivate));
|
|
+
|
|
+ resource_class = GOM_RESOURCE_CLASS(klass);
|
|
+ /* Invalid table name */
|
|
+ gom_resource_class_set_table(resource_class, "insert");
|
|
+
|
|
+ item_specs[PROP_ID] = g_param_spec_int("id",
|
|
+ "ID",
|
|
+ "The ID for the item.",
|
|
+ G_MININT, G_MAXINT, 0,
|
|
+ G_PARAM_READWRITE);
|
|
+ g_object_class_install_property(object_class, PROP_ID,
|
|
+ item_specs[PROP_ID]);
|
|
+ gom_resource_class_set_primary_key(resource_class, "id");
|
|
+
|
|
+ item_specs[PROP_FIRST_NAME] = g_param_spec_string("first-name",
|
|
+ "First name",
|
|
+ "The First name for the item.",
|
|
+ NULL,
|
|
+ G_PARAM_READWRITE);
|
|
+ g_object_class_install_property(object_class, PROP_FIRST_NAME,
|
|
+ item_specs[PROP_FIRST_NAME]);
|
|
+
|
|
+ item_specs[PROP_SURNAME] = g_param_spec_string("surname",
|
|
+ "Surname",
|
|
+ "The Surname for the item.",
|
|
+ NULL,
|
|
+ G_PARAM_READWRITE);
|
|
+ g_object_class_install_property(object_class, PROP_SURNAME,
|
|
+ item_specs[PROP_SURNAME]);
|
|
+}
|
|
+
|
|
+static void
|
|
+item_resource_init (ItemResource *resource)
|
|
+{
|
|
+ resource->priv = G_TYPE_INSTANCE_GET_PRIVATE(resource,
|
|
+ ITEM_TYPE_RESOURCE,
|
|
+ ItemResourcePrivate);
|
|
+}
|
|
+
|
|
+static void
|
|
+table_name (void)
|
|
+{
|
|
+ GomAdapter *adapter;
|
|
+ GError *error = NULL;
|
|
+ gboolean ret;
|
|
+ GomRepository *repository;
|
|
+ GList *object_types;
|
|
+ GValue value = { 0, };
|
|
+ GomFilter *filter;
|
|
+ char *s1, *s2;
|
|
+ ItemResource *it;
|
|
+
|
|
+ adapter = gom_adapter_new();
|
|
+ //ret = gom_adapter_open_sync(adapter, "file:test.db", &error);
|
|
+ ret = gom_adapter_open_sync(adapter, ":memory:", &error);
|
|
+ g_assert_no_error(error);
|
|
+ g_assert(ret);
|
|
+
|
|
+ repository = gom_repository_new(adapter);
|
|
+
|
|
+ object_types = g_list_prepend(NULL, GINT_TO_POINTER(ITEM_TYPE_RESOURCE));
|
|
+ ret = gom_repository_automatic_migrate_sync(repository, 1, object_types, &error);
|
|
+ g_assert_no_error(error);
|
|
+ g_assert(ret);
|
|
+
|
|
+ it = g_object_new (ITEM_TYPE_RESOURCE,
|
|
+ "repository", repository,
|
|
+ "first-name", "First name",
|
|
+ "surname", "Surname",
|
|
+ NULL);
|
|
+ ret = gom_resource_save_sync(GOM_RESOURCE(it), &error);
|
|
+ g_assert(ret);
|
|
+ g_assert_no_error(error);
|
|
+ g_object_unref(it);
|
|
+
|
|
+ g_value_init(&value, G_TYPE_STRING);
|
|
+ g_value_set_string(&value, "First name");
|
|
+ filter = gom_filter_new_eq(ITEM_TYPE_RESOURCE, "first-name", &value);
|
|
+ g_value_unset(&value);
|
|
+
|
|
+ it = ITEM_RESOURCE (gom_repository_find_one_sync(repository,
|
|
+ ITEM_TYPE_RESOURCE,
|
|
+ filter,
|
|
+ &error));
|
|
+ g_assert_no_error(error);
|
|
+ g_assert(it);
|
|
+ g_object_unref(filter);
|
|
+
|
|
+ g_object_get(it,
|
|
+ "first-name", &s1,
|
|
+ "surname", &s2,
|
|
+ NULL);
|
|
+ g_object_unref(it);
|
|
+
|
|
+ g_assert_cmpstr(s1, ==, "First name");
|
|
+ g_assert_cmpstr(s2, ==, "Surname");
|
|
+ g_free(s1);
|
|
+ g_free(s2);
|
|
+
|
|
+ ret = gom_adapter_close_sync(adapter, &error);
|
|
+ g_assert_no_error(error);
|
|
+ g_assert(ret);
|
|
+
|
|
+ g_object_unref(repository);
|
|
+ g_object_unref(adapter);
|
|
+}
|
|
+
|
|
+gint
|
|
+main (int argc, char **argv)
|
|
+{
|
|
+ g_test_init(&argc, &argv, NULL);
|
|
+ g_test_add_func("/GomRepository/table_name", table_name);
|
|
+ return g_test_run();
|
|
+}
|
|
--
|
|
2.21.1 (Apple Git-122.3)
|
|
|