1 #define __STRICT_ANSI__ 1
2 
3 #include <bson.h>
4 #include <json.h>
5 
6 #include <stdio.h>
tut_bson(void)7 #include <unistd.h>
8 #include <glib.h>
9 
10 static bson *json_to_bson (struct json_object *json);
11 
12 static void
13 json_key_to_bson_key (bson *b, void *val,
14                       const gchar *key)
15 {
16   switch (json_object_get_type (val))
17     {
18     case json_type_boolean:
19       bson_append_boolean (b, key, json_object_get_boolean (val));
20       break;
21     case json_type_double:
22       bson_append_double (b, key, json_object_get_double (val));
23       break;
24     case json_type_int:
25       bson_append_int32 (b, key, json_object_get_int (val));
26       break;
27     case json_type_string:
28       bson_append_string (b, key, json_object_get_string (val), -1);
29       break;
30     case json_type_object:
31       {
32         bson *sub;
main(void)33 
34         sub = json_to_bson (val);
35         bson_append_document (b, key, sub);
36         bson_free (sub);
37         break;
38       }
39     case json_type_array:
40       {
41         gint pos;
42         bson *sub;
43 
44         sub = bson_new ();
45 
46         for (pos = 0; pos < json_object_array_length (val); pos++)
47           {
48             gchar *nk = g_strdup_printf ("%d", pos);
49 
50             json_key_to_bson_key (sub, json_object_array_get_idx (val, pos),
51                                   nk);
52             g_free (nk);
53           }
54         bson_finish (sub);
55 
56         bson_append_array (b, key, sub);
57         bson_free (sub);
58         break;
59       }
60     default:
61       break;
62     }
63 }
64 
65 static void
66 json_to_bson_foreach (bson *b, struct json_object *json)
67 {
68   json_object_object_foreach (json, key, val)
69     {
70       json_key_to_bson_key (b, val, key);
71     }
72 }
73 
74 static bson *
75 json_to_bson (struct json_object *json)
76 {
77   bson *b;
78 
79   b = bson_new ();
80   json_to_bson_foreach (b, json);
81   bson_finish (b);
82 
83   return b;
84 }
85 
86 int
87 main (int argc, char **argv)
88 {
89   GIOChannel *input;
90   GString *json_str;
91   GError *error = NULL;
92   struct json_tokener *tokener;
93 
94   input = g_io_channel_unix_new (0);
95 
96   json_str = g_string_new (NULL);
97   tokener = json_tokener_new ();
98 
99   while (g_io_channel_read_line_string (input, json_str,
100                                         NULL, &error) == G_IO_STATUS_NORMAL)
101     {
102       struct json_object *json;
103       bson *bson;
104 
105       json_tokener_reset (tokener);
106 
107       json = json_tokener_parse_ex (tokener, json_str->str, json_str->len);
108       if (!json)
109         {
110           fprintf (stderr, "Error parsing json: %s\n", json_str->str);
111           break;
112         }
113 
114       if (json_object_get_type (json) != json_type_object)
115         {
116           fprintf (stderr,
117                    "Error: json's top-level object is not object: %s\n",
118                    json_str->str);
119           json_object_put (json);
120           break;
121         }
122 
123       bson = json_to_bson (json);
124       json_object_put (json);
125 
126       write (1, bson_data (bson), bson_size (bson));
127 
128       bson_free (bson);
129     }
130 
131   return 0;
132 }
133