Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL0444N rc 99 - при обращении к польз.функции С++ / 25 сообщений из 25, страница 1 из 1
09.02.2013, 17:17
    #38144487
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Перенес БД с DB2 v8 x86 на DB2 Express-C 9.7 x64... Отказываются работать пользовательские функции...
Возвращает SQL0444N rc 99... Что может быть? Функции в свое время компилировались еще VS 6... Может быть дело в древности?
...
Рейтинг: 0 / 0
09.02.2013, 23:06
    #38144707
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
2013-02-09-22.52.01.045000+240 E13534F548 LEVEL: Error (OS)
PID : 1800 TID : 2676 PROC : db2syscs.exe
INSTANCE: DB2 NODE : 000 DB : DATA1
APPHDL : 0-7 APPID: *LOCAL.DB2.130209185141
AUTHID : ADMIN
EDUID : 2676 EDUNAME: db2agent (DATA1)
FUNCTION: DB2 UDB, oper system services, sqloloadmodule, probe:43
MESSAGE : ZRC=0x830000C1=-2097151807
CALLED : OS, -, unspecified_system_function
OSERR : 193 "%1 не является приложением Win32."

Вот такое в db2diag.log пишется...
...
Рейтинг: 0 / 0
11.02.2013, 10:07
    #38145583
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
1. Установил VS2005....
2. Установил Express-C 9.7...
3. Взял исходники и собрал dll заново....

Подключил функцию... Результат тот же.... OS ERR 193.....

Ну ткните же носом где я туплю... Ведь чую тут какой-то мой косяк очевидный...
...
Рейтинг: 0 / 0
11.02.2013, 10:26
    #38145594
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
стандартный батником BLDRTN через командную строку собирать модуль отказывается...
ругается на LNK2001 __DllMainCRTStartup@12
....
Взял cxx-файл, который получился после embprep.bat... И собрал по нему dll прямо в среде VS2005... Результат тот же...
...
Рейтинг: 0 / 0
11.02.2013, 11:36
    #38145686
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Итак... В среде VS 2005 dll собирается...
подключаю ее к базе...
при вызове функции получаю SQL0444N rc 99....

Мысли закончились...
...
Рейтинг: 0 / 0
11.02.2013, 11:43
    #38145703
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

DLL точно получается 32-битный?
Опции компиляции совпадают?
Windows C and C++ routine compile and link options

Нужно попробовать скомпилировать (при помощи bldrtn) и запустить любую функцию из примеров.
Если будет работать - сравнить исходный код примера и собственный код.
Если нет - разбираться с процессом компиляции.

Возможно, имеет смысл использовать более свежий Visual Studio for C++.
...
Рейтинг: 0 / 0
11.02.2013, 11:48
    #38145715
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
А почему dll должна быть 32-битная?
У меня и Win7 x64, и Express-C 9.7 x64....

Дело в dll-ке... Если ее удалить, то получаю стандартный код SQL0444N rc 4

Насчет примеров... Сейчас попробую...
...
Рейтинг: 0 / 0
11.02.2013, 11:51
    #38145729
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
В опции компилятора cl.exe указано -DWIN32... Это нормально для моего случая?
...
Рейтинг: 0 / 0
11.02.2013, 11:57
    #38145747
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Попробуйте раскомментировать следующую строку (37) в bldrtn

rem set BITWIDTH=32onWin64

Полностью блок строк должен выглядеть так:
Код: powershell
1.
2.
3.
rem Uncomment the next line if building 32-bit applications using
rem a DB2 64-bit product on Windows 64-bit
set BITWIDTH=32onWin64



Это влияет на определение путей к библиотекам, должно вылечить ошибку линковки.
Вот условный блок
Код: powershell
1.
if "%BITWIDTH%" == "32onWin64" set LIB=%DB2PATH%\lib\Win32;%LIB%
...
Рейтинг: 0 / 0
11.02.2013, 12:05
    #38145765
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Спасибо за наводки... Есть хорошая новость... Пример собрался и заработал... Уже хлеб...
...
Рейтинг: 0 / 0
11.02.2013, 12:20
    #38145797
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
все... разобрался... дело было в PROGRAM TYPE SUB при создании функции... По умолчанию, похоже, ставится PROGRAM TYPE MAIN и СУБД ищет исполняемый файл, а не библиотеку DLL...
...
Рейтинг: 0 / 0
20.02.2013, 10:41
    #38158519
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Прошло несколько дней... Попытался вновь пересоздать функцию... Устанавливаю PROGRAM TYPE SUB, а функция опять за старое... SQL0444N RC=99
Что же это может быть все-таки?
...
Рейтинг: 0 / 0
21.02.2013, 10:43
    #38160261
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Если функция из примеров нормально компилируется и работает, и процесс компиляции кода из примера и кода проблемной функции 100% совпадает, то искать отличия в самом коде.
Если анализ db2diag.log ничего нового не принес, то по порядку:
1. С помощью Dependency Walker проверить список внешних DLL, на которые есть ссылки из модуля функции. Там есть опция (кнопка) показывать полные пути.
Сравнить список зависимостей для примера и для проблемного кода.
Если функция использует внешние библиотеки, то убедиться что для них совпадает режим битности.

2. При помощи Sysinternals Process Monitor или File Monitor выяснить какие DLL-модули и откуда пытается подгрузить DB2 при вызове функции.
Там нужно правильно задать фильтр, например по номеру процесса, т.к. по умолчанию мониторится все, а это весьма плотный поток информации.
...
Рейтинг: 0 / 0
15.03.2013, 16:40
    #38185954
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Чтобы не плодить тем тут напишу... Продолжение истории...
Вчера ловил глюк... Вызываю свою функцию (ту, которую выше в теме подключал)... До какого-то времени все работало нормально...
Вчера пробую вызов values(myfunc(...)) выдает неправильное значение... Ну просто от фонаря, но стабильно неправильное...
Причем... Если функцию вызывать локально, то все корректно... Если через клиента, то неправильное...
Далее ньюанс... Если пробую вызов в связке v9.7 x64 Exc-C - v9.7 x64 Exc-C, то все корректно... А если клиент v8.1.9 x32, а сервер v9.7 x64 Exc-C , тогда не корректное значение.... Все вылечилось перезагрузкой сервера...
Что это могло быть? Что-то с совместимостью?
...
Рейтинг: 0 / 0
15.03.2013, 17:33
    #38186059
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Функция зарегистрирована как FENCED и NOT THREADSAFE....
Если вызвать ее сначала с x32 клиента, то работает... Если вызвать ее с x64 клиента, то на x32 клиентах перестает работать адекватно... Очень на это похоже... Может же такое быть?
...
Рейтинг: 0 / 0
16.03.2013, 14:20
    #38186648
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Взял пример... Собрал udfsrv.dll... Подключил функции, результат все тот же... rc99....
...
Рейтинг: 0 / 0
16.03.2013, 15:14
    #38186676
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Краткая выжимка....

Есть Win7 x64....
Есть DB2 Express-C v 9.7 x64

Есть VS2005 x86....

Примеры udfsrv.c собираю в dll... Создаю функцию... Потом пытаюсь запустить values(myfunc()) и получаю SQL0444N Reason Code 99

Все... Куда копать?
...
Рейтинг: 0 / 0
16.03.2013, 16:51
    #38186743
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Что же за взрыв мозга....?!?!
Истроия 1:
1. Рестарт сервера DB2 x64...
2. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат правильный...
3. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...
4. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат НЕ правильный...
5. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...

Истроия 2:
1. Рестарт сервера DB2 x64...
2. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...
3. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат НЕ правильный...
4. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...

Что за треш? Получается, что DB2 x32 клиенты не могут работать с DB2 x64 клиентами?
...
Рейтинг: 0 / 0
17.03.2013, 15:10
    #38187192
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Не пойму... Как же такое в принципе возможно?!?!
Функция возвращает разные результаты в зависимости от разрядности клиента и ОС клиента... Разве это должно быть?
Переставил сервер... Теперь он DB2 Express-C 9.7.6 x32 на Win7 x64... Проблема немного видоизменилась... Теперь башню серверу сносит вызов функции с 32-разрядного клиента на Win7 x64 машине....
Пошлите, где копать-то? Как же функция может возвращать разные результаты??? Функция DETERMINISTIC, входные параметры идентичны...
...
Рейтинг: 0 / 0
18.03.2013, 09:45
    #38187594
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Тут нужна конкретика.
Нужно как минимум DDL-определение функции и хотя бы часть исходного кода, в котором описан заголовок функции.

Если возвращаются разные результаты в разных режимах, нужно в код функции ставить диагностический вывод в файл, чтобы фиксировать что пришло на вход и что вернулось на выход. Нужно понять, в каком месте происходит искажение информации. Либо это происходит в теле функции, тогда вопрос к отладке этого кода, либо это происходит на этапе передачи между DB2 и кодом функции, и с этим нужно разбираться отдельно.
Возможно также, что искажение информации происходит на этапе взаимодействия клиент/сервер.

Отдельный вопрос насколько сложная логика заложена в функцию? Не проще ли будет переписать ее на NativeSQL и забыть про компиляцию вообще?
...
Рейтинг: 0 / 0
18.03.2013, 10:26
    #38187630
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Евгений ХабаровTORT,

Тут нужна конкретика.
Нужно как минимум DDL-определение функции и хотя бы часть исходного кода, в котором описан заголовок функции.

Если возвращаются разные результаты в разных режимах, нужно в код функции ставить диагностический вывод в файл, чтобы фиксировать что пришло на вход и что вернулось на выход. Нужно понять, в каком месте происходит искажение информации. Либо это происходит в теле функции, тогда вопрос к отладке этого кода, либо это происходит на этапе передачи между DB2 и кодом функции, и с этим нужно разбираться отдельно.
Возможно также, что искажение информации происходит на этапе взаимодействия клиент/сервер.

Отдельный вопрос насколько сложная логика заложена в функцию? Не проще ли будет переписать ее на NativeSQL и забыть про компиляцию вообще?

Конкретика... Функция считает crc32 для входной строки... Написана на С... Алгоритм расчета, да и сами исходники идентичны вот этим http://www.sql.ru/forum/actualthread.aspx?tid=854674 ....
ddl функции...

CREATE FUNCTION "DBASE"."CRC32"
(
STR VARCHAR(100),
L INTEGER
)

RETURNS BIGINT
SPECIFIC CRC32
EXTERNAL NAME 'c:\database\crc32!crc32'
LANGUAGE C
PARAMETER STYLE SQL
VARIANT
FENCED NOT THREADSAFE
NULL CALL
READS SQL DATA
EXTERNAL ACTION
NO SCRATCHPAD
NO FINAL CALL
DISALLOW PARALLEL
NO DBINFO;

За идею с логами отдельное спасибо... Попробую реализовать...
...
Рейтинг: 0 / 0
18.03.2013, 14:07
    #38188002
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Есть db2 ese 9.7.6 x64.
Пробовал по-разному и с windows x64, и с x86 (10.1 linux, 9.7 windows) в разных комбинациях.
Не смог добиться разных результатов.

Алгоритм взял отсюда: Cyclic redundancy check
crc32.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
#include <stdlib.h>
#include <string.h>
#include <sqlcli.h>
#include <sqludf.h>

/*
CREATE FUNCTION CRC32(STR VARCHAR(4000))
RETURNS BIGINT
SPECIFIC CRC32
EXTERNAL NAME 'crc32!crc32'
LANGUAGE C
PARAMETER STYLE SQL
FENCED THREADSAFE
DETERMINISTIC
NOT NULL CALL
NO SQL
NO EXTERNAL ACTION
ALLOW PARALLEL;
*/

void make_crc_table(
  SQLUINTEGER crc_table[]
) {
  int i, j;
  for (i = 0; i < 256; i++) {
    SQLUINTEGER c = i;
    for (j = 0; j < 8; j++)
      c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);
    crc_table[i] = c;
  }
}
 
SQLUINTEGER get_crc32(
  SQLUDF_VARCHAR *buf
, int len
, SQLUINTEGER crc_table[256]
) {
  int i;
  SQLUINTEGER c = 0xFFFFFFFF;

  for (i = 0; i < len; i++)
    c = crc_table[(c ^ buf[i]) & 0xFF] ^ (c >> 8);
  return c ^ 0xFFFFFFFF;
}

#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN crc32( 
  SQLUDF_VARCHAR    *inStr
, SQLUDF_BIGINT     *outRes
, SQLUDF_NULLIND    *inStrNullInd
, SQLUDF_NULLIND    *outResNullInd
, SQLUDF_TRAIL_ARGS
) {
  SQLUINTEGER crc_table[256];

  if ((*outResNullInd = *inStrNullInd) == -1) return;
  make_crc_table(crc_table);
  *outRes = get_crc32(inStr, strlen(inStr), crc_table);
}


bldrtn.bat
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
@echo off
setlocal
@CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat" 
set INCLUDE=%DB2PATH%\include;%INCLUDE%
rem Microsoft C/C++ Compiler
set BLDCOMP=cl

if "%BITWIDTH%" == "32onWin64" set LIB=%DB2PATH%\lib\Win32;%LIB%
if "%1" == "" goto error

if exist "%1.cpp" goto cpp
%BLDCOMP% -Zi -Od -c -W2 -DWIN32 -MD -D_CRT_SECURE_NO_DEPRECATE %1.c
goto link_step
:cpp
%BLDCOMP% -Zi -Od -c -W2 -DWIN32 -MD -D_CRT_SECURE_NO_DEPRECATE /EHsc %1.cpp

rem Link the program.
:link_step
set BUFFEROVERFLOWLIB=
if "%CPU%" == "AMD64" set BUFFEROVERFLOWLIB=bufferoverflowU.lib
link -debug -dll -out:%1.dll %1.obj db2api.lib %BUFFEROVERFLOWLIB% -def:%1.def
if EXIST %1.dll.manifest MT -manifest %1.dll.manifest -outputresource:%1.dll;#2

rem Copy the stored procedure DLL to the 'function' directory
copy %1.dll "%DB2PATH%\function"

goto exit
:error
echo Usage: bldrtn prog_name
:exit

endlocal
@echo on
...
Рейтинг: 0 / 0
18.03.2013, 17:19
    #38188396
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Вношу свой вариант.

1. Согласно документации, если DB2 сервер работает в 64-битном режиме, то и функцию желательно компилировать в режиме 64-бит. Так будет работать быстрее.
2. Сам алгоритм CRC32 работает по таблице. Генерировать таблицу при каждом вызове функции не есть правильно, т.к. ее можно просчитать заранее. Поэтому взят код с готовой таблицей, размещенный в википедии Циклический избыточный код , а именно: "Пример программы табличного (быстрого) расчёта CRC-32 на языке Си".

В код добавлено описание функции в виде, совместимом с СУБД DB2.

Код скомпилирован на рабочей станции следующей конфигурации:
Операционная система: Windows 7 Professional x64
DB2: Client V9.7 FP7 (x64)
Компилятор: Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Целевая платформа: /Release /x64 /2003

Компилятор установлен в комплекте с Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO) .
Взят дистрибутив для платформы x64: GRMSDKX_EN_DVD.iso

Компилировал с помощью команды "udf_compile.cmd crc32"
В итоге получил dll, скопировал на сервер (Windows 2003 Server SP2 (x64), DB2 V10.1 FP2 (x64)) в подкаталог FUNCTION
После этого создал в базе описание функции (cre_CRC32.ddl). Проблем с работой пока не обнаружил. Запрашивал с разных клиентов. Выкладываю архив, включая готовую DLL-библиотеку.Надеюсь поможет разобраться.
...
Рейтинг: 0 / 0
19.03.2013, 07:29
    #38188954
SQL0444N rc 99 - при обращении к польз.функции С++
TORT,

Еще вопрос, для каких целей используется эта функция?
Для создания уникальных хешей можно использовать и другие алгоритмы, например MD5.

PS: В DB2 9.7 есть встроенная функция хеширования, правда сам пока ее нигде не применял.
Правда эта функция, как и другие из раздела System-defined Modules, недоступна на DB2 Express-C.
GET_HASH_VALUE function - Compute a hash value for a given string .
...
Рейтинг: 0 / 0
19.03.2013, 17:38
    #38190269
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL0444N rc 99 - при обращении к польз.функции С++
Евгений ХабаровTORT,

Еще вопрос, для каких целей используется эта функция?
Для создания уникальных хешей можно использовать и другие алгоритмы, например MD5.

PS: В DB2 9.7 есть встроенная функция хеширования, правда сам пока ее нигде не применял.
Правда эта функция, как и другие из раздела System-defined Modules, недоступна на DB2 Express-C.
GET_HASH_VALUE function - Compute a hash value for a given string .

Спасибо, что отвечаете... И Вам, и Mark Barinstein ....

С другими алгоритмами хеширования пока не хочется заморачиваться... Мне в принципе непонятно было отчего функция возвращала разные результаты... Ведь на WSE v.8 работает без проблем...
Потестирую Ваши примеры... Напишу, в чем там я заблуждался... Кстати, с правами доступа в Win7 не может быть каких-нибудь бедствий?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL0444N rc 99 - при обращении к польз.функции С++ / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]