void JsonPrepareThread::run()
    {
        int position = 1; // 1-based numbering to match tree & table views
        for(std::vector<MongoDocumentPtr>::const_iterator it = _bsonObjects.begin();it!=_bsonObjects.end();++it)
        {
            MongoDocumentPtr doc = *it;
            mongo::StringBuilder sb;
            if (position == 1)
                sb << "/* 1 */\n";
            else
                sb << "\n\n/* " << position << " */\n";

            mongo::BSONObj obj = doc->bsonObj();
            std::string stdJson = BsonUtils::jsonString(obj, mongo::TenGen, 1, _uuidEncoding, _timeZone);

            if (_stop)
                break;

            sb << stdJson;
            QString json = QtUtils::toQString(sb.str());

            if (_stop)
                break;

            emit partReady(json);

            position++;
        }

        emit done();
    }
Exemple #2
0
 BsonTableModel::BsonTableModel(const std::vector<MongoDocumentPtr> &documents, QObject *parent) 
     : BaseClass(parent) ,
     _root(new BsonTableItem(this))
 {
     for (std::vector<MongoDocumentPtr>::const_iterator it = documents.begin(); it!=documents.end(); ++it)
     {
         MongoDocumentPtr doc = (*it);
         parseDocument(_root,doc->bsonObj());
     }
 }
Exemple #3
0
    void BsonTreeItem::expand()
    {
        QtUtils::clearChildItems(this);
        MongoDocumentPtr document = _document ? _document : _element->asDocument();
        bool isArray = _element ? _element->isArray() : false;

        MongoDocumentIterator iterator(document.get());

        int position = 0;
        while(iterator.hasMore())
        {
            MongoElementPtr element = iterator.next();
            BsonTreeItem *childItem = new BsonTreeItem(_rootDocument, element, isArray ? position : -1);
            addChild(childItem);
            position++;
        }
    }
Exemple #4
0
    BsonTreeModel::BsonTreeModel(const std::vector<MongoDocumentPtr> &documents, QObject *parent) :
        BaseClass(parent),
        _root(new BsonTreeItem(this))
    {
        for (int i = 0; i < documents.size(); ++i) {
            MongoDocumentPtr doc = documents[i]; 
            BsonTreeItem *child = new BsonTreeItem(doc->bsonObj(), _root);
            parseDocument(child, doc->bsonObj(), doc->bsonObj().isArray());

            QString idValue;
            BsonTreeItem *idItem = child->childByKey("_id");
            if (idItem) {
                idValue = idItem->value();
            }

            child->setKey(QString("(%1) %2").arg(i + 1).arg(idValue));

            int count = BsonUtils::elementsCount(doc->bsonObj());

            if (doc->bsonObj().isArray()) {
                child->setValue(arrayValue(count));
                child->setType(mongo::Array);
            } else {
                child->setValue(objectValue(count));
                child->setType(mongo::Object);
            }
            _root->addChild(child);
        }
    }
    CollectionStatsTreeItem::CollectionStatsTreeItem(MongoDocumentPtr document) :
    _document(document)
    {
        _obj = document->bsonObj();

        MongoNamespace ns(getString("ns"));

        setText(0, prepareValue(ns.collectionName()));
        setIcon(0, GuiRegistry::instance().collectionIcon());
        setText(1, prepareValue(QString::number(getLongLong("count"))));
        setText(2, prepareValue(MongoUtils::buildNiceSizeString(getDouble("size"))));
        setText(3, prepareValue(MongoUtils::buildNiceSizeString(getDouble("storageSize"))));
        setText(4, prepareValue(MongoUtils::buildNiceSizeString(getDouble("totalIndexSize"))));
        setText(5, prepareValue(MongoUtils::buildNiceSizeString(getDouble("avgObjSize"))));
        setText(6, prepareValue(QString::number(getDouble("paddingFactor"))));
    }
Exemple #6
0
    /*
    ** Build Json string that represent this element.
    */
    void MongoElement::buildJsonString(Concatenator &con)
    {
        switch (_bsonElement.type())
        {
        /** double precision floating point value */
        case NumberDouble:
            con.append(QString::number(_bsonElement.Double()));
            break;

        /** character string, stored in utf8 */
        case String:
            {
            /*
            ** If you'll write:
            ** 
            **   int valsize    = element.valuesize();
            **   int strsize    = element.valuestrsize();
            **   int bytescount = qstrlen(element.valuestr());
            **  
            ** You'll get:
            **
            **   bytescount + 1 == strsize
            **   strsize + 4    == valsize
            **
            ** So:
            **   bytescount + 5 == valsize
            **
            */

                QString res = QString::fromUtf8(_bsonElement.valuestr(), _bsonElement.valuestrsize() - 1);
                con.append(res);
            }
            break;

        /** an embedded object */
        case Object:
            {
                MongoDocumentPtr doc = asDocument();
                doc->buildJsonString(con);
            }
            break;

        /** an embedded array */
        case Array:
            {
                MongoDocumentPtr doc = asDocument();
                doc->buildJsonString(con);
            }
            break;

        /** binary data */
        case BinData:
            {
                mongo::BinDataType binType = _bsonElement.binDataType();
                if (binType == mongo::newUUID || binType == mongo::bdtUUID) {
                    std::string uuid = HexUtils::formatUuid(_bsonElement, AppRegistry::instance().settingsManager()->uuidEncoding());
                    con.append(QString::fromStdString(uuid));
                    break;
                }

                con.append("<binary>");
            }
            break;

        /** Undefined type */
        case Undefined:
            con.append("<undefined>");
            break;

        /** ObjectId */
        case jstOID:
            {
                QString idValue = QString::fromStdString(_bsonElement.OID().toString());
                QString objectId = QString("ObjectId(\"%1\")").arg(idValue);
                con.append(objectId);
            }
            break;

        /** boolean type */
        case Bool:
            con.append(_bsonElement.Bool() ? "true" : "false");
            break;

        /** date type */
        case Date:
        {
            long long ms = (long long) _bsonElement.Date().millis;

            boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
            boost::posix_time::time_duration diff = boost::posix_time::millisec(ms);
            boost::posix_time::ptime time = epoch + diff;



            std::stringstream strm;

            //boost::date_time::time_facet *timeFacet = new boost::date_time::time_facet("%a, %d %b %Y %H:%M:%S.%f GMT"); // "%Y---%m-%d %H:%M:%S"
            boost::posix_time::time_facet *facet = new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S");
            strm.imbue(std::locale(strm.getloc(), facet));
            strm << time;

            con.append(QString::fromStdString(strm.str()));
            break;

            /*
            // this code is left untill the upper one will stabilize
            unsigned long long millis = _bsonElement.Date().millis;
            if ((long long)millis >= 0 &&
            ((long long)millis/1000) < (std::numeric_limits<time_t>::max)()) {
            con.append(QString::fromStdString(_bsonElement.Date().toString()));
            }
            break;
            */
        }

        /** null type */
        case jstNULL:
            con.append(QString("<null>"));
            break;

        /** regular expression, a pattern with options */
        case RegEx:
            {
                con.append("/" + QString::fromUtf8(_bsonElement.regex()) + "/");

                for ( const char *f = _bsonElement.regexFlags(); *f; ++f ) {
                    switch ( *f ) {
                    case 'g':
                    case 'i':
                    case 'm':
                        con.append(QString(*f));
                    default:
                        break;
                    }
                }
            }
            break;

        /** deprecated / will be redesigned */
        case DBRef:
            break;

        /** deprecated / use CodeWScope */
        case Code:
            con.append(QString::fromUtf8(_bsonElement._asCode().data()));
            break;

        /** a programming language (e.g., Python) symbol */
        case Symbol:
            con.append(QString::fromUtf8(_bsonElement.valuestr(), _bsonElement.valuestrsize() - 1));
            break;

        /** javascript code that can execute on the database server, with SavedContext */
        case CodeWScope:
            {
                mongo::BSONObj scope = _bsonElement.codeWScopeObject();
                if (!scope.isEmpty() ) {
                    con.append(QString::fromUtf8(_bsonElement._asCode().data()));
                    break;
                }
            }
            break;

        /** 32 bit signed integer */
        case NumberInt:
            con.append(QString::number(_bsonElement.Int()));
            break;

        /** Updated to a Date with value next OpTime on insert */
        case Timestamp:
            {
                Date_t date = _bsonElement.timestampTime();
                unsigned long long millis = date.millis;
                if ((long long)millis >= 0 &&
                    ((long long)millis/1000) < (std::numeric_limits<time_t>::max)()) {
                        con.append(QString::fromStdString(date.toString()));
                }
                break;
            }

        /** 64 bit integer */
        case NumberLong:
            con.append(QString::number(_bsonElement.Long()));
            break; 

        default:
            con.append("<unsupported>");
            break;
        }
    }
Exemple #7
0
    /*
    ** Build Json string that represent this element.
    */
    void MongoElement::buildJsonString(std::string &con)
    {
        switch (_bsonElement.type())
        {
        /** double precision floating point value */
        case NumberDouble:
            con.append(QtUtils::toStdString<std::string>(QString::number(_bsonElement.Double(),'g',14)));
            break;

        /** character string, stored in utf8 */
        case String:
            {
            /*
            ** If you'll write:
            ** 
            **   int valsize    = element.valuesize();
            **   int strsize    = element.valuestrsize();
            **   int bytescount = qstrlen(element.valuestr());
            **  
            ** You'll get:
            **
            **   bytescount + 1 == strsize
            **   strsize + 4    == valsize
            **
            ** So:
            **   bytescount + 5 == valsize
            **
            */

                con.append(_bsonElement.valuestr(), _bsonElement.valuestrsize() - 1);
            }
            break;

        /** an embedded object */
        case Object:
            {
                MongoDocumentPtr doc = asDocument();
                doc->buildJsonString(con);
            }
            break;

        /** an embedded array */
        case Array:
            {
                MongoDocumentPtr doc = asDocument();
                doc->buildJsonString(con);
            }
            break;

        /** binary data */
        case BinData:
            {
                mongo::BinDataType binType = _bsonElement.binDataType();
                if (binType == mongo::newUUID || binType == mongo::bdtUUID) {
                    std::string uuid = HexUtils::formatUuid(_bsonElement, AppRegistry::instance().settingsManager()->uuidEncoding());
                    con.append(uuid);
                    break;
                }

                con.append("<binary>");
            }
            break;

        /** Undefined type */
        case Undefined:
            con.append("<undefined>");
            break;

        /** ObjectId */
        case jstOID:
            {
                std::string idValue = _bsonElement.OID().toString();
                char buff[256]={0};
                sprintf(buff,"ObjectId(\"%s\")",idValue.c_str());
                con.append(buff);
            }
            break;

        /** boolean type */
        case Bool:
            con.append(_bsonElement.Bool() ? "true" : "false");
            break;

        /** date type */
        case Date:
        {
            long long ms = (long long) _bsonElement.Date().millis;

            boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
            boost::posix_time::time_duration diff = boost::posix_time::millisec(ms);
            boost::posix_time::ptime time = epoch + diff;

            std::string date = miutil::isotimeString(time,false,AppRegistry::instance().settingsManager()->timeZone()==LocalTime);

            con.append(date);
            break;
        }

        /** null type */
        case jstNULL:
            con.append("<null>");
            break;

        /** regular expression, a pattern with options */
        case RegEx:
            {
                con.append("/" + std::string(_bsonElement.regex()) + "/");

                for ( const char *f = _bsonElement.regexFlags(); *f; ++f ) {
                    switch ( *f ) {
                    case 'g':
                    case 'i':
                    case 'm':
                            con+=*f;
                    default:
                        break;
                    }
                }
            }
            break;

        /** deprecated / will be redesigned */
        case DBRef:
            break;

        /** deprecated / use CodeWScope */
        case Code:
            con.append(_bsonElement._asCode());
            break;

        /** a programming language (e.g., Python) symbol */
        case Symbol:
            con.append(_bsonElement.valuestr(), _bsonElement.valuestrsize() - 1);
            break;

        /** javascript code that can execute on the database server, with SavedContext */
        case CodeWScope:
            {
                mongo::BSONObj scope = _bsonElement.codeWScopeObject();
                if (!scope.isEmpty() ) {
                    con.append(_bsonElement._asCode());
                    break;
                }
            }
            break;

        /** 32 bit signed integer */
        case NumberInt:
            {
                char num[16]={0};
                sprintf(num,"%d",_bsonElement.Int());
                con.append(num);
                break;
            }           

        /** Updated to a Date with value next OpTime on insert */
        case Timestamp:
            {
                Date_t date = _bsonElement.timestampTime();
                unsigned long long millis = date.millis;
                if ((long long)millis >= 0 &&
                    ((long long)millis/1000) < (std::numeric_limits<time_t>::max)()) {
                        con.append(date.toString());
                }
                break;
            }

        /** 64 bit integer */
        case NumberLong:
            {
                char num[32]={0};
                sprintf(num,"%lld",_bsonElement.Long());
                con.append(num);
                break; 
            }
        default:
            con.append("<unsupported>");
            break;
        }
    }
 std::string MongoDocument::buildJsonString(const MongoDocumentPtr &doc)
 {
     //qt4 QTextCodec::setCodecForCStrings(codec);
     std::string jsonString = doc->bsonObj().jsonString(mongo::TenGen, 1);
     return jsonString;
 }