SASGIS - SACS.Планета
View Issue Details
0001841SACS.Планета[All Projects] Хотелкаpublic01-03-2013 06:2909-08-2013 15:13
vasketsov 
vasketsov 
highminorN/A
closedfixed 
WindowsVistaUltimate
 
130803 
0001841: Реализовать возможность использования ScriptControl
Подключить ScriptControl для унифицированного запуска скриптов на разных скриптовых языках.
http://msdn.microsoft.com/en-us/library/aa227400%28v=vs.60%29.aspx
No tags attached.
rar PerlScriptText.rar (652) 01-03-2013 17:45
https://bugtracker.sasgis.org/file_download.php?file_id=1295&type=bug
zip mobile.yandex.zmp.zip (5,616) 03-03-2013 17:03
https://bugtracker.sasgis.org/file_download.php?file_id=1297&type=bug
rar mobile.yandex.zmp.rar (3,488) 05-03-2013 10:13
https://bugtracker.sasgis.org/file_download.php?file_id=1298&type=bug
Issue History
01-03-2013 06:29vasketsovNew Issue
01-03-2013 06:29vasketsovStatusnew => assigned
01-03-2013 06:29vasketsovAssigned To => vasketsov
01-03-2013 17:45vasketsovNote Added: 0010756
01-03-2013 17:45vasketsovFile Added: PerlScriptText.rar
01-03-2013 17:49vasketsovNote Added: 0010757
02-03-2013 04:48zedNote Added: 0010758
02-03-2013 07:26vasketsovNote Added: 0010759
03-03-2013 17:03zedFile Added: mobile.yandex.zmp.zip
03-03-2013 17:05zedNote Added: 0010783
04-03-2013 11:10vasketsovNote Added: 0010788
04-03-2013 16:34zedNote Added: 0010790
04-03-2013 18:08vasketsovNote Added: 0010791
04-03-2013 19:03zedNote Added: 0010793
04-03-2013 20:21vasketsovNote Added: 0010794
05-03-2013 10:13vasketsovFile Added: mobile.yandex.zmp.rar
05-03-2013 10:21vasketsovNote Added: 0010795
05-03-2013 10:49vasketsovNote Added: 0010796
05-03-2013 13:23vasketsovNote Added: 0010806
05-03-2013 13:25vasketsovNote Edited: 0010806bug_revision_view_page.php?bugnote_id=10806#r5217
05-03-2013 13:33vasketsovNote Edited: 0010806bug_revision_view_page.php?bugnote_id=10806#r5218
05-03-2013 13:37vasketsovNote Edited: 0010806bug_revision_view_page.php?bugnote_id=10806#r5219
05-03-2013 17:21zedNote Added: 0010808
05-03-2013 20:20vasketsovNote Added: 0010810
07-03-2013 12:00vasketsovNote Added: 0010837
07-03-2013 12:01vasketsovStatusassigned => resolved
07-03-2013 12:01vasketsovResolutionopen => fixed
09-08-2013 15:00vasketsovFixed in Version => 130803
09-08-2013 15:13vasketsovStatusresolved => closed

Notes
(0010756)
vasketsov   
01-03-2013 17:45   
Чтобы потестить:
1. В params.ini надо добавить что-то типа:
[ScriptControl]
Filename=PerlScriptText.txt
NeedSync=1
Language=PerlScript
Function=sas_main
InputParamNames=x,y,z,q

2. Создать файлик PerlScriptText.txt с содержимым типа приаттаченного (там пример для ч/б нокии) и кинуть его в zmp.
(0010757)
vasketsov   
01-03-2013 17:49   
По поводу параметров:
xy - тайловые координаты
z - зум (от 1)
q - quadkey
v - version
Порядок параметров любой, но должен соответствовать скрипту, обязательных параметров нет.
Имя функции любое (лишь бы она была в скрипте).
Файл скрипта должен быть с расширением txt.
(0010758)
zed   
02-03-2013 04:48   
Это типа альтернатива GetUrlScript? Или что куда вообще?
(0010759)
vasketsov   
02-03-2013 07:26   
GetUrlScript можно переименовать, чтобы туда не лазило.
Хотя по идее задумано, что если указано [ScriptControl] и есть файлик - паскальскрипт для этой карты не используется.

Скрипт (функция в нём, с именем из Function) должен получать параметры, указанные в InputParamNames (в примере x,y,z,q, пусть даже первые три и не используются, их можно и убрать, но оставлено, версии тут нет). Чё-то я не подумал, что дефолтный урл из zmp (из params.txt) тоже можно пропихнуть, надо будет сделать.

Функция возвращает либо код ошибки (как int, если надо - можно добавить и заголовки, но придётся смотреть длину массива и типы значений), либо массивчик значений типа кода статуса http, длины ответа, заголовков, собственно ответа, типа контента, там в примере скрипта это прокомментировано. Вернуться должен variant array. Качает тайл и делает всё прочее нужное скрипт сам.

Возвращение из скрипта одного строкового параметра зарезервировано для информирования саса о том, что требуемый тайл уже скачан и лежит там-то, соответственно в этом случае из скрипта передаётся полный путь, и далее логика ровно та же самая, как я делал для протокола file:// - тип контента, размер и тело берётся из файла, то есть тут ничего больше передавать не надо.

Как а) писать на других языках и б) что указывать как Language (PhpScript или VBScript или JScript какой) скорее всего я не подскажу, первое их апологетам известно лучше, второе скорее всего можно найти по ссылке на msdn выше (или вообще примеры в инете).
(0010783)
zed   
03-03-2013 17:05   
Приаттачил zmp - почему-то выскакивает InternalError, хотя сам скрипт из командной строки работает нормально.
(0010788)
vasketsov   
04-03-2013 11:10   
>почему-то выскакивает InternalError
Ага, есть такое, с моим приаттаченным тоже бывает. Иной раз скачаешь пяток тайлов - на 6-й раз вылезет, перекачиваешь тайл - нормально скачивает (причём там если синхронизация - используется критическая секция, так что по двое никто никуда не пролезет). Где-то что-то кривится внутри ScriptControl похоже, или сборщик мусора какой-нибудь гадит. Потому и взял попробовать ещё ActiveScript.
(0010790)
zed   
04-03-2013 16:34   
>Иной раз скачаешь пяток тайлов
У меня ещё печальнее - ни одного тайла скачать не получается...
(0010791)
vasketsov   
04-03-2013 18:08   
Пописал ScriptControl:
1. Добавил CoInitialize.
2. Параметры скрипта убрал из экземпляра и сделал на стеке как VarArray.
У меня эта ошибка пропала. Даже в режиме кэш+интернет нокия стала грузиться )).
Так что поверяй.
ps. Правда я так и не рискнул пока что многопоточно через ScriptControl качать.

Вариант с ActiveScript недоковырен, там надо Invoke сделать (чтобы функцию с параметрами позвать), но если реализация с ScriptControl заработает и будет устраивать по скорости и надёжности - забью и выпилю ActiveScript.
(0010793)
zed   
04-03-2013 19:03   
Выдало ту же ошибку и всё остановилось. Но судя по сниферу, один тайл таки скачать умудрилось.

Глянь скрипт опытным глазом? Я в perl не силён, может крепко нахомутал чё.
(0010794)
vasketsov   
04-03-2013 20:21   
Я пробовал поглядеть - из того, что в глаза бросилось - это \? (зачем там \ не пойму) да вызов функции ym_get_boundary без параметров и без скобок (чего перл не любит в зависимости от фазы луны).
Больше ничего не углядел, но особо и не ковырялся. Убрал \ и добавил скобки - не полегчало, где-то что-то хитрее.

Сделал ActiveScript - так он у меня и на нокии работает
А на твоём яндексе всё то же InternalError.
Чую где-то там косяк, отлаживаться надо...

А вообще погляди у себя какие есть парсеры.
Это смотрится в реестре по разделам вида:
HKEY_CLASSES_ROOT\PerlScript\OLEScript
HKEY_CLASSES_ROOT\VBScript\OLEScript
может есть
HKEY_CLASSES_ROOT\PhpScript\OLEScript
например или
HKEY_CLASSES_ROOT\JScript\OLEScript
Не PerlScript-ом же единым...
(0010795)
vasketsov   
05-03-2013 10:21   
Загрузил mobile.yandex.zmp.rar - вот так работает.
Что называется найдите 10 отличий )))
Вырезал всё и кусками назад затаскивал.
Из важного - перенёс UserAgent и сделал KeepAlive.
Короче говоря через ScriptControl пашет, лажается у меня 1 тайл из нескольких десятков.

А вот через ActiveScript валится чаще.

Переделал в общей ini-шке
[ScriptControl]
UseScriptControl=1

если 1 - ScriptControl, если 2 - ActiveScript, по умолчанию 0 - ничего.
(0010796)
vasketsov   
05-03-2013 10:49   
Ещё б придумать как отладочные сообщения при загрузке скрипта при работе из-под Delphi придушить...
(0010806)
vasketsov   
05-03-2013 13:23   
(edited on: 05-03-2013 13:37)
Если кому будет интересно:

Для php (ActivePHP) тут:
http://pecl.php.net/package/PHPScript
   As of PHP 5.0.1, ActiveScript has been moved to the PECL repository.
   The DLL for this PECL extension may be downloaded from either the PHP
   Downloads page or from http://pecl4win.php.net/
Но можно забрать отсюда
http://museum.php.net/php4/
в версии php-4.4.9-Win32.zip

Для perl (PerlScript) ставится сразу при установке ActiveState ActivePerl (там же есть активный питон, но мопед не мой...)

VBScript и JScript есть сразу

(0010808)
zed   
05-03-2013 17:21   
Походу этот InternalError только под дебагером вылетает, потому как обычная дебажная версия с EurekaLog качает исправно и без ошибок. Спасибо за фиксы!

>Ещё б придумать как отладочные сообщения при загрузке скрипта при работе из-под Delphi придушить...
Не встречал таких. Что за сообщения?

А вообще, конечно, фигово, что исправно работающий скрипт может глючить через этот ScriptControl. Когда я встраивал php, помницца, таких проблем небыло. Так что может быть и стоит возродить его из пепла, тем более, что для работы там требовалась всего одна dll без какой-либо необходимости регистрации её в системе.
(0010810)
vasketsov   
05-03-2013 20:20   
>Что за сообщения?
Ну OutputDebugString которые, когда из-под delphi запускаешь - внизу в окно валятся, типа DLL заружена, поток создан-убит, так вот при загрузке скрипта туда столько валится, что время запуска саса из-под delphi заметно увеличивается.

>фигово, что исправно работающий скрипт может глючить через этот ScriptControl
ну не сказать что уж прямо сильно глючит ))) скорее это можно охарактеризовать как "полная задница с обработкой информации об ошибках".

>качает исправно и без ошибок
У меня возникла мысль, что ошибка может быть из-за того, что в рабочем потоке не выполнено CoInitialize. Ну не будешь же перед запуском скрипта каждый раз её выполнять ))) а вот при ошибке оно каким-то макаром инициализируется, соответственно тот workaround, который я сделал для пустого ответа из скрипта - и отрабатывает. По крайней мере по косвенным признакам это так (не более 1 ошибки при однопоточном доступе, повторно отрабатывает верно).

>может быть и стоит возродить его из пепла
Так погляди, может и стоит.
В принципе ничего универсальнее не сделаешь, но если будет выигрыш в надёжности или скорости - будет замечательно.
(0010837)
vasketsov   
07-03-2013 12:00   
Пока что рекомендуется использовать ScriptControl.
Но ActiveScript не вырезан (и в частности доступен для тестирования и допиливания).
Если надо будет в скрипты пропихивать объекты из саса, добавить параметры, что-нибудь изменить - пишите отдельными тикетами. А этот работает - и ладно.