powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Indormix Isqlt09a.dll функция sqli_stmt
20 сообщений из 20, страница 1 из 1
Indormix Isqlt09a.dll функция sqli_stmt
    #36669336
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть бд Indormix работающая на Windows Server 2000. Есть программа взаимодействующая с ней.
Она делает обращения к бд используя библиотеку Isqlt09a.dll, вызывая функцию sqli_stmt. В заголовочном файле из SDK она объявляется так:

Код: plaintext
1.
2.
3.
mint __cdecl sqli_stmt(int4 version,  ifx_statement_t *scb, char **cmdtxt, mint icnt,
        ifx_sqlvar_t *ibind, struct value *ivalues, ifx_literal_t *litvalues, ifx_namelist_t *namelist,
        ifx_cursor_t *cur_wco, mint stmttype, mint position, mint col_smt_flag);

Собственно SQL запросы лежат в массиве указателей cmdtxt.
И разумно пологать, что icnt - содержит количество этих запросов.
Но как оказалось на практике, это не совсем так.

Погуглив, я нашел следующие примеры вызовов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
static const char *sqlcmdtxt[] =
    {
		"set isolation to committed read",
		 0 
    };

sqli_stmt(ESQLINTVERSION, &_SQ0,sqlcmdtxt,  0 , (ifx_sqlvar_t *) 0 , (struct value *) 0 , (ifx_literal_t *) 0 ,
        (ifx_namelist_t *) 0 , (ifx_cursor_t *) 0 , - 1 ,  0 ,  0 );

и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
static   const   char   *sqlcmdtxt[]   ={ 
      "   select   callno   from   customers   where   cust_name   =   ? ",
      0 
   };

static   ifx_cursor_t   _SQ0   =   { 0 };
static   ifx_sqlvar_t   _sqibind[]   =
        {
            {    100 ,    20 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0    },
        };

sqibind[ 0 ].sqldata   =   c_name;

sqli_stmt(ESQLINTVERSION,   &_SQ0,   (char   **)   sqlcmdtxt,    1 ,   _sqibind, 
        (struct   value   *)    0 ,   (ifx_literal_t   *)    0 ,   (ifx_namelist_t   *)    0 ,
        (ifx_cursor_t   *)    0 ,    4 ,    0 ,    0 ); 


Возможно один из них не рабочий (второй).

Короче требуется мануал на sqli_stmt или грамотный совет.

Есть идея, что количество запросов определяется так:
Код: plaintext
1.
2.
3.
4.
 if( sqlcmdtxt[nnn] ==  0  )
 {
   END;
 }

А icnt определяет количество элементов в ibind и т.п. аргументах.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36669925
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вы что хотите сделать-то в итоге? и на каком языке программирования?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670016
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Язык C++
Хочу знать за что отвечает параметр icnt

Я перехватываю вызов этой функции.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670019
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже точнее, как наиболее грамотно извлекать текст запросов из cmdtxt?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670035
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StKgnДаже точнее, как наиболее грамотно извлекать текст запросов из cmdtxt?типа пишете прокси длл для логирования запросов? Сниферить не проще?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670177
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисStKgnДаже точнее, как наиболее грамотно извлекать текст запросов из cmdtxt?типа пишете прокси длл для логирования запросов? Сниферить не проще?

Как "прокси длл", но не прокси длл, не суть. Лог естественно пишет. В любом случае надо знать апи перехватываемых функций.

Снифферить не подумал ) .. это будет в крайнем случае.

Снифферить не совсем хорошая идея, т.к. соединение Клиент-Сервер локальное (на одной машине), и на этот серв не очень хорошо до устанавливать что-либо он всё время включен и в работе, а сетевые снифферы до устанавливают свои дрова. Чтобы получить 1-2 запроса покупать сниффер влом, а крякнутый ставить боязно.. кейгены с вирями частенько.

Кстати, а чем лучше снифферить SQL соединения???

Есть ли комманды/опции в Informix для включения записи лога запросов в версии под Windows ?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670338
StKgn
Кстати, а чем лучше снифферить SQL соединения???
покупать, шутка? Wireshark лучший и бесплатный.

StKgn
Есть ли комманды/опции в Informix для включения записи лога запросов в версии под Windows ?есть, версия инфромикса какая?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670347
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StKgnЕсть программа взаимодействующая с ней.
Она делает обращения к бд используя библиотеку Isqlt09a.dll, вызывая функцию sqli_stmt.
Программа напрямую дёргает dll?
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670375
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StKgnЕсть ли комманды/опции в Informix для включения записи лога запросов в версии под Windows ?
А в FAQ заглядывали ?
Как сделать трассировку запросов к Informix ?
http://www.sql.ru/faq/faq_topic.aspx?fid=2529
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670685
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу оговорюсь, что меня всё-же интересует доделать перехват который я делал.

семикрылый дятелStKgn
Кстати, а чем лучше снифферить SQL соединения???
покупать, шутка? Wireshark лучший и бесплатный.


Спасибо, посмотрю. Но как я понимаю, конкретно лог SQL запросов от конкретного приложения программа не дает. Это будет дамп запросов на уровне TCP пакетов. Ведь так?

семикрылый дятелStKgn
[quot StKgn]
Есть ли комманды/опции в Informix для включения записи лога запросов в версии под Windows ?есть, версия инфромикса какая?

Вероятно версия 9.5 (это выдает зарос: select owner from informix.systables where tabname = ' VERSION' ) другого способа проверить версию не нашел.

-------------------------

АнатоЛойStKgnЕсть программа взаимодействующая с ней.
Она делает обращения к бд используя библиотеку Isqlt09a.dll, вызывая функцию sqli_stmt.
Программа напрямую дёргает dll?

Программа-клиент напрямую обращается к библиотеке (Isqlt09 a .dll) а та по локальному соединению общается с сервером. В принципе использование динамической библиотеки прямее быть не может, это клиент-серверная система. ODBC (Iсlit09 b .dll) не используется.
... я вот посмотрел, что использование ODBC, что использование обращений "на прямую в библиотеку" - разница в производительности минимальная. И одинаково догружаются библиотеки в процесс.. только это разные библиотеки и разные интерфейсы. А дальше они работают (за редким исключением) совсем одинаково подключаясь к информиксу и обмениваясь с ним данными.
Это конечно другая тема..
Вполне вероятно, использование Isqlt09a.dll может быть производительнее ODBC, т.к. последний предоставляет общий интерфейс к БД, а Isqlt09a.dll - специфичный для БД. Т.е. например один вызов к sqli_stmt позволяет передать на сервер в БД сразу несколько запросов и наборы данных к ним. Что (как я пологаю) отсутствует в ODBC.

-------------------------

vasilisStKgnЕсть ли комманды/опции в Informix для включения записи лога запросов в версии под Windows ?
А в FAQ заглядывали ?
Как сделать трассировку запросов к Informix ?
http://www.sql.ru/faq/faq_topic.aspx?fid=2529

Именно в это FAQ не заглядывал. Спасибо, я посмотрю.

--------------------------

Короче, всем спасибо! Более менее понял, что есть Informix и с чем его едят.

Если у кого будут мысли по параметру icnt или функции sqli_stmt , пишите.

P.S.
Удивительно, есть программы которые используют только этот интерфейс (я о библиотеке Isqlt09a.dll) и в инете на него нет описаний. O_o
Вот так IBM продвигает свою БД... Возможно она больше зарабатывает с продажи мануалов, чем с продажи самой БД.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670902
Фотография aist-psk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBM это слон и делает , что считает для себы нужным
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36670903
Фотография aist-psk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aist-pskIBM это слон и делает , что считает для себы нужным

тьфу : для себы=для себя
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36671674
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StKgnКороче требуется мануал на sqli_stmt или грамотный совет.

Я не уверен, но похоже что информикс не может выполнить несколько запросов, за раз.
Похоже что первым там всегда лежит указатель на строку запроса, а вторым null.
icnt используется похоже по разному, в том числе и для количества биндов.

StKgnУдивительно, есть программы которые используют только этот интерфейс (я о библиотеке Isqlt09a.dll) и в инете на него нет описаний. Видимо предполагалось что напрямую его использовать не будут, а будут например генерить сишный код прекомпилятором esqlc. Я тоже искал эту документацию 10 лет назад, никакого ibm тогда еще на горизонте не было. Хотел написать компонент с прямым доступом, не нашел. А потом, спасибо luxena, они сделали idac, может у них дока была, а может генерили esqlс и переписывали на паскале.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36671684
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а для препареных запросов наверно и текст не передается, а только имя ifx_statement_t *scb
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36671700
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вообще sqli_stmt, это фиг знает что вообще такое, скорее типа выполнить запрос, не препареный, не возвращающий результата.

берем: esqlc.exe demo2.ec
смотрим: demo2.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
sqli_connect_open(ESQLINTVERSION, 0, "stores_demo", (char *)0, (ifx_conn_t *)0, 0);
sqli_prep(ESQLINTVERSION, _Cn1, demoquery,(ifx_literal_t *)0, (ifx_namelist_t *)0, -1, 0, 0 ); 
sqli_curs_decl_dynm(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, _Cn2, 512), _Cn2, sqli_curs_locate(ESQLINTVERSION, _Cn1, 513), 0, 0);
sqli_curs_open(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, _Cn2, 768), &_SD0, (char *)0, (struct value *)0, 1, 0);
sqli_curs_fetch(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, _Cn2, 768), (ifx_sqlda_t *)0, &_SD0, (char *)0, &_FS1);
sqli_curs_close(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, _Cn2, 768));
sqli_curs_free(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, _Cn1, 770));
sqli_connect_close(3, (char *)0, 0, 0);
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36672144
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче эта библиотека (Isqlt09a.dll) используется для трансляции с ESQL/C на си вставок из SQL.
Поэтому она не документирована.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36672564
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
продолжу...

берем: esqlc.exe timeout.ec
смотрим: timeout.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
sqli_connect_open(ESQLINTVERSION,  0 , "stores_demo", (char *)  0 , (ifx_conn_t *)  0 ,  0 );
sqli_connect_close( 3 , (char *)  0 ,  0 ,  0 );
sqli_curs_decl_stat(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  512 ), (char *) _Cn1,(char **) sqlcmdtxt, (ifx_sqlda_t *)  0 , (ifx_sqlda_t *)  0 ,  0 , (ifx_literal_t *)  0 , (ifx_namelist_t *)  0 ,  2 ,  0 ,  0 );
sqli_curs_open(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  768 ), (ifx_sqlda_t *)  0 , (char *)  0 , (struct value *)  0 ,  0 ,  0 );
sqli_curs_close(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  768 ));
sqli_curs_free(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  770 ));
sqli_curs_fetch(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  768 ), (ifx_sqlda_t *)  0 , &_SD0, (char *)  0 , &_FS1);
sqli_curs_close(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  768 ));
sqli_curs_free(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  770 ));
sqli_curs_close(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  768 ));
sqli_curs_free(ESQLINTVERSION, sqli_curs_locate(ESQLINTVERSION, (char *) _Cn1,  770 ));

sqli_stmt(ESQLINTVERSION, &_SQ0, (char **) sqlcmdtxt,  0 , (ifx_sqlvar_t *)  0 , (struct value *)  0 , (ifx_literal_t *)  0 , (ifx_namelist_t *)  0 , (ifx_cursor_t *)  0 , - 1 ,  0 ,  0 );
sqli_stmt(ESQLINTVERSION, &_SQ0, (char **) sqlcmdtxt,  3 , _sqibind, (struct value *)  0 , (ifx_literal_t *)  0 , (ifx_namelist_t *)  0 , (ifx_cursor_t *)  0 ,  6 ,  0 ,  0 );

sqli_slct(ESQLINTVERSION, &_SQ0,(char **) sqlcmdtxt, 0 ,(ifx_sqlvar_t *)  0 , 1 ,_sqobind, 0 ,(ifx_literal_t *)  0 ,(ifx_namelist_t *)  0 , 0 );
sqli_stmt(ESQLINTVERSION, &_SQ0, (char **) sqlcmdtxt,  0 , (ifx_sqlvar_t *)  0 , (struct value *)  0 , (ifx_literal_t *)  0 , (ifx_namelist_t *)  0 , (ifx_cursor_t *)  0 ,  2 ,  0 ,  0 );
sqli_diag_get(ESQLINTVERSION, _SQhtab, - 1 );
sqli_diag_get(ESQLINTVERSION, _SQhtab, i);
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36672622
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что? Я об этом уже сказал "скорее типа выполнить запрос, не препареный, не возвращающий результата"

sqlcmdtxt[] = "drop table canceltst"
sqli_stmt(ESQLINTVERSION, &_SQ0, sqlcmdtxt,


Но на самом деле курсор оно вернуть может. Т.е. это функция для выполнения непрепареных запросов.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36672632
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее массив из двух указателей:

Код: plaintext
1.
2.
3.
4.
5.
 static const char *sqlcmdtxt[] =
    {
    "drop table canceltst",
    0
    };
может и три можно запихнуть, наверно "0" терминирует, попробуйте.
...
Рейтинг: 0 / 0
Indormix Isqlt09a.dll функция sqli_stmt
    #36673896
StKgn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснил следующее: SQL запрос для передачи на сервер ч/з функцию sqli_stmt (или аналогичных) дробится на строки длиной не более 512 байт, поэтому sqlcmdtxt объявляется как char**. Вероятно это надо было для борьбы с переполнением буффера... или хз. чем.
А icnt это количество элементов в ibind. ibind хранит аргументы запроса.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Indormix Isqlt09a.dll функция sqli_stmt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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