Возможно, это уже не в тему, но кто имел с этим дело? Использовал OCCI, вроде удобно.
Взял объектное описание типов на C++
отсюда и их реализацию, реализовал привязку типов к методам read/write, аля
C++ (Qt)
void mapping(oracle::occi::Environment* envOCCI_) {
oracle::occi::Map *mapOCCI_ = envOCCI_->getMap();
mapOCCI_->put("MDSYS.SDO_GEOMETRY", &SDOPointType::readSQL, &SDOPointType::writeSQL);
mapOCCI_->put("MDSYS.SDO_POINT_TYPE", &SDOGeometry::readSQL, &SDOGeometry::writeSQL);
}
Далее в коде пишу
C++ (Qt)
Environment *env = Environment::createEnvironment(Environment::OBJECT);
mapping(env);
Connection *conn = env->createConnection(ociLogin, ociPassword, ociConnectionString);
Statement* stmt = conn->createStatement("SELECT "
" t.geoloc "
"FROM "
"DATA_.METRICS t "
"WHERE "
" t.graphid = '1092'" );
try {
ResultSet *rs = stmt->executeQuery();
rs->next();
SDOGeometry *geom = static_cast<SDOGeometry*>(rs->getObject(1));
}
catch (oracle::occi::SQLException &excep) {
std::cout << excep.getMessage();
}
stmt->closeResultSet(rs);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
Всё работает, всё собирается, но вот как только пытаюсь обращаться к методу geom->getSdo_point(); он возвращает указатель на SDOPointType, обращение к методам которого приводит к крэшу программы. Тут даже не оракловая ошибка, а ошибка обращения к памяти. Указатель вроде как не нулевой, но и некорректный тоже.
Кто с этим сталкивался?
З. Ы. добавил вывод на консоль в самом начале реализации методов
SDOGeometry::readSQL(oracle::occi::AnyData& streamOCCI_)
void *SDOGeometry::readSQL(void *ctxOCCI_)
void SDOGeometry::setSdo_point(SDOPointType * value)
И ни один не вызвался. Странно...
И да, я проверял этот запрос. Отрабатывается нормально на PL/SQL Developer'е, возвращает одну строку.