Инкапсуляторы, блин
Nov. 11th, 2008 10:55 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Есть у "Оракла" простой сишный интерфейс OCI. Его, в частности, использует DBD::Oracle. И там они при ошибке вытаскивают информацию о том, на каком символе запроса "Оракл" возмутился. Что весьма полезно для отладки.
А есть ещё сиплюсплюсный интерфейс OCCI. Всё там обёрнуто в классы, ошибки обёрнуты в исключения, наружу торчат только методы. Естественно, есть класс SQLException, потомок std::exception, поддерживает и унаследованный what(), и своим методы имеет getErrorCode() и getMessage(). Вот только информацию о "плохом" месте в запросе он, конечно, не скажет. Чтобы её вытянуть самому - надо манипулятор (handler) запроса, который к моменту поимки исключения может уже и не сохраниться. Т.е. и ловить надо где-то глубже, да ещё и этот манипулятор откуда-то выцарапывать. Вроде бы у класса Statement его попросить можно. Но сколько же гемора до этого докопаться...
(Да, тем, кто любит вопрошать: "И нафига тебе сорцы? Часто ли ты в них смотришь?" - боюсь, без сишных сорцов DBD::Oracle проблем у меня было бы куда больше, а так я хоть нашёл, как это там делается.)
А есть ещё сиплюсплюсный интерфейс OCCI. Всё там обёрнуто в классы, ошибки обёрнуты в исключения, наружу торчат только методы. Естественно, есть класс SQLException, потомок std::exception, поддерживает и унаследованный what(), и своим методы имеет getErrorCode() и getMessage(). Вот только информацию о "плохом" месте в запросе он, конечно, не скажет. Чтобы её вытянуть самому - надо манипулятор (handler) запроса, который к моменту поимки исключения может уже и не сохраниться. Т.е. и ловить надо где-то глубже, да ещё и этот манипулятор откуда-то выцарапывать. Вроде бы у класса Statement его попросить можно. Но сколько же гемора до этого докопаться...
(Да, тем, кто любит вопрошать: "И нафига тебе сорцы? Часто ли ты в них смотришь?" - боюсь, без сишных сорцов DBD::Oracle проблем у меня было бы куда больше, а так я хоть нашёл, как это там делается.)