diff --git a/db/bson/Makefile.am b/db/bson/Makefile.am index ff7e2f4..34e5bc4 100644 --- a/db/bson/Makefile.am +++ b/db/bson/Makefile.am @@ -11,14 +11,13 @@ AM_CPPFLAGS += $(all_includes) lib_LTLIBRARIES = libdjon-bson.la libdjon_bson_la_LDFLAGS = -static libdjon_bson_la_SOURCES = bsonobj.cpp \ - bsonobj.h \ bsonarrayobj.cpp \ bsonutil.cpp \ bsoncontent.cpp \ bsonparser.cpp library_includedir=$(includedir)/djondb -library_include_HEADERS = bson.h bsonobj.h bsonparser.h bsondefs.h bsoncontent.h bsonarrayobj.h +library_include_HEADERS = bson.h bsonobj.h bsonutil.h bsonparser.h bsondefs.h bsoncontent.h bsonarrayobj.h TESTS = test-bson bin_PROGRAMS = test-bson test-performance @@ -28,6 +27,7 @@ if !MAC test_bson_LDADD += -lrt -luuid else endif + test_bson_SOURCES = tests/main.cpp test_performance_SOURCES = tests/testperformance.cpp diff --git a/db/bson/bsonutil.cpp b/db/bson/bsonutil.cpp index 4d94644..ffc7c28 100644 --- a/db/bson/bsonutil.cpp +++ b/db/bson/bsonutil.cpp @@ -17,6 +17,11 @@ */ #include "bsonutil.h" +#include "util.h" +#include +#include +#include + std::set bson_splitSelect(const char* select) { std::vector elements = split(std::string(select), ","); @@ -41,13 +46,15 @@ std::set bson_splitSelect(const char* select) { } char* bson_subselect(const char* select, const char* name) { - std::set elements = splitSelect(select); - MemoryStream ms(2048); + std::vector elements = split(std::string(select), ", "); + char* result = (char*)malloc(strlen(select) + 1); + memset(result, 0, strlen(select) + 1); + int pos = 0; std::string startXpath = format("%s.", name); int lenStartXpath = startXpath.length(); bool first = true; - for (std::set::const_iterator i = elements.begin(); i != elements.end(); i++) { + for (std::vector::const_iterator i = elements.begin(); i != elements.end(); i++) { std::string selement = *i; char* element = const_cast(selement.c_str()); element = trim(element, strlen(element)); @@ -55,14 +62,21 @@ char* bson_subselect(const char* select, const char* name) { // Remvoes the $" " from the element element = strcpy(element, 2, strlen(element) - 3); if (startsWith(element, startXpath.c_str())) { - char* suffix = strcpy(element, lenStartXpath, strlen(element) - lenStartXpath); - ms.writeChars(suffix, strlen(suffix)); if (!first) { - ms.writeChars(", ", 2); + memcpy(result + pos, ", ", 2); + pos += 2; } + char* suffix = strcpy(element, lenStartXpath, strlen(element) - lenStartXpath); + memcpy(result + pos, "$\"", 2); + pos+=2; + memcpy(result + pos, suffix, strlen(suffix)); + pos += strlen(suffix); + memcpy(result + pos, "\"", 1); + pos++; first = false; free(suffix); } } } + return result; } diff --git a/db/bson/bsonutil.h b/db/bson/bsonutil.h index dd85a33..8f84ad6 100644 --- a/db/bson/bsonutil.h +++ b/db/bson/bsonutil.h @@ -18,6 +18,9 @@ #ifndef BSONUTIL_INCLUDE_H #define BSONUTIL_INCLUDE_H +#include +#include + std::set bson_splitSelect(const char* select); char* bson_subselect(const char* select, const char* elment); diff --git a/db/bson/tests/main.cpp b/db/bson/tests/main.cpp index ef8a529..582e15a 100644 --- a/db/bson/tests/main.cpp +++ b/db/bson/tests/main.cpp @@ -17,7 +17,8 @@ // ********************************************************************************************************************* #include -#include "../bson.h" +#include "bson.h" +#include "bsonutil.h" #include #include #include @@ -43,6 +44,7 @@ class TestBSONSuite : public Test::Suite TEST_ADD(TestBSONSuite::testComparison); TEST_ADD(TestBSONSuite::testAutocasting); TEST_ADD(TestBSONSuite::testXPath); + TEST_ADD(TestBSONSuite::testBSONUtil); } private: @@ -453,6 +455,41 @@ class TestBSONSuite : public Test::Suite delete obj1; } + void testBSONUtil() { + cout << "\ntestBSONUtil" << endl; + + char* selectsimple = "$\"test\""; + std::set result = bson_splitSelect("$\"test\""); + TEST_ASSERT(result.size() == 1); + TEST_ASSERT(result.find("test") != result.end()); + + selectsimple = "$\"test\", $\"test2\""; + result = bson_splitSelect("$\"test\""); + TEST_ASSERT(result.size() == 1); + TEST_ASSERT(result.find("test") != result.end()); + result = bson_splitSelect("$\"test2\""); + TEST_ASSERT(result.size() == 1); + TEST_ASSERT(result.find("test2") != result.end()); + + selectsimple = "$\"test\", $\"test2.inner1\""; + result = bson_splitSelect("$\"test\""); + TEST_ASSERT(result.size() == 1); + TEST_ASSERT(result.find("test") != result.end()); + result = bson_splitSelect("$\"test\", $\"test2\""); + TEST_ASSERT(result.size() == 2); + TEST_ASSERT(result.find("test") != result.end()); + TEST_ASSERT(result.find("test2") != result.end()); + + selectsimple = "$\"test2.inner\""; + char* subresult = bson_subselect(selectsimple, "test2"); + char* expected = "$\"inner\""; + TEST_ASSERT(strcmp(subresult, expected) == 0); + + selectsimple = "$\"test1\", $\"test2.inner\", $\"test1.testinner\", $\"test2.inner2\", $\"test2.inner2.testii\""; + subresult = bson_subselect(selectsimple, "test2"); + expected = "$\"inner\", $\"inner2\", $\"inner2.testii\""; + TEST_ASSERT(strcmp(subresult, expected) == 0); + } }; enum OutputType