void test_a_db_with_a_connection_with_tables::can_update_integer_attribute_bound_value() { // insert new object DB::Statement statement = connection->prepare( "insert into object default values"); CPPUNIT_ASSERT(statement.isValid()); CPPUNIT_ASSERT(connection->execute(statement)); long long object_id = connection->lastInsertRowId(); CPPUNIT_ASSERT(object_id != 0); // insert integer attribute statement = connection->prepare( "insert into attribute_integer (value,type,object_id) values (%lld,%d,%lld)", 1111, 1235, object_id); CPPUNIT_ASSERT(statement.isValid()); CPPUNIT_ASSERT(connection->execute(statement)); // prepare update integer attribute statement statement = connection->prepare( "update attribute_integer set value=? where type=%d and object_id=%lld", 1235, object_id); CPPUNIT_ASSERT(statement.isValid()); // bind long long value to the parameter an update the record CPPUNIT_ASSERT(DB::Bindings(statement).bindInt64(1,2222)); CPPUNIT_ASSERT(connection->execute(statement)); // Retrieve the value from the record DB::Statement retrieveStmt = connection->prepare( "select value from attribute_integer as t where t.type=%d and t.object_id=%lld", 1235, object_id); CPPUNIT_ASSERT(retrieveStmt.isValid()); DB::Result result = connection->perform(retrieveStmt); CPPUNIT_ASSERT_EQUAL(result.getLongLong(1), (long long)2222); // verify that binding to a parameter before resetting the statement will fail. DB::LogErrorHandler eh = DB::setLogErrorHandler(dummy_print); DB::Bindings bindings(statement); CPPUNIT_ASSERT(!bindings.bindInt(1,3333)); DB::setLogErrorHandler(eh); // reset statement and bind another value to the statement CPPUNIT_ASSERT(bindings.reset()); CPPUNIT_ASSERT(bindings.bindInt(1,3333)); // perform the update statement again with the newly bound value CPPUNIT_ASSERT(connection->execute(statement)); // reset the retrieve statement and perform it again to get the latest value of the integer attribute CPPUNIT_ASSERT(retrieveStmt.reset()); result = connection->perform(retrieveStmt); CPPUNIT_ASSERT(result.isValid()); CPPUNIT_ASSERT_EQUAL(result.getLongLong(1), (long long)3333); }
bool DBObject::find(long long objectId) { MutexLocker lock(_mutex); if (_connection == NULL) { ERROR_MSG("Object is not connected to the database."); return false; } if (objectId == 0) { ERROR_MSG("Invalid object_id 0 passed to find"); return false; } // find the object in the database for the given object_id DB::Statement statement = _connection->prepare( "select id from object where id=%lld", objectId); if (!statement.isValid()) { ERROR_MSG("Preparing object selection statement failed"); return false; } DB::Result result = _connection->perform(statement); if (result.getLongLong(1) != objectId) { ERROR_MSG("Failed to find object with id %lld",objectId); return false; } _objectId = objectId; return true; }
void test_a_db_with_a_connection_with_tables::can_update_text_attribute_bound_value() { can_insert_records(); // query all objects DB::Statement statement = connection->prepare("select id from object"); CPPUNIT_ASSERT(statement.isValid()); DB::Result result = connection->perform(statement); CPPUNIT_ASSERT(result.isValid()); long long object_id = result.getLongLong(1); // field indices start at 1 statement = connection->prepare( "update attribute_text set value=? where type=%d and object_id=%lld", 1234, object_id); CPPUNIT_ASSERT(statement.isValid()); std::string msg("testing quote ' and accents é."); CPPUNIT_ASSERT(DB::Bindings(statement).bindText(1,msg.c_str(),msg.size(),NULL)); CPPUNIT_ASSERT(connection->execute(statement)); statement = connection->prepare( "select value from attribute_text as t where t.type=%d and t.object_id=%lld", 1234, object_id); result = connection->perform(statement); CPPUNIT_ASSERT_EQUAL(std::string(result.getString(1)), msg); }
void test_a_db_with_a_connection_with_tables::can_update_text_attribute() { can_insert_records(); // query all objects DB::Statement statement = connection->prepare("select id from object"); CPPUNIT_ASSERT(statement.isValid()); DB::Result result = connection->perform(statement); CPPUNIT_ASSERT(result.isValid()); long long object_id = result.getLongLong(1); // field indices start at 1 statement = connection->prepare( "update attribute_text set value='test test test' where type=%d and object_id=%lld", 1234, object_id); CPPUNIT_ASSERT(statement.isValid()); CPPUNIT_ASSERT(connection->execute(statement)); }
void test_a_db_with_a_connection_with_tables::can_cascade_delete_objects_and_attributes() { can_insert_records(); DB::Statement statement = connection->prepare("select id from object"); DB::Result result = connection->perform(statement); CPPUNIT_ASSERT(result.isValid()); long long object_id = result.getLongLong(1); statement = connection->prepare("delete from object where id=%lld",object_id); CPPUNIT_ASSERT(connection->execute(statement)); statement = connection->prepare("select * from attribute_text where object_id=%lld",object_id); result = connection->perform(statement); // Check cascade delete was successful. CPPUNIT_ASSERT(!result.isValid()); }