示例#1
0
BSONObj* BSONObj::select(const char* sel) const {
	std::set<std::string> columns = bson_splitSelect(sel);
	bool include_all = (strcmp(sel, "*") == 0);

	BSONObj* result = new BSONObj();

	for (std::map<std::string, BSONContent* >::const_iterator i = this->_elements.begin(); i != this->_elements.end(); i++) {
		std::string key = i->first;
		if (include_all || (columns.find(key) != columns.end())) {
			BSONContent* origContent = i->second;

			switch (origContent->type()) {
				case BSON_TYPE:  
					{
						BSONContentBSON* bbson = (BSONContentBSON*)origContent;
						BSONObj* inner = (BSONObj*)*bbson;

						if (!include_all) {
							char* subselect = bson_subselect(sel, key.c_str());
							BSONObj* innerSubSelect = inner->select(subselect);
							result->add(key, *innerSubSelect);
							delete innerSubSelect;
						} else {
							result->add(key, *inner);
						}
						break;
					}
				case BSONARRAY_TYPE: 
					{
						BSONContentBSONArray* bbsonarray = (BSONContentBSONArray*)origContent;
						BSONArrayObj* innerArray = (BSONArrayObj*)*bbsonarray;
						if (!include_all) {
							char* subselect = bson_subselect(sel, key.c_str());
							BSONArrayObj* innerSubArray = innerArray->select(subselect);
							result->add(key, *innerSubArray);
							delete innerSubArray;
						} else {
							result->add(key, *innerArray);
						}
						break;
					}
				case BOOL_TYPE: 
					{
						BSONContentBoolean* bb = (BSONContentBoolean*)origContent;
						bool val = *bb;
						result->add(key, val);
						break;
					}
				case INT_TYPE: 
					{
						BSONContentInt* bint = (BSONContentInt*)origContent;
						__int32 val = *bint;
						result->add(key, val);
						break;
					}
				case LONG_TYPE:
					{
						BSONContentLong* blong = (BSONContentLong*)origContent;
						__int64 val = *blong;
						result->add(key, val);
						break;
					}
				case DOUBLE_TYPE:
					{
						BSONContentDouble* bdouble = (BSONContentDouble*)origContent;
						double val = *bdouble;
						result->add(key, val);
						break;
					}
				case PTRCHAR_TYPE:
				case STRING_TYPE:
					{
						BSONContentString* bstring = (BSONContentString*)origContent;
						djondb::string str = *bstring;
						const char* val = str.c_str();
						__int32 len = str.length();
						result->add(key, const_cast<char*>(val), len);
						break;
					}
			}
		}
	}
	return result;
}
示例#2
0
BSONObj* BSONBufferedObj::select(const char* sel) const {
	std::set<std::string> columns = bson_splitSelect(sel);
	bool include_all = (strcmp(sel, "*") == 0);

	BSONObj* result = new BSONObj();

	for (int x = 0; x < _elements; x++) {
		std::string key(_keys[x], *_keySize[x]);
		if (include_all || (columns.find(key) != columns.end())) {
			BSONTYPE type = getType(const_cast<char*>(key.c_str()));

			switch (type) {
				case BSON_TYPE:  
					{
						BSONBufferedObj* inner = getBSON(key);

						char* subselect = "*";
						if (!include_all) {
							subselect = bson_subselect(sel, key.c_str());
						}
						BSONObj* innerSubSelect = inner->select(subselect);
						result->add(key, *innerSubSelect);
						delete innerSubSelect;
						break;
					}
				case BSONARRAY_TYPE: 
					{
						BSONArrayObj* innerArray = getBSONArray(key);
						char* subselect = "*";
						if (!include_all) {
							subselect = bson_subselect(sel, key.c_str());
						}
						BSONArrayObj* innerSubArray = innerArray->select(subselect);
						result->add(key, *innerSubArray);
						delete innerSubArray;
						break;
					}
				case BOOL_TYPE: 
					{
						bool val = getBoolean(key);
						result->add(key, val);
						break;
					}
				case INT_TYPE: 
					{
						__int32 val = getInt(key);
						result->add(key, val);
						break;
					}
				case LONG_TYPE:
					{
						__int64 val = getLong(key);
						result->add(key, val);
						break;
					}
				case LONG64_TYPE:
					{
						__LONG64 val = getLong(key);
						result->add(key, val);
						break;
					}
				case DOUBLE_TYPE:
					{
						double val = getDouble(key);
						result->add(key, val);
						break;
					}
				case STRING_TYPE:
				case PTRCHAR_TYPE:
					{
						djondb::string val = getDJString(key);
						result->add(key, const_cast<char*>(val.c_str()), val.length());
						break;
					}
			}
		}
	}
	return result;
}