aboutsummaryrefslogtreecommitdiff
path: root/db/uobject.cpp
blob: bfaf7df61b51e2e538efc62812498a7da3ea8ad9 (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
124
125
126
#include "uobject.h"

using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::make_document;

std::string uobject::retrieveAll(std::string collection, struct json_object* jsonObjects) {

    auto conn = mongo.get_connection();

    auto coll = (*conn)[config["mongo_db"]][collection];

    auto cursor = coll.find({});

    for (auto&& doc : cursor) {
        json_object_array_add(jsonObjects, json_tokener_parse(bsoncxx::to_json(doc).c_str()));
    }

    return json_object_to_json_string_ext(jsonObjects, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY);
}

std::string uobject::add(std::string collection, struct json_object* jsonObject, const char * body) {
    auto conn = mongo.get_connection();

    auto coll = (*conn)[config["mongo_db"]][collection];

    auto document = bsoncxx::from_json(body);

    auto result = coll.insert_one(document.view());

    std::string oid = result->inserted_id().get_oid().value.to_string();


    int stringlen = 0;
    stringlen = strlen( body );
    struct json_tokener *tok = json_tokener_new();
    enum json_tokener_error jerr;

    json_object *json_datas = NULL;

    do {
        json_datas = json_tokener_parse_ex(tok, body, stringlen);
    } while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);

    if (jerr != json_tokener_success)
    {
        fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
    }

    if (json_object_get_type(json_datas) == json_type_object) {
        /* Create an object with the following template:
            * {
            *  "_id": {
            *      "$oid": "5d484d371ec4865f767d8424"
            *  },
            *  "datas": {
            *      [...]
            *  }
            * }
        */

        auto json_id = json_object_new_object();
        auto json_oid = json_object_new_string(oid.c_str());

        json_object_object_add(json_id, "$oid", json_oid);
        json_object_object_add(jsonObject, "_id", json_id);
        json_object_object_add(jsonObject, "datas", json_datas);
    } else {
        std::cout << typeid(json_datas).name() << std::endl;
        std::cout << "json_datas type: " << json_type_to_name(json_object_get_type(json_datas)) << std::endl;
    }
    json_tokener_free(tok);

    return json_object_to_json_string_ext(jsonObject, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY);
}

std::string uobject::remove(std::string collection, std::string oid, struct json_object* jsonObject) {
    auto conn = mongo.get_connection();

    auto coll = (*conn)[config["mongo_db"]][collection];

    auto result = coll.delete_one(make_document(kvp("_id", bsoncxx::oid(oid))));


    if (result->deleted_count() > 0) {
        /* Create an object with the following template:
            * {
            *  "_id": {
            *      "$oid": "5d484d371ec4865f767d8424"
            *  },
            *  "datas": {
            *      [...]
            *  }
            * }
        */

        auto json_id = json_object_new_object();
        auto json_oid = json_object_new_string(oid.c_str());

        json_object_object_add(json_id, "$oid", json_oid);
        json_object_object_add(jsonObject, "_id", json_id);
        json_object_object_add(jsonObject, "datas", {});
    }
    return json_object_to_json_string_ext(jsonObject, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY);
}

std::string uobject::searchKeyValue(std::string collection, std::string key, std::string value, struct json_object* jsonArray) {
    auto conn = mongo.get_connection();

    auto coll = (*conn)[config["mongo_db"]][collection];

    // Generate a string with the folowing format:
    // {"datas.key":"value"}
    std::string json_string = "{\"datas.";
    json_string += key;
    json_string += "\":\"";
    json_string += value;
    json_string += "\"}";

    auto cursor = coll.find(bsoncxx::from_json(json_string));

    for (auto&& doc : cursor) {
        json_object_array_add(jsonArray, json_tokener_parse(bsoncxx::to_json(doc).c_str()));
    }

    return json_object_to_json_string_ext(jsonArray, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY);
}