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, и только потом - что именно.

Роман

Ответить