def query_messages_ros_srv(self, req): """ Returns t """ collection = self._mongo_client[req.database][req.collection] # build the query doc obj_query = self.to_query_dict(req.message_query, req.meta_query) # restrict results to have the type asked for obj_query["_meta.stored_type"] = req.type # TODO start using some string constants! rospy.logdebug("query document: %s", obj_query) # this is a list of entries in dict format including meta sort_query_dict = dc_util.string_pair_list_to_dictionary(req.sort_query) sort_query_tuples = [] for k,v in sort_query_dict.iteritems(): try: sort_query_tuples.append((k, int(v))) except ValueError: sort_query_tuples.append((k,v)) entries = dc_util.query_message(collection, obj_query, sort_query_tuples, req.single, req.limit) # keep trying clients until we find an answer for extra_client in self.extra_clients: if len(entries) == 0: extra_collection = extra_client[req.database][req.collection] entries = dc_util.query_message(extra_collection, obj_query, sort_query_tuples, req.single, req.limit) if len(entries) > 0: rospy.loginfo("found result in extra datacentre") else: break # rospy.logdebug("entries: %s", entries) serialised_messages = () metas = () for entry in entries: # load the class object for this type # TODO this should be the same for every item in the list, so could reuse cls = dc_util.load_class(entry["_meta"]["stored_class"]) # instantiate the ROS message object from the dictionary retrieved from the db message = dc_util.dictionary_to_message(entry, cls) # the serialise this object in order to be sent in a generic form serialised_messages = serialised_messages + (dc_util.serialise_message(message), ) # add ObjectID into meta as it might be useful later entry["_meta"]["_id"] = entry["_id"] # serialise meta metas = metas + (StringPairList([StringPair(dc_srv.MongoQueryMsgRequest.JSON_QUERY, json.dumps(entry["_meta"], default=json_util.default))]), ) return [serialised_messages, metas]
def delete_ros_srv(self, req): """ Deletes a message by ID """ # Get the message collection = self._mongo_client[req.database][req.collection] docs = dc_util.query_message(collection, {"_id": ObjectId(req.document_id)}, find_one=True) if len(docs) != 1: return False message = docs[0] # Remove the doc collection.remove({"_id": ObjectId(req.document_id)}) if self.keep_trash: # But keep it into "trash" bk_collection = self._mongo_client[req.database][req.collection + "_Trash"] bk_collection.save(message) # also repeat in extras if self.replicate_on_write: for extra_client in self.extra_clients: extra_collection = extra_client[req.database][ req.collection] extra_collection.remove({"_id": ObjectId(req.document_id)}) extra_bk_collection = extra_client[req.database][ req.collection + "_Trash"] extra_bk_collection.save(message) return True
def delete_ros_srv(self, req): """ Deletes a message by ID """ # Get the message collection = self._mongo_client[req.database][req.collection] docs = dc_util.query_message(collection, {"_id": ObjectId(req.document_id)}, find_one=True) if len(docs) != 1: return False message = docs[0] # Remove the doc collection.remove({"_id": ObjectId(req.document_id)}) # But keep it into "trash" bk_collection = self._mongo_client[req.database][req.collection + "_Trash"] bk_collection.save(message) # also repeat in extras for extra_client in self.extra_clients: extra_collection = extra_client[req.database][req.collection] extra_collection.remove({"_id": ObjectId(req.document_id)}) extra_bk_collection = extra_client[req.database][req.collection + "_Trash"] extra_bk_collection.save(message) return True
def query_messages_ros_srv(self, req): """ Returns t """ collection = self._mongo_client[req.database][req.collection] # build the query doc obj_query = self.to_query_dict(req.message_query, req.meta_query) # restrict results to have the type asked for obj_query["_meta.stored_type"] = req.type # TODO start using some string constants! rospy.logdebug("query document: %s", obj_query) # this is a list of entries in dict format including meta sort_query_dict = dc_util.string_pair_list_to_dictionary( req.sort_query) sort_query_tuples = [] for k, v in iteritems(sort_query_dict): try: sort_query_tuples.append((k, int(v))) except ValueError: sort_query_tuples.append((k, v)) # this is a list of entries in dict format including meta projection_query_dict = dc_util.string_pair_list_to_dictionary( req.projection_query) projection_meta_dict = dict() projection_meta_dict["_meta"] = 1 entries = dc_util.query_message(collection, obj_query, sort_query_tuples, projection_query_dict, req.single, req.limit) if projection_query_dict: meta_entries = dc_util.query_message(collection, obj_query, sort_query_tuples, projection_meta_dict, req.single, req.limit) # keep trying clients until we find an answer if self.replicate_on_write: for extra_client in self.extra_clients: if len(entries) == 0: extra_collection = extra_client[req.database][ req.collection] entries = dc_util.query_message(extra_collection, obj_query, sort_query_tuples, projection_query_dict, req.single, req.limit) if projection_query_dict: meta_entries = dc_util.query_message( extra_collection, obj_query, sort_query_tuples, projection_meta_dict, req.single, req.limit) if len(entries) > 0: rospy.loginfo("found result in extra datacentre") else: break serialised_messages = () metas = () for idx, entry in enumerate(entries): # load the class object for this type # TODO this should be the same for every item in the list, so could reuse cls = dc_util.load_class(entry["_meta"]["stored_class"]) # instantiate the ROS message object from the dictionary retrieved from the db message = dc_util.dictionary_to_message(entry, cls) # the serialise this object in order to be sent in a generic form serialised_messages = serialised_messages + ( dc_util.serialise_message(message), ) # add ObjectID into meta as it might be useful later if projection_query_dict: entry["_meta"]["_id"] = meta_entries[idx]["_id"] else: entry["_meta"]["_id"] = entry["_id"] # serialise meta metas = metas + (StringPairList([ StringPair( dc_srv.MongoQueryMsgRequest.JSON_QUERY, json.dumps(entry["_meta"], default=json_util.default)) ]), ) return [serialised_messages, metas]