summaryrefslogtreecommitdiff
path: root/docs/tutorial/examples/tut_bson_traverse.c
blob: 4be7b1d3b1c334330dd250e509733157e2d53444 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <mongo.h>

#include <string.h>
#include <stdio.h>

bson *
tut_bson (void)
{
  bson *b;

  b = bson_build_full
    (BSON_TYPE_STRING, "author", FALSE, "Gergely Nagy", -1,
     BSON_TYPE_ARRAY, "pages", TRUE,
       bson_build_full (BSON_TYPE_DOCUMENT, "1", TRUE,
                        bson_build (BSON_TYPE_STRING, "title", "BSON tutorial", -1,
                                    BSON_TYPE_STRING, "content", "...", -1,
                                    BSON_TYPE_INT32, "importance", 1,
                                    BSON_TYPE_NONE),
                        BSON_TYPE_DOCUMENT, "2", TRUE,
                        bson_build (BSON_TYPE_STRING, "title", "Some other thing", -1,
                                    BSON_TYPE_STRING, "content", "...", -1,
                                    BSON_TYPE_INT32, "importance", 0,
                                    BSON_TYPE_NONE),
                        BSON_TYPE_NONE),
     BSON_TYPE_BOOLEAN, "inline", FALSE, TRUE,
     BSON_TYPE_NONE);
  bson_finish (b);

  return b;
}

int
main (void)
{
  bson *doc;
  bson_cursor *c, *c_arr, *c_page;

  bson *v_doc, *v_array;
  gboolean v_bool;
  const gchar *v_str;

  doc = tut_bson ();

  c = bson_find (doc, "author");
  bson_cursor_get_string (c, &v_str);
  printf ("Author: %s\n", v_str);

  bson_cursor_next (c);
  bson_cursor_next (c);

  bson_cursor_get_boolean (c, &v_bool);
  printf ("inline: %s\n", (v_bool) ? "TRUE" : "FALSE");

  bson_cursor_free (c);

  c = bson_find (doc, "author");
  bson_cursor_get_string (c, &v_str);
  bson_cursor_free (c);
  c = bson_find (doc, "inline");
  bson_cursor_get_boolean (c, &v_bool);
  bson_cursor_free (c);

  printf ("Author: %s; inline: %s; (bson_find)\n",
          v_str, (v_bool) ? "TRUE" : "FALSE");

  c = bson_find (doc, "author");
  bson_cursor_get_string (c, &v_str);
  while (bson_cursor_next (c))
    {
      if (strcmp (bson_cursor_key (c), "inline") == 0)
        {
          bson_cursor_get_boolean (c, &v_bool);
          break;
        }
    }
  bson_cursor_free (c);

  printf ("Author: %s; inline: %s; (bson_cursor_next)\n",
          v_str, (v_bool) ? "TRUE" : "FALSE");

  c = bson_find (doc, "author");
  bson_cursor_get_string (c, &v_str);
  bson_cursor_find_next (c, "inline");
  bson_cursor_get_boolean (c, &v_bool);
  bson_cursor_free (c);

  printf ("Author: %s; inline: %s; (bson_cursor_find_next)\n",
          v_str, (v_bool) ? "TRUE" : "FALSE");

  c = bson_find (doc, "pages");
  bson_cursor_find (c, "inline");
  bson_cursor_get_boolean (c, &v_bool);
  bson_cursor_find (c, "author");
  bson_cursor_get_string (c, &v_str);
  bson_cursor_free (c);

  printf ("Author: %s; inline: %s; (bson_cursor_find)\n",
          v_str, (v_bool) ? "TRUE" : "FALSE");

  c = bson_cursor_new (doc);
  while (bson_cursor_next (c))
    {
      printf ("Key: %s; type=%s\n", bson_cursor_key (c),
              bson_cursor_type_as_string (c));
    }
  bson_cursor_free (c);

  c = bson_find (doc, "pages");
  bson_cursor_get_array (c, &v_array);
  c_arr = bson_find (v_array, "2");
  bson_cursor_get_document (c_arr, &v_doc);
  c_page = bson_find (v_doc, "title");
  bson_cursor_get_string (c_page, &v_str);

  bson_cursor_free (c_page);
  bson_cursor_free (c_arr);
  bson_cursor_free (c);

  printf ("Title of the 2nd page in the pages array: %s\n", v_str);

  bson_free (doc);
  return 0;
}