powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как сделать http-запрос из под ASE 11.9.x
3 сообщений из 3, страница 1 из 1
Как сделать http-запрос из под ASE 11.9.x
    #34613719
f_ase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Такая ситуация. Имеем старенький ASE 11.9.x.

Есть клиент, которому на sql-запрос нужно вернуть данные, получаемые через web. Для этого на ASE сервере нужно выполнить http-запрос к определенному адресу, полученный результат распарсить и вернуть ответ.

Подскажите, как лучше это сделать ? На ум приходит написать extended stored procedure, которой будем передавать URL, далее она будет скачивать нужную страницу, парсить и возвращать ответ.

Может где уже есть готовые esp для этих целей ?
...
Рейтинг: 0 / 0
Как сделать http-запрос из под ASE 11.9.x
    #34626690
f_ase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам разобрался, может кому будет интересно.


Итак: Писать esp сложно. Нигде не найдешь ни документацию, ни примеров.
Поэтому поступил так:

Скачал программку wget под windows (http://wget.dotsrc.org/). Затем запускаю ее с помощью xp_cmdshell. wget скачивает xml-файлик и возвращает его в ase. Мне нужно вытащить из xml отдельные параметры. Для этого я использую хранимаю процедуру.

По пути столкнулся с проблемой - для того, чтобы работать с результатами xp_cmdshell в хранимой процедуре нужно здорово поизвращаться.
Основываясь на доке http://www.sybase.com/detail?id=1029418 и http://groups.google.ru/group/sybase.public.sqlserver.unix/browse_thread/thread/1c58ba1bfa2e30a3/0dc4e987e66994e4?lnk=st&q=&rnum=1&hl=ru#0dc4e987e66994e4

делаем вызов xp_cmdshell через rpc. Нигде, кстати не встречал описания как это делать на русском языке.
Напишу сам:

итак, для того, чтобы у нас заработал вызов через RPC необходимо включить
Component Integration Services (CIS)

делается это так :

Код: plaintext
sp_configure "enable cis",  1  

далее ставим макс. кол-во соединений

Код: plaintext
sp_configure "max cis remote connections",  0 


Теперь нам необходимо задать имя сервера. По умолчанию ase себя никак не именует. Это можно увидеть, если в sqladvantage написать какую-нибудь левую команду, напр:

Код: plaintext
select date()

в ответ на это мы увидим

Server Message: Number 195, Severity 15
Line 1:
'date' is not a recognized built-in function name.


Прикрутим имя сервера:

предположим, он будет называться "MARS".

Зайдем в программку dsedit, и добавим новое имя - MARS с адресом 127.0.0.1,5000. Закроем dsedit.
После этого выполним команду

Код: plaintext
sp_addserver "MARS", "local", "MARS" 

local - это "класс" имени. Для локального сервера нужно задавать local. Третий параметр - это имя, котрое сконфигурено в dsedit-е.

Теперь ase думет что его зовут MARS. Это можно посмотреть так sp_helpserver. Обратите внимаение на id записи с нашим именем MARS. Оно всегда будет 0.
Попробуем опять выполнить select date(). Получим такой ответ:

Server Message: Number 195, Severity 15
Server 'MARS', Line 1:
'date' is not a recognized built-in function name.


Делать rpc-вызовы мы можем только к удаленным серверам. К серверам типа "local" делать такие вызовы нельзя. Поэтому заводим еще одно имя для нашего сервера с классом "sql_server". ASE будет думать, что это удаленный сервер.

Код: plaintext
sp_addserver "THIS", "sql_server", "MARS" 

Итак, теперь можно будет настроить на нашем локальном ase прокси-таблицу, которая будет брать данные с помощью rpc из "удаленного" сервера THIS.

Далее нужно решить проблему авторизации. Сделаем так, что при вызове rpc на удаленном сервере будет использоваться тот же логин, что и на локальном. Для этого и на удаленном и на локальных серверах должен быть заведен пользователь с одинаковым именем и паролем. В нашем случ. удаленный и локальный сервера - это одно и то же, поэтому с этим все в порядке.
Для добавления пользователся используется процедура sp_addremotelogin, но для нашего сервера MARS она не сработает, т.к. там стоит проверка что за сервер передается в параметры. Сервер типа "local" не прокатывает. Мы обойдем это ограничение и вставим запись в таблицу sysremotelogins напрямую:

Код: plaintext
insert sysremotelogins values ( 0 ,null,- 1 , 0 )


0 - это ID записи MARS
остальные парамтры означают, что при вызове rpc юзеры будут map-ится один к одному.


Все. Вроде как после sp_addserver "MARS", "local", "MARS" нужно перегрузить ase.

Далее делаем прокси-таблицу. Для этого я воспользовался мастером в Sybase Central (proxy tables -> new ... )
В качестве удаленного сервера выбираем THIS.

Командами это делается так: (сам не пробовал, может что-то не получиться)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sp_addobjectdef output_xp, "THIS...xp_cmdshell", "rpc" 
go
create existing table output_xp 
( 
cmdstr varchar( 255 ) null 
) 
external procedure at "THIS...xp_cmdshell" 
go 


Все. Вызов xp_cmdshell теперь будет выглядеть так:

Код: plaintext
select cmdstr from output_xp where cmdstr = "dir"


Все это я делал для ASE 11.9.5. Для старших версий должно быть примерно так же. Могут отличаться имена классов в sp_addserver.
...
Рейтинг: 0 / 0
Как сделать http-запрос из под ASE 11.9.x
    #34663322
f_ase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выше вкралась ошибочка. макс. кол-во соединений к удаленному серверу, конечно же нужно не 0.

Код: plaintext
sp_configure "max cis remote connections",  5 
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как сделать http-запрос из под ASE 11.9.x
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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