Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "household_objects_database/objects_database.h"
00038
00039 #include <database_interface/db_filters.h>
00040
00041 #include "household_objects_database/database_task.h"
00042
00043 using namespace database_interface;
00044
00045 namespace household_objects_database {
00046
00047 bool ObjectsDatabase::acquireNextTask(std::vector< boost::shared_ptr<DatabaseTask> > &task,
00048 std::vector<std::string> accepted_types)
00049 {
00050
00051 int id;
00052 if (accepted_types.empty())
00053 {
00054 std::vector< boost::shared_ptr<DatabaseTaskID> > id_vec;
00055 DatabaseTaskID id_example;
00056 if ( !getList<DatabaseTaskID>(id_vec, id_example, "") )
00057 {
00058 ROS_ERROR("Failed to get the id of the next task to be run");
00059 return false;
00060 }
00061 if (id_vec.empty())
00062 {
00063
00064 return true;
00065 }
00066 if (id_vec.size() != 1)
00067 {
00068 ROS_ERROR("Next task acquisition returned more than one result");
00069 return false;
00070 }
00071
00072 id = id_vec[0]->id_.get();
00073 }
00074 else
00075 {
00076 std::string function = "get_mark_next_dbase_task_of_type(ARRAY[";
00077 for(size_t i=0; i<accepted_types.size(); i++)
00078 {
00079 if (i != 0 ) function += ",";
00080 function += "'" + accepted_types[i] + "'";
00081 }
00082 function += "])";
00083 std::vector< boost::shared_ptr<DatabaseTaskIDTyped> > id_vec;
00084 DatabaseTaskIDTyped id_example(function);
00085 ROS_INFO_STREAM("Function call: " << function);
00086 if ( !getList<DatabaseTaskIDTyped>(id_vec, id_example, "") )
00087 {
00088 ROS_ERROR("Failed to get the id of the next task of given type to be run");
00089 ROS_ERROR_STREAM("Function call: " << function);
00090 return false;
00091 }
00092 if (id_vec.empty())
00093 {
00094
00095 return true;
00096 }
00097 if (id_vec.size() != 1)
00098 {
00099 ROS_ERROR("Next task acquisition returned more than one result");
00100 return false;
00101 }
00102
00103 id = id_vec[0]->id_.get();
00104 }
00105
00106 std::stringstream idstr;
00107 idstr << id;
00108 std::string where_clause("dbase_task_id=" + idstr.str());
00109
00110 if (!getList<DatabaseTask>(task, where_clause) || task.size() != 1 )
00111 {
00112 ROS_ERROR("Acquire next task: failed to populate entry");
00113 return false;
00114 }
00115 return true;
00116 }
00117
00118 }