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 <algorithm>
00038 #include <vector>
00039 #include <boost/shared_ptr.hpp>
00040
00041 #include "database_interface/postgresql_database.h"
00042
00043 #include "database_interface/database_test_object.h"
00044
00045 #include <ros/ros.h>
00046
00048 int main(int argc, char **argv)
00049 {
00050 bool TEST_INSERTION = true;
00051 bool TEST_DELETION = true;
00052 size_t NUM_OBJECTS = 2;
00053
00054 database_interface::PostgresqlDatabase database("wgs36", "5432", "willow",
00055 "willow", "database_test");
00056 if (!database.isConnected())
00057 {
00058 ROS_ERROR("Database failed to connect");
00059 return -1;
00060 }
00061 ROS_INFO("Database connected successfully");
00062
00063
00064 std::vector< boost::shared_ptr<database_interface::DatabaseTestObject> > objects;
00065
00066 if (!database.getList(objects))
00067 {
00068 ROS_ERROR("Failed to get list of test objects");
00069 return -1;
00070 }
00071
00072 ROS_INFO("Retrieved %zd objects", objects.size());
00073 if ( objects.size() != NUM_OBJECTS)
00074 {
00075 ROS_ERROR("Expected %d objects", (int)NUM_OBJECTS);
00076 return -1;
00077 }
00078
00079 for (size_t i=0; i<objects.size(); i++)
00080 {
00081 ROS_INFO("Object id %d, double field %f, string field %s, foreign field %d",
00082 objects[i]->pk_field_.get(),
00083 objects[i]->double_field_.get(),
00084 objects[i]->string_field_.get().c_str(),
00085 objects[i]->foreign_field_.get());
00086 std::string tags("{");
00087 for (size_t t=0; t<objects[i]->tags_field_.get().size(); t++)
00088 {
00089 if (t!=0) tags+= ",";
00090 tags += objects[i]->tags_field_.get().at(t);
00091 }
00092 tags += "}";
00093 ROS_INFO(" Tags: %s", tags.c_str());
00094
00095 if (!database.loadFromDatabase(&(objects[i]->binary_field_)) )
00096 {
00097 ROS_ERROR("Failed to load binary field for object %zd", i);
00098 return -1;
00099 }
00100 else
00101 {
00102 ROS_INFO(" Binary field: %zd bytes", objects[i]->binary_field_.get().size());
00103 }
00104 }
00105
00106
00107 if (NUM_OBJECTS)
00108 {
00109 database_interface::DatabaseTestObject clone(objects[0].get());
00110 ROS_INFO("Clone id %d, double field %f, string field %s, foreign field %d",
00111 clone.pk_field_.get(),
00112 clone.double_field_.get(),
00113 clone.string_field_.get().c_str(),
00114 clone.foreign_field_.get());
00115 if ( clone.string_field_.get() != objects[0]->string_field_.get())
00116 {
00117 ROS_ERROR("Clone string_field not identical to original: %s", clone.string_field_.get().c_str());
00118 return -1;
00119 }
00120 if ( clone.binary_field_.get().size() != objects[0]->binary_field_.get().size() )
00121 {
00122 ROS_ERROR("Clone binary field size not identical to original: %d", (int)clone.binary_field_.get().size());
00123 return -1;
00124 }
00125 ROS_INFO("Cloning successful");
00126
00127 std::string old_string = objects[0]->string_field_.get();
00128
00129 std::string new_string("10011001100122");
00130 objects[0]->string_field_.fromString(new_string);
00131 if ( !database.saveToDatabase(&(objects[0]->string_field_)) )
00132 {
00133 ROS_ERROR("Failed to save field to database");
00134 return -1;
00135 }
00136 objects[0]->string_field_.get().assign("foo");
00137 if (!database.loadFromDatabase(&(objects[0]->string_field_)) )
00138 {
00139 ROS_ERROR("Failed to retrieve field from database");
00140 return -1;
00141 }
00142 std::string test_string;
00143 objects[0]->string_field_.toString(test_string);
00144 if (test_string != new_string)
00145 {
00146 ROS_ERROR("Retrieved field does not match: %s", test_string.c_str());
00147 return -1;
00148 }
00149
00150 objects[0]->string_field_.get() = old_string;
00151 if ( !database.saveToDatabase(&(objects[0]->string_field_)) )
00152 {
00153 ROS_ERROR("Failed to revert field to old value");
00154 return -1;
00155 }
00156
00157 ROS_INFO("Saving and retrieving fields successful");
00158 }
00159
00160
00161 if (TEST_INSERTION)
00162 {
00163 database_interface::DatabaseTestObject new_object;
00164
00165 new_object.double_field_.get()=3.5;
00166 new_object.string_field_.get()="object3_string";
00167 new_object.tags_field_.get().push_back("object3_tag1");
00168 new_object.tags_field_.get().push_back("object3_tag2");
00169 new_object.tags_field_.get().push_back("object3_tag3");
00170 new_object.foreign_field_.get() = 300;
00171
00172 if (!database.insertIntoDatabase(&new_object))
00173 {
00174 ROS_ERROR("Failed to insert new model in database");
00175 }
00176 else
00177 {
00178 ROS_INFO("New model inserted successfully");
00179
00180 if (TEST_DELETION)
00181 {
00182 if (!database.deleteFromDatabase(&new_object))
00183 {
00184 ROS_ERROR("Failed to delete model from database");
00185 }
00186 else
00187 {
00188 ROS_INFO("New model deleted successfully");
00189 }
00190 }
00191 }
00192 }
00193
00194 ROS_INFO("All tests passed");
00195 return 0;
00196 }