void mime::Mongo::updateTFIDF(mongo::DBClientConnection &c, std::string &ns, const mongo::OID &oid, std::map<std::string, std::pair<float, float> > &tokens) { c.update(ns, BSON("_id"<<oid), BSON("$unset"<<BSON("tf"<<1))); mongo::BSONArrayBuilder arrb; for(std::map<std::string, std::pair<float, float> >::iterator it=tokens.begin();it!=tokens.end();++it) { std::pair<float, float> p = it->second; arrb.append(BSON("w"<<it->first<<"f"<<p.first<<"idf"<<p.second)); } c.update(ns, BSON("_id"<<oid), BSON("$set"<<BSON("tf"<<arrb.arr()))); }
void mime::Mongo::updateTF(mongo::DBClientConnection &c, std::string &ns, const mongo::OID &oid, std::map<std::string, int> &tokens) { int total = tokens.size(); if (total == 0) return; c.update(ns, BSON("_id"<<oid), BSON("$unset"<<BSON("tf"<<1))); mongo::BSONArrayBuilder arrb; for(std::map<std::string, int>::iterator it=tokens.begin();it!=tokens.end();++it) { float tf = (float)it->second/total; arrb.append(BSON("w"<<it->first<<"f"<<tf)); } c.update(ns, BSON("_id"<<oid), BSON("$set"<<BSON("tf"<<arrb.arr()))); }
/********************************************************** *convert FileRec to bson, then write to db * ***********************************************************/ void FileRec::writeToDB(mongo::DBClientConnection &conn) { BSONObjBuilder record; //build BSONObj record.append("filename", this->filename); record.append("Tempname", this->tempname); record.append("curhash", this->recentHash); record.append("ovhash", this->origHash); record.append("length", this->length); record.append("nversions", this->versionCount); /* love you */ long long time = this->modifytime.tv_nsec; record.append("Mtnsec", time); time = this->modifytime.tv_sec; record.append("mtsec", time); record.append("currentversion", this->refNum); mongo::BSONArrayBuilder bArr; //arrays to store multiple objects inside main object mongo::BSONArrayBuilder Comments; for (vector<string>::iterator it = blockhashes.begin(); it != blockhashes.end(); ++it) { bArr.append(*it); } for (vector<comment>::iterator it = comments.begin(); it != comments.end(); ++it) { BSONObjBuilder comment; comment.append("version", it->version); // comment.append("comment", it->comment); Comments.append(comment.obj()); } if (!versions.empty()) { //if there are id's in the versions collection mongo::BSONArrayBuilder Version; //store the id's in an BSONarray for (vector<string>::iterator it = versions.begin(); it != versions.end(); ++it) { BSONObjBuilder version; version.append("id", (*it)); Version.append(version.obj()); } record.append("versionrec", Version.arr()); } record.append("FileBlkHashes", bArr.arr()); //adding arrays to main record record.append("comments", Comments.arr()); BSONObj result = record.obj(); auto_ptr<mongo::DBClientCursor> cursor = conn.query("fileRecords.Filerec", MONGO_QUERY("filename" << filename)); if (cursor->more()) {//already file rec in db so update conn.update("fileRecords.Filerec", MONGO_QUERY("filename" << filename), result); } else { conn.insert("fileRecords.Filerec", result); //must be new record } string e = conn.getLastError(); if (!e.empty()) { cout << "something failed failed: " << e << std::endl; sleep(1); exit(1); } else{ cout << "record " << this->refNum << " successfully written to database" << endl; } }
/********************************************************** *similar to writetodb in FileRec * ***********************************************************/ void VersionRec::writeToDB(mongo::DBClientConnection& conn) { BSONObjBuilder record; if (this->versionid.empty()) { //if no id has been read in because it is a new version record.genOID();//create one } else { mongo::OID theoid(this->versionid); //use current id record.append("_id", theoid); } //convert to BSON record.append("Tempname", this->tmpname); record.append("filehash", this->filehash); record.append("length", this->length); record.append("Version", this->versionnumber); /* love you */ long long time = this->modifytime.tv_nsec; record.append("Mtnsec", time); time = this->modifytime.tv_sec; record.append("mtsec", time); mongo::BSONArrayBuilder Version; for (vector<VersionDiffBlock>::iterator it = changes.begin(); it != changes.end(); ++it) { BSONObjBuilder version; version.append("Blknum", (*it).blockNo); version.append("hash", (*it).blockHash); Version.append(version.obj()); } record.append("Blktable", Version.arr()); BSONObj result = record.obj(); if (this->versionid.empty()) { mongo::BSONElement thing; result.getObjectID(thing); mongo::OID anoid = thing.OID(); this->versionid = anoid.toString(); } auto_ptr<mongo::DBClientCursor> cursor = conn.query("fileRecords.FileVersion", MONGO_QUERY("_id" << mongo::OID(this->versionid))); if (cursor->more()) {//already a version with same id, update conn.update("fileRecords.FileVersion", MONGO_QUERY("_id" << mongo::OID(this->versionid)), result); } else { //new version conn.insert("fileRecords.FileVersion", result); } string e = conn.getLastError(); if (!e.empty()) { cout << "something failed failed: " << e << std::endl; sleep(1); exit(1); } else{ cout << "Version " << this->versionnumber << " successfully written to database" << endl; } }
void ubcallback(void *mydata, int err, struct ub_result *result) { if (err < 0) return; int *resolving = (int*)mydata; (*resolving)--; cout << *resolving << endl; if (result->havedata) { cdpi_dns dns_decoder; if (dns_decoder.decode((char*)result->answer_packet, result->answer_len)) { const std::list<cdpi_dns_rr> &answer = dns_decoder.get_answer(); std::list<cdpi_dns_rr>::const_iterator it_ans; for (it_ans = answer.begin(); it_ans != answer.end(); ++it_ans) { // TODO: handle CNAME if (ntohs(it_ans->m_type) == 6 && ntohs(it_ans->m_class) == 1) { ptr_cdpi_dns_soa p_soa = DNS_RDATA_TO_SOA(it_ans->m_rdata); mongo::BSONObjBuilder b1, b2; mongo::BSONObj obj; mongo::Date_t date; get_epoch_millis(date); b2.append("_id", it_ans->m_name); b2.append("mname", p_soa->m_mname); b2.append("rname", p_soa->m_rname); b2.append("serial", p_soa->m_serial); b2.append("refresh", p_soa->m_refresh); b2.append("retry", p_soa->m_retry); b2.append("expire", p_soa->m_expire); b2.append("minimum", p_soa->m_minimum); b2.append("date", date); obj = b2.obj(); cout << obj.toString() << endl; b1.append("_id", it_ans->m_name); mongo_conn.update(http_soa, b1.obj(), obj, true); } } } } ub_resolve_free(result); }