39 #include <std_msgs/String.h> 41 #include <boost/foreach.hpp> 42 #ifdef WAREHOUSE_ROS_MONGO_HAVE_MONGO_VERSION_H 43 #include <mongo/version.h> 52 : conn_(conn), gfs_(new mongo::GridFS(*conn, db)), ns_(db +
"." + coll), db_(db), coll_(coll)
61 const string meta_ns =
db_ +
".ros_message_collections";
62 if (!
conn_->count(meta_ns, BSON(
"name" <<
coll_)))
65 conn_->insert(meta_ns, BSON(
"name" <<
coll_ <<
"type" << datatype <<
"md5sum" << md5));
67 else if (!
conn_->count(meta_ns, BSON(
"name" <<
coll_ <<
"md5sum" << md5)))
69 ROS_ERROR(
"The md5 sum for message %s changed to %s. Only reading metadata.", datatype.c_str(), md5.c_str());
77 #if (MONGOCLIENT_VERSION_MAJOR >= 1) 78 conn_->createIndex(
ns_, BSON(field << 1));
80 conn_->ensureIndex(
ns_, BSON(field << 1));
92 mongo::BSONObj file_obj =
gfs_->storeFile(msg, msg_size,
id.toString());
95 mongo::BSONObjBuilder builder;
96 builder.appendElements(bson);
98 file_obj[
"_id"].Val(blob_id);
99 builder.append(
"blob_id", blob_id);
100 mongo::BSONObj entry = builder.obj();
101 ROS_DEBUG_NAMED(
"insert",
"Inserting %s into %s", entry.toString().c_str(),
ns_.c_str());
106 bool ascending)
const 109 if (!sort_by.empty())
110 mquery.sort(sort_by, ascending ? 1 : -1);
111 ROS_DEBUG_NAMED(
"query",
"Sending query %s to %s", mquery.toString().c_str(),
ns_.c_str());
129 std::vector<mongo::BSONObj> metas;
135 unsigned num_removed = 0;
137 for (
const mongo::BSONObj& meta : metas)
140 meta[
"blob_id"].Val(
id);
141 gfs_->removeFile(
id.toString());
152 std::vector<mongo::BSONObj> metas;
156 mongo::BSONObj orig = metas.front();
157 mongo::BSONObjBuilder new_meta_builder;
159 std::set<std::string> fields;
160 bson.getFieldNames(fields);
162 BOOST_FOREACH (
const string&
f, fields)
164 if ((f !=
"_id") && (f !=
"creation_time"))
165 new_meta_builder.append(BSON(
"$set" << BSON(f << bson.getField(f))).getField(
"$set"));
168 mongo::BSONObj new_meta = new_meta_builder.obj().copy();
169 conn_->update(
ns_, query, new_meta);
MongoMessageCollection(const std::shared_ptr< mongo::DBClientConnection > &conn, const std::string &db_name, const std::string &collection_name)
std::shared_ptr< mongo::GridFS > gfs_
void modifyMetadata(Query::ConstPtr q, Metadata::ConstPtr m)
Modify metadata Find message matching q and update its metadata using m In other words, overwrite keys in the message using m, but keep keys that don't occur in m.
MongoMetadata & downcastMetadata(Metadata::ConstPtr metadata) const
unsigned removeMessages(Query::ConstPtr query)
Remove messages matching query.
bool initialize(const std::string &datatype, const std::string &md5)
void insert(char *msg, size_t msg_size, Metadata::ConstPtr metadata)
Insert a ROS message, together with some optional metadata, into the db.
#define ROS_DEBUG_NAMED(name,...)
void listMetadata(mongo::Query &mquery, std::vector< mongo::BSONObj > &metas)
boost::shared_ptr< ResultIteratorHelper > Ptr
std::shared_ptr< mongo::DBClientConnection > conn_
std::string collectionName() const
Return name of collection.
mongo::BSONObj metadataRaw() const
MongoQuery & downcastQuery(Query::ConstPtr query) const
unsigned count()
Count messages in collection.
ResultIteratorHelper::Ptr query(Query::ConstPtr query, const std::string &sort_by, bool ascending) const
void ensureIndex(const std::string &field)