mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 01:58:54 +01:00 
			
		
		
		
	Merge branch 'update-gvdb' into 'master'
Update gvdb Closes #2 See merge request GNOME/glib!1446
This commit is contained in:
		@@ -339,6 +339,8 @@ file_builder_allocate_for_hash (FileBuilder            *fb,
 | 
			
		||||
#undef chunk
 | 
			
		||||
 | 
			
		||||
  memset (*bloom_filter, 0, n_bloom_words * sizeof (guint32_le));
 | 
			
		||||
  memset (*hash_buckets, 0, n_buckets * sizeof (guint32_le));
 | 
			
		||||
  memset (*hash_items, 0, n_items * sizeof (struct gvdb_hash_item));
 | 
			
		||||
 | 
			
		||||
  /* NOTE - the code to actually fill in the bloom filter here is missing.
 | 
			
		||||
   * Patches welcome!
 | 
			
		||||
@@ -450,6 +452,13 @@ file_builder_new (gboolean byteswap)
 | 
			
		||||
  return builder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
file_builder_free (FileBuilder *fb)
 | 
			
		||||
{
 | 
			
		||||
  g_queue_free (fb->chunks);
 | 
			
		||||
  g_slice_free (FileBuilder, fb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GString *
 | 
			
		||||
file_builder_serialise (FileBuilder          *fb,
 | 
			
		||||
                        struct gvdb_pointer   root)
 | 
			
		||||
@@ -494,9 +503,6 @@ file_builder_serialise (FileBuilder          *fb,
 | 
			
		||||
      g_slice_free (FileChunk, chunk);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_queue_free (fb->chunks);
 | 
			
		||||
  g_slice_free (FileBuilder, fb);
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -511,12 +517,118 @@ gvdb_table_write_contents (GHashTable   *table,
 | 
			
		||||
  FileBuilder *fb;
 | 
			
		||||
  GString *str;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (table != NULL, FALSE);
 | 
			
		||||
  g_return_val_if_fail (filename != NULL, FALSE);
 | 
			
		||||
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
  fb = file_builder_new (byteswap);
 | 
			
		||||
  file_builder_add_hash (fb, table, &root);
 | 
			
		||||
  str = file_builder_serialise (fb, root);
 | 
			
		||||
  file_builder_free (fb);
 | 
			
		||||
 | 
			
		||||
  status = g_file_set_contents (filename, str->str, str->len, error);
 | 
			
		||||
  g_string_free (str, TRUE);
 | 
			
		||||
 | 
			
		||||
  return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  GBytes *contents;  /* (owned) */
 | 
			
		||||
  GFile  *file;      /* (owned) */
 | 
			
		||||
} WriteContentsData;
 | 
			
		||||
 | 
			
		||||
static WriteContentsData *
 | 
			
		||||
write_contents_data_new (GBytes *contents,
 | 
			
		||||
                         GFile  *file)
 | 
			
		||||
{
 | 
			
		||||
  WriteContentsData *data;
 | 
			
		||||
 | 
			
		||||
  data = g_slice_new (WriteContentsData);
 | 
			
		||||
  data->contents = g_bytes_ref (contents);
 | 
			
		||||
  data->file = g_object_ref (file);
 | 
			
		||||
 | 
			
		||||
  return data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
write_contents_data_free (WriteContentsData *data)
 | 
			
		||||
{
 | 
			
		||||
  g_bytes_unref (data->contents);
 | 
			
		||||
  g_object_unref (data->file);
 | 
			
		||||
  g_slice_free (WriteContentsData, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
replace_contents_cb (GObject      *source_object,
 | 
			
		||||
                     GAsyncResult *result,
 | 
			
		||||
                     gpointer      user_data)
 | 
			
		||||
{
 | 
			
		||||
  GTask *task = user_data;
 | 
			
		||||
  WriteContentsData *data = g_task_get_task_data (task);
 | 
			
		||||
  GError *error = NULL;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (g_task_get_source_tag (task) == gvdb_table_write_contents_async);
 | 
			
		||||
 | 
			
		||||
  if (!g_file_replace_contents_finish (data->file, result, NULL, &error))
 | 
			
		||||
    g_task_return_error (task, g_steal_pointer (&error));
 | 
			
		||||
  else
 | 
			
		||||
    g_task_return_boolean (task, TRUE);
 | 
			
		||||
 | 
			
		||||
  g_object_unref (task);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
gvdb_table_write_contents_async (GHashTable          *table,
 | 
			
		||||
                                 const gchar         *filename,
 | 
			
		||||
                                 gboolean             byteswap,
 | 
			
		||||
                                 GCancellable        *cancellable,
 | 
			
		||||
                                 GAsyncReadyCallback  callback,
 | 
			
		||||
                                 gpointer             user_data)
 | 
			
		||||
{
 | 
			
		||||
  struct gvdb_pointer root;
 | 
			
		||||
  FileBuilder *fb;
 | 
			
		||||
  WriteContentsData *data;
 | 
			
		||||
  GString *str;
 | 
			
		||||
  GBytes *bytes;
 | 
			
		||||
  GFile *file;
 | 
			
		||||
  GTask *task;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (table != NULL);
 | 
			
		||||
  g_return_if_fail (filename != NULL);
 | 
			
		||||
  g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 | 
			
		||||
 | 
			
		||||
  fb = file_builder_new (byteswap);
 | 
			
		||||
  file_builder_add_hash (fb, table, &root);
 | 
			
		||||
  str = file_builder_serialise (fb, root);
 | 
			
		||||
  bytes = g_string_free_to_bytes (str);
 | 
			
		||||
  file_builder_free (fb);
 | 
			
		||||
 | 
			
		||||
  file = g_file_new_for_path (filename);
 | 
			
		||||
  data = write_contents_data_new (bytes, file);
 | 
			
		||||
 | 
			
		||||
  task = g_task_new (NULL, cancellable, callback, user_data);
 | 
			
		||||
  g_task_set_task_data (task, data, (GDestroyNotify)write_contents_data_free);
 | 
			
		||||
  g_task_set_source_tag (task, gvdb_table_write_contents_async);
 | 
			
		||||
 | 
			
		||||
  g_file_replace_contents_async (file,
 | 
			
		||||
                                 g_bytes_get_data (bytes, NULL),
 | 
			
		||||
                                 g_bytes_get_size (bytes),
 | 
			
		||||
                                 NULL, FALSE,
 | 
			
		||||
                                 G_FILE_CREATE_PRIVATE,
 | 
			
		||||
                                 cancellable, replace_contents_cb, g_steal_pointer (&task));
 | 
			
		||||
 | 
			
		||||
  g_bytes_unref (bytes);
 | 
			
		||||
  g_object_unref (file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
gvdb_table_write_contents_finish (GHashTable    *table,
 | 
			
		||||
                                  GAsyncResult  *result,
 | 
			
		||||
                                  GError       **error)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (table != NULL, FALSE);
 | 
			
		||||
  g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE);
 | 
			
		||||
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
  return g_task_propagate_boolean (G_TASK (result), error);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -51,5 +51,16 @@ gboolean                gvdb_table_write_contents                       (GHashTa
 | 
			
		||||
                                                                         const gchar    *filename,
 | 
			
		||||
                                                                         gboolean        byteswap,
 | 
			
		||||
                                                                         GError        **error);
 | 
			
		||||
G_GNUC_INTERNAL
 | 
			
		||||
void                    gvdb_table_write_contents_async                 (GHashTable          *table,
 | 
			
		||||
                                                                         const gchar         *filename,
 | 
			
		||||
                                                                         gboolean             byteswap,
 | 
			
		||||
                                                                         GCancellable        *cancellable,
 | 
			
		||||
                                                                         GAsyncReadyCallback  callback,
 | 
			
		||||
                                                                         gpointer             user_data);
 | 
			
		||||
G_GNUC_INTERNAL
 | 
			
		||||
gboolean                gvdb_table_write_contents_finish                (GHashTable          *table,
 | 
			
		||||
                                                                         GAsyncResult        *result,
 | 
			
		||||
                                                                         GError             **error);
 | 
			
		||||
 | 
			
		||||
#endif /* __gvdb_builder_h__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -351,10 +351,10 @@ gvdb_table_get_names (GvdbTable *table,
 | 
			
		||||
                      gsize     *length)
 | 
			
		||||
{
 | 
			
		||||
  gchar **names;
 | 
			
		||||
  gint n_names;
 | 
			
		||||
  gint filled;
 | 
			
		||||
  gint total;
 | 
			
		||||
  gint i;
 | 
			
		||||
  guint n_names;
 | 
			
		||||
  guint filled;
 | 
			
		||||
  guint total;
 | 
			
		||||
  guint i;
 | 
			
		||||
 | 
			
		||||
  /* We generally proceed by iterating over the list of items in the
 | 
			
		||||
   * hash table (in order of appearance) recording them into an array.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user