1 /*
2  * Copyright (C) 2009 Canonical, Ltd.
3  *
4  * This library is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * version 3.0 as published by the Free Software Foundation.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU Lesser General Public License version 3.0 for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library. If not, see
15  * <http://www.gnu.org/licenses/>.
16  *
17  * Authored by Mikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com>
18  */
19 
20 #if !defined (_DEE_H_INSIDE) && !defined (DEE_COMPILATION)
21 #error "Only <dee.h> can be included directly."
22 #endif
23 
24 #ifndef _HAVE_DEE_MODEL_H
25 #define _HAVE_DEE_MODEL_H
26 
27 #include <glib.h>
28 #include <gio/gio.h>
29 #include <glib-object.h>
30 
31 G_BEGIN_DECLS
32 
33 #define DEE_TYPE_MODEL_ITER (dee_model_iter_get_type ())
34 
35 #define DEE_TYPE_MODEL (dee_model_get_type ())
36 
37 #define DEE_MODEL(obj) \
38         (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEE_TYPE_MODEL, DeeModel))
39 
40 #define DEE_IS_MODEL(obj) \
41         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEE_TYPE_MODEL))
42 
43 #define DEE_MODEL_GET_IFACE(obj) \
44         (G_TYPE_INSTANCE_GET_INTERFACE(obj, dee_model_get_type (), DeeModelIface))
45 
46 typedef struct _DeeModelIface DeeModelIface;
47 typedef struct _DeeModel DeeModel;
48 
49 /**
50  * DeeModelIter:
51  *
52  * The DeeModelIter structure is private and should only be used with the
53  * provided #DeeModel API. It is owned by DeeModel and should not be freed.
54  **/
55 typedef struct _DeeModelIter DeeModelIter;
56 
57 /**
58  * DeeModelTag:
59  *
60  * The DeeModelTag structure is private and should only be used with the
61  * provided #DeeModel API. It is owned by DeeModel and should not be freed.
62  **/
63 typedef struct _DeeModelTag DeeModelTag;
64 
65 /**
66  * DeeCompareRowFunc:
67  * @row1: (array): The model being indexed
68  * @row2: (array): The row to extract terms for
69  * @user_data: (closure): User data to pass to comparison function
70  *
71  * Compares @row1 and @row2. Mainly used with dee_model_insert_sorted() and
72  * dee_model_find_sorted().
73  *
74  * Returns: -1, 0, or 1 if @row1 is respectively less than, equal, or greater
75  * than @row2.
76  */
77 typedef gint          (*DeeCompareRowFunc) (GVariant** row1,
78                                             GVariant** row2,
79                                             gpointer user_data);
80 
81 /**
82  * DeeCompareRowSizedFunc:
83  * @row1: (array length=row1_length): Row data
84  * @row1_length: The number of elements in row1 array
85  * @row2: (array length=row2_length): Row data to compare with
86  * @row2_length: The number of elements in row2 array
87  * @user_data: (closure): User data passed to comparison function
88  *
89  * Compares @row1 and @row2. Mainly used with
90  * dee_model_insert_row_sorted_with_sizes() and
91  * dee_model_find_row_sorted_with_sizes().
92  *
93  * Returns: -1, 0, or 1 if @row1 is respectively less than, equal, or greater
94  * than @row2.
95  */
96 typedef gint          (*DeeCompareRowSizedFunc) (GVariant** row1,
97                                                  guint row1_length,
98                                                  GVariant** row2,
99                                                  guint row2_length,
100                                                  gpointer user_data);
101 
102 struct _DeeModelIface
103 {
104   GTypeInterface g_iface;
105 
106   /* Signals */
107   void           (*row_added)       (DeeModel     *self,
108                                      DeeModelIter *iter);
109 
110   void           (*row_removed)     (DeeModel     *self,
111                                      DeeModelIter *iter);
112 
113   void           (*row_changed)     (DeeModel     *self,
114                                      DeeModelIter *iter);
115 
116   /*< public >*/
117   void           (*set_schema_full)     (DeeModel          *self,
118                                          const char* const *column_schemas,
119                                          guint              num_columns);
120 
121   const gchar* const* (*get_schema)     (DeeModel     *self,
122                                          guint        *num_columns);
123 
124   const gchar*   (*get_column_schema)   (DeeModel     *self,
125                                          guint         column);
126 
127   const gchar*   (*get_field_schema)    (DeeModel     *self,
128                                          const gchar  *field_name,
129                                          guint        *out_column);
130 
131   gint           (*get_column_index)    (DeeModel     *self,
132                                          const gchar  *column_name);
133 
134   void           (*set_column_names_full) (DeeModel     *self,
135                                            const gchar **column_names,
136                                            guint         num_columns);
137 
138   const gchar**  (*get_column_names)    (DeeModel    *self,
139                                          guint       *num_columns);
140 
141   void           (*register_vardict_schema)    (DeeModel    *self,
142                                                 guint        num_column,
143                                                 GHashTable  *schemas);
144 
145   GHashTable*    (*get_vardict_schema)  (DeeModel    *self,
146                                          guint        num_column);
147 
148   guint          (*get_n_columns)   (DeeModel *self);
149 
150   guint          (*get_n_rows)      (DeeModel *self);
151 
152   DeeModelIter*  (*append_row)    (DeeModel  *self,
153                                    GVariant **row_members);
154 
155   DeeModelIter*  (*prepend_row)   (DeeModel  *self,
156                                    GVariant **row_members);
157 
158   DeeModelIter*  (*insert_row)    (DeeModel  *self,
159                                    guint      pos,
160                                    GVariant **row_members);
161 
162   DeeModelIter*  (*insert_row_before) (DeeModel      *self,
163                                        DeeModelIter  *iter,
164                                        GVariant     **row_members);
165 
166   DeeModelIter*  (*insert_row_sorted)  (DeeModel           *self,
167                                         GVariant          **row_members,
168                                         DeeCompareRowFunc   cmp_func,
169                                         gpointer            user_data);
170 
171   DeeModelIter*  (*find_row_sorted)    (DeeModel           *self,
172                                         GVariant          **row_spec,
173                                         DeeCompareRowFunc   cmp_func,
174                                         gpointer            user_data,
175                                         gboolean           *out_was_found);
176 
177   void           (*remove)          (DeeModel     *self,
178                                      DeeModelIter *iter);
179 
180   void           (*clear)           (DeeModel *self);
181 
182   void           (*set_value)       (DeeModel       *self,
183                                      DeeModelIter   *iter,
184                                      guint           column,
185                                      GVariant       *value);
186 
187   void           (*set_row)         (DeeModel       *self,
188                                      DeeModelIter   *iter,
189                                      GVariant      **row_members);
190 
191   GVariant*      (*get_value)       (DeeModel     *self,
192                                      DeeModelIter *iter,
193                                      guint         column);
194 
195   GVariant*      (*get_value_by_name) (DeeModel     *self,
196                                        DeeModelIter *iter,
197                                        const gchar  *column_name);
198 
199   DeeModelIter* (*get_first_iter)  (DeeModel     *self);
200 
201   DeeModelIter* (*get_last_iter)   (DeeModel     *self);
202 
203   DeeModelIter* (*get_iter_at_row) (DeeModel     *self,
204                                     guint          row);
205 
206   gboolean       (*get_bool)        (DeeModel     *self,
207                                      DeeModelIter *iter,
208                                      guint         column);
209 
210   guchar         (*get_uchar)       (DeeModel     *self,
211                                      DeeModelIter *iter,
212                                      guint         column);
213 
214   gint32         (*get_int32)       (DeeModel     *self,
215                                      DeeModelIter *iter,
216                                      guint         column);
217 
218   guint32        (*get_uint32)      (DeeModel     *self,
219                                      DeeModelIter *iter,
220                                      guint         column);
221 
222   gint64         (*get_int64)       (DeeModel     *self,
223                                      DeeModelIter *iter,
224                                      guint         column);
225 
226   guint64        (*get_uint64)      (DeeModel     *self,
227                                      DeeModelIter *iter,
228                                      guint         column);
229 
230   gdouble        (*get_double)      (DeeModel     *self,
231                                      DeeModelIter *iter,
232                                      guint         column);
233 
234   const gchar*   (*get_string)      (DeeModel     *self,
235                                      DeeModelIter *iter,
236                                      guint         column);
237 
238   DeeModelIter*  (*next)            (DeeModel     *self,
239                                      DeeModelIter *iter);
240 
241   DeeModelIter*  (*prev)            (DeeModel     *self,
242                                      DeeModelIter *iter);
243 
244   gboolean       (*is_first)        (DeeModel     *self,
245                                      DeeModelIter *iter);
246 
247   gboolean       (*is_last)         (DeeModel     *self,
248                                      DeeModelIter *iter);
249 
250   guint          (*get_position)    (DeeModel     *self,
251                                      DeeModelIter *iter);
252 
253   DeeModelTag*   (*register_tag)    (DeeModel       *self,
254                                      GDestroyNotify  tag_destroy);
255 
256   gpointer       (*get_tag)         (DeeModel       *self,
257                                      DeeModelIter   *iter,
258                                      DeeModelTag    *tag);
259 
260   void           (*set_tag)         (DeeModel       *self,
261                                      DeeModelIter   *iter,
262                                      DeeModelTag    *tag,
263                                      gpointer        value);
264 
265   GVariant**     (*get_row)         (DeeModel       *self,
266                                      DeeModelIter   *iter,
267                                      GVariant      **out_row_members);
268 
269   void           (*begin_changeset)    (DeeModel    *self);
270 
271   void           (*end_changeset)      (DeeModel    *self);
272 
273   void           (*changeset_started)  (DeeModel    *self);
274 
275   void           (*changeset_finished) (DeeModel    *self);
276 
277   /*< private >*/
278   void     (*_dee_model_1) (void);
279   void     (*_dee_model_2) (void);
280   void     (*_dee_model_3) (void);
281 };
282 
283 GType           dee_model_iter_get_type         (void);
284 
285 /**
286  * dee_model_get_type:
287  *
288  * The GType of #DeeModel
289  *
290  * Return value: the #GType of #DeeModel
291  **/
292 GType           dee_model_get_type              (void);
293 
294 void            dee_model_set_schema            (DeeModel    *self,
295                                                  ...) G_GNUC_NULL_TERMINATED;
296 
297 void            dee_model_set_schema_full       (DeeModel           *self,
298                                                  const gchar* const *column_schemas,
299                                                  guint               num_columns);
300 
301 const gchar* const* dee_model_get_schema     (DeeModel    *self,
302                                               guint       *num_columns);
303 
304 const gchar*    dee_model_get_column_schema  (DeeModel    *self,
305                                               guint        column);
306 
307 const gchar*    dee_model_get_field_schema   (DeeModel    *self,
308                                               const gchar *field_name,
309                                               guint       *out_column);
310 
311 gint            dee_model_get_column_index   (DeeModel     *self,
312                                               const gchar  *column_name);
313 
314 void            dee_model_set_column_names      (DeeModel     *self,
315                                                  const gchar  *first_column_name,
316                                                  ...) G_GNUC_NULL_TERMINATED;
317 
318 void            dee_model_set_column_names_full (DeeModel     *self,
319                                                  const gchar **column_names,
320                                                  guint         num_columns);
321 
322 const gchar**   dee_model_get_column_names      (DeeModel     *self,
323                                                  guint        *num_columns);
324 
325 void            dee_model_register_vardict_schema (DeeModel    *self,
326                                                    guint        column,
327                                                    GHashTable  *schemas);
328 
329 GHashTable*     dee_model_get_vardict_schema    (DeeModel    *self,
330                                                  guint        column);
331 
332 guint           dee_model_get_n_columns   (DeeModel *self);
333 
334 guint           dee_model_get_n_rows      (DeeModel *self);
335 
336 DeeModelIter*   dee_model_append          (DeeModel *self,
337                                            ...);
338 
339 DeeModelIter*   dee_model_append_row      (DeeModel  *self,
340                                            GVariant **row_members);
341 
342 DeeModelIter*   dee_model_prepend         (DeeModel *self,
343                                            ...);
344 
345 DeeModelIter*   dee_model_prepend_row     (DeeModel  *self,
346                                            GVariant **row_members);
347 
348 DeeModelIter*   dee_model_insert           (DeeModel *self,
349                                             guint     pos,
350                                             ...);
351 
352 DeeModelIter*   dee_model_insert_row       (DeeModel  *self,
353                                             guint      pos,
354                                             GVariant **row_members);
355 
356 DeeModelIter*   dee_model_insert_before    (DeeModel     *self,
357                                             DeeModelIter *iter,
358                                             ...);
359 
360 DeeModelIter*   dee_model_insert_row_before (DeeModel     *self,
361                                              DeeModelIter *iter,
362                                              GVariant    **row_members);
363 
364 DeeModelIter*   dee_model_insert_row_sorted (DeeModel           *self,
365                                              GVariant          **row_members,
366                                              DeeCompareRowFunc   cmp_func,
367                                              gpointer            user_data);
368 
369 DeeModelIter*   dee_model_insert_row_sorted_with_sizes (DeeModel              *self,
370                                                         GVariant             **row_members,
371                                                         DeeCompareRowSizedFunc cmp_func,
372                                                         gpointer               user_data);
373 
374 DeeModelIter*   dee_model_insert_sorted (DeeModel           *self,
375                                          DeeCompareRowFunc   cmp_func,
376                                          gpointer            user_data,
377                                          ...);
378 
379 DeeModelIter*  dee_model_find_row_sorted    (DeeModel           *self,
380                                              GVariant          **row_spec,
381                                              DeeCompareRowFunc   cmp_func,
382                                              gpointer            user_data,
383                                              gboolean           *out_was_found);
384 
385 DeeModelIter*  dee_model_find_row_sorted_with_sizes (DeeModel               *self,
386                                                      GVariant             **row_spec,
387                                                      DeeCompareRowSizedFunc cmp_func,
388                                                      gpointer               user_data,
389                                                      gboolean               *out_was_found);
390 
391 DeeModelIter*   dee_model_find_sorted    (DeeModel           *self,
392                                           DeeCompareRowFunc   cmp_func,
393                                           gpointer            user_data,
394                                           gboolean           *out_was_found,
395                                           ...);
396 
397 void            dee_model_remove          (DeeModel     *self,
398                                            DeeModelIter *iter);
399 
400 void            dee_model_clear           (DeeModel *self);
401 
402 void            dee_model_set             (DeeModel     *self,
403                                            DeeModelIter *iter,
404                                            ...);
405 
406 void            dee_model_set_value       (DeeModel       *self,
407                                            DeeModelIter   *iter,
408                                            guint           column,
409                                            GVariant       *value);
410 
411 void            dee_model_set_row         (DeeModel       *self,
412                                            DeeModelIter   *iter,
413                                            GVariant      **row_members);
414 
415 void            dee_model_get             (DeeModel     *self,
416                                            DeeModelIter *iter,
417                                            ...);
418 
419 GVariant**      dee_model_get_row         (DeeModel      *self,
420                                            DeeModelIter  *iter,
421                                            GVariant     **out_row_members);
422 
423 GVariant*       dee_model_get_value       (DeeModel     *self,
424                                            DeeModelIter *iter,
425                                            guint         column);
426 
427 GVariant*       dee_model_get_value_by_name (DeeModel     *self,
428                                              DeeModelIter *iter,
429                                              const gchar  *column_name);
430 
431 DeeModelIter*   dee_model_get_first_iter  (DeeModel     *self);
432 
433 DeeModelIter*   dee_model_get_last_iter   (DeeModel     *self);
434 
435 DeeModelIter*   dee_model_get_iter_at_row (DeeModel     *self,
436                                            guint         row);
437 
438 gboolean        dee_model_get_bool        (DeeModel     *self,
439                                            DeeModelIter *iter,
440                                            guint         column);
441 
442 guchar          dee_model_get_uchar       (DeeModel     *self,
443                                            DeeModelIter *iter,
444                                            guint         column);
445 
446 gint32          dee_model_get_int32       (DeeModel     *self,
447                                            DeeModelIter *iter,
448                                            guint         column);
449 
450 guint32         dee_model_get_uint32      (DeeModel     *self,
451                                            DeeModelIter *iter,
452                                            guint         column);
453 
454 gint64          dee_model_get_int64       (DeeModel     *self,
455                                            DeeModelIter *iter,
456                                            guint         column);
457 
458 guint64         dee_model_get_uint64      (DeeModel     *self,
459                                            DeeModelIter *iter,
460                                            guint         column);
461 
462 gdouble         dee_model_get_double      (DeeModel     *self,
463                                            DeeModelIter *iter,
464                                            guint         column);
465 
466 const gchar *   dee_model_get_string      (DeeModel     *self,
467                                            DeeModelIter *iter,
468                                            guint         column);
469 
470 DeeModelIter *  dee_model_next            (DeeModel     *self,
471                                            DeeModelIter *iter);
472 
473 DeeModelIter *  dee_model_prev            (DeeModel     *self,
474                                            DeeModelIter *iter);
475 
476 gboolean        dee_model_is_first        (DeeModel     *self,
477                                            DeeModelIter *iter);
478 
479 gboolean        dee_model_is_last         (DeeModel     *self,
480                                            DeeModelIter *iter);
481 
482 guint           dee_model_get_position    (DeeModel     *self,
483                                            DeeModelIter *iter);
484 
485 DeeModelTag*    dee_model_register_tag    (DeeModel       *self,
486                                            GDestroyNotify  tag_destroy);
487 
488 gpointer        dee_model_get_tag         (DeeModel       *self,
489                                            DeeModelIter   *iter,
490                                            DeeModelTag    *tag);
491 
492 void            dee_model_set_tag         (DeeModel       *self,
493                                            DeeModelIter   *iter,
494                                            DeeModelTag    *tag,
495                                            gpointer        value);
496 
497 void            dee_model_clear_tag       (DeeModel       *self,
498                                            DeeModelIter   *iter,
499                                            DeeModelTag    *tag);
500 
501 void            dee_model_begin_changeset (DeeModel       *self);
502 
503 void            dee_model_end_changeset   (DeeModel       *self);
504 
505 GVariant**      dee_model_build_row       (DeeModel  *self,
506                                            GVariant **out_row_members,
507                                            ...);
508 
509 GVariant**      dee_model_build_named_row (DeeModel    *self,
510                                            GVariant   **out_row_members,
511                                            const gchar *first_column_name,
512                                            ...) G_GNUC_NULL_TERMINATED;
513 
514 GVariant**      dee_model_build_named_row_valist (DeeModel    *self,
515                                                   GVariant   **out_row_members,
516                                                   const gchar *first_column_name,
517                                                   va_list *args);
518 
519 GVariant**      dee_model_build_named_row_sunk   (DeeModel    *self,
520                                                   GVariant   **out_row_members,
521                                                   guint       *out_array_length,
522                                                   const gchar *first_column_name,
523                                                   ...) G_GNUC_NULL_TERMINATED;
524 
525 G_END_DECLS
526 
527 #endif /* _HAVE_DEE_MODEL_H */
528