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 }