Kovalenko Dmitry wrote:
Horsun Vlad писал(а):
Никогда :) И, кстати, где будут храниться тексты ошибок\содержимое
статуса (и до которой поры) в этом варианте ?
Ну, во-первых, тексты ошибок в
статус-векторе не хранятся. Во-вторых,
статус-вектор хранить там же где и
текст на который он ссылается.
Влад имел ввиду строки относящиеся к ошибкам. Текст ошибки в
firebird.msg выглядит например так:
"Cannot drop table %s"
а от сервера по сети приходит в пакете:
isc_arg_gds, 3355441234, isc_arg_string, "MY_TABLE", isc_arg_end
причем последняя часть как раз и хранится в статус-векторе, а замена в
тексте ошибки происходит в isc_interprete (обычный printf). А посему,
для корректной обработки ошибки совсем даже не надо вызывать
isc_interprete - достаточно коды ошибок и их параметры просмотреть.
А этот текст можно получать гораздо
более простым способом.
Например ? Не забывай о том, что статус - он - вектор и может содержать
несколько разных кодов ошибок и ассоциированных с ними строк.
То чего не знал - забыть не возможно. Я
дергаю isc_interpret (или как его) до упора и
полученный текст возвращаю клиенту. А
можно ведь дернуть один раз
isc_get_last_error_msg и не парится?
И каким образом потом делать обработку по условию? Строку ошибки
разбирать? А что будет, если программу запустить с французким файлом ошибок?
Например Ты хочешь сделать аналог MERGE или REPLACE (не помню, что там в
Вулкане сейчас) - если строка с PK уже есть, то делать UPDATE, а если
нет - INSERT.
Понятно, можно сделать сначала SELECT, посмотреть нашли ли чего, и тогда
решить. Но, если в 99% случаев будет идти INSERT и только в 1% - UPDATE,
ты будешь вызывать лишний SELECT в 99% случаев, что не есть эффективно.
В Jaybird же такая конструкция бы выглядела например так:
try {
insertStmt.executeUpdate();
} catch(SQLException ex) {
if (ex.getErrorCode() == 335544349L)
updateStmt.executeUpdate();
else
throw ex;
}
И все. И не надо никакого парсания текста ошибки на разных языках, и т.п.
И что самое интересное, нужный код ошибки во некоторых случаях лежит на
втором месте - сначала идет, например, isc_dsql_error, и только потом -
что именно.
Роман