diff --git a/include/db/dbdatabase.h b/include/db/dbdatabase.h index 5bbf48d4f..e10f519d4 100755 --- a/include/db/dbdatabase.h +++ b/include/db/dbdatabase.h @@ -166,16 +166,83 @@ class Database \return a vector of objects by name */ sad::Vector queryByName(const sad::String & name) const; + /*! Tries to get objects by name + \param[in] id object id + \return objects + */ + template + sad::Vector objectsByName(const sad::String & name) const + { + sad::Vector result; + sad::Vector o = queryByName(name); + this->filterObjectsByType(result, o); + return result; + } + /*! Tries to get objects by name + \param[in] id object id + \return object + */ + template + T* objectByName(const sad::String & name) const + { + T* result = NULL; + sad::Vector o = queryByName(name); + this->filterObjectByType(result, o); + return result; + } /*! Queries all tables in seatch of object by minor id \param[in] id a minor id of searched objects \return a vector of objects by name */ sad::Vector queryByMinorId(unsigned long long id) const; + /*! Tries to get objects by minor id + \param[in] id object id + \return objects + */ + template + sad::Vector objectsByMinorId(unsigned long long id) const + { + sad::Vector result; + sad::Vector o = queryByMinorId(id); + this->filterObjectsByType(result, o); + return result; + } + /*! Tries to get objects by minor id + \param[in] id object id + \return object + */ + template + T* objectByMinorId(unsigned long long id) const + { + T* result = NULL; + sad::Vector o = queryByMinorId(id); + this->filterObjectByType(result, o); + return result; + } /*! Queries tables by major id \param[in] id a major if of searched objects \return object */ sad::db::Object * queryByMajorId(unsigned long long id) const; + /*! Tries to get one object by major id + \param[in] id object id + \return object + */ + template + T* objectByMajorId(unsigned long long id) const + { + T* result = NULL; + sad::db::Object* o = queryByMajorId(id); + if (o) + { + sad::db::TypeName::init(); + if (o->isInstanceOf(sad::db::TypeName::name())) + { + result = static_cast(o); + } + } + return result; + } /*! Fetches tables from a database \param[out] tables a tables in database */ @@ -255,6 +322,39 @@ class Database /*! Linked renderer in database */ sad::Renderer * m_renderer; + /*! Filters objects by specific type + \param[out] result a resulting vector + \param[in] o objects + */ + template + static void filterObjectsByType(sad::Vector & result, const sad::Vector& o) + { + sad::db::TypeName::init(); + for(size_t i = 0; i < o.size(); i++) + { + if (o[i]->isInstanceOf(sad::db::TypeName::name())) + { + result << static_cast(o[i]); + } + } + } + /*! Filters object by specific type + \param[out] result a resulting vector + \param[in] o objects + */ + template + static void filterObjectByType(T*& result, const sad::Vector& o) + { + sad::db::TypeName::init(); + result = NULL; + for(size_t i = 0; i < o.size() && result == NULL; i++) + { + if (o[i]->isInstanceOf(sad::db::TypeName::name())) + { + result = static_cast(o[i]); + } + } + } }; } diff --git a/tests/db/database.cpp b/tests/db/database.cpp index 60b6620c0..d3dc676e9 100755 --- a/tests/db/database.cpp +++ b/tests/db/database.cpp @@ -246,6 +246,8 @@ struct SadDbDatabaseTest : tpunit::TestFixture ASSERT_TRUE( db.queryByMajorId(1)->objectName() == "test"); ASSERT_TRUE( db.queryByMajorId(22) == NULL ); + + ASSERT_TRUE( db.objectByMajorId(1)->objectName() == "test"); } void test_query_by_minorid() @@ -261,7 +263,10 @@ struct SadDbDatabaseTest : tpunit::TestFixture ASSERT_TRUE( db.queryByMinorId(1)[0]->objectName() == "test"); ASSERT_TRUE( db.queryByMinorId(22).size() == 0 ); - } + + ASSERT_TRUE( db.objectsByMinorId(1)[0]->objectName() == "test"); + ASSERT_TRUE( db.objectByMinorId(1)->objectName() == "test"); + } void test_query_by_name() { @@ -276,6 +281,9 @@ struct SadDbDatabaseTest : tpunit::TestFixture ASSERT_TRUE( db.queryByName("test")[0]->MinorId == 1); ASSERT_TRUE( db.queryByName("test2").size() == 0 ); - } + ASSERT_TRUE( db.objectsByName("test")[0]->objectName() == "test"); + ASSERT_TRUE( db.objectByName("test")->objectName() == "test"); + + } } _sad_db_database_test; \ No newline at end of file