Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Indormix Isqlt09a.dll функция sqli_stmt / 20 сообщений из 20, страница 1 из 1
04.06.2010, 14:04
    #36669336
StKgn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
Есть бд 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
04.06.2010, 16:35
    #36669925
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
а вы что хотите сделать-то в итоге? и на каком языке программирования?
...
Рейтинг: 0 / 0
04.06.2010, 16:57
    #36670016
StKgn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
Язык C++
Хочу знать за что отвечает параметр icnt

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

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

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

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

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

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

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

семикрылый дятел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
05.06.2010, 12:02
    #36670902
aist-psk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
IBM это слон и делает , что считает для себы нужным
...
Рейтинг: 0 / 0
05.06.2010, 12:03
    #36670903
aist-psk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
aist-pskIBM это слон и делает , что считает для себы нужным

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

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

StKgnУдивительно, есть программы которые используют только этот интерфейс (я о библиотеке Isqlt09a.dll) и в инете на него нет описаний. Видимо предполагалось что напрямую его использовать не будут, а будут например генерить сишный код прекомпилятором esqlc. Я тоже искал эту документацию 10 лет назад, никакого ibm тогда еще на горизонте не было. Хотел написать компонент с прямым доступом, не нашел. А потом, спасибо luxena, они сделали idac, может у них дока была, а может генерили esqlс и переписывали на паскале.
...
Рейтинг: 0 / 0
06.06.2010, 13:37
    #36671684
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
а для препареных запросов наверно и текст не передается, а только имя ifx_statement_t *scb
...
Рейтинг: 0 / 0
06.06.2010, 14:01
    #36671700
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
и вообще 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
07.06.2010, 00:59
    #36672144
StKgn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
Короче эта библиотека (Isqlt09a.dll) используется для трансляции с ESQL/C на си вставок из SQL.
Поэтому она не документирована.
...
Рейтинг: 0 / 0
07.06.2010, 11:00
    #36672564
StKgn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
продолжу...

берем: 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
07.06.2010, 11:18
    #36672622
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Indormix Isqlt09a.dll функция sqli_stmt
и что? Я об этом уже сказал "скорее типа выполнить запрос, не препареный, не возвращающий результата"

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


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

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


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