MiniM. Saving time.


| About | Download | Tools | Knowledge Base | How to Buy |

MiniM Overview

Getting Started

Download

Documentation

Tools

Cache Tools

GT.M Tools

Knowledge Base

FAQ

Contacts

Copyrights

MiniM Additional Tools | ENG | Dec 28, 2011

Эмуляция функции $ZSEARCH для MiniM

При портировании разработанных программ и при разработке новых функций возникает задача получить список файлов по заданной маске. В СУБД Cache для этого используется системная функция $ZSEARCH. Эта функция может быть эмулирована в MiniM без каких-либо переделок портируемого кода.

Для эмуляции системной $Z функции в MiniM необходимо создать рутину с именем начинающимся на %ZFUNC. В рутине должны быть метки соответствующие именам эмулируемых функций. В случае с функцией $ZSEARCH нужно сделать две метки, с именами ZSEARCH и ZSE. Вторая - это укороченный синоним.

Метки принимают по одному аргументу, target. Значение аргумента означает:

  1. Если пустая строка то функция возвращает следующее имя файла для маски заданной на предыдущем вызове.
  2. Если строка не пустая то создается новый поиск и строка задает маску файла, с возможным использованием символов подстановок "*" и "?".

Функция возвращает значение пустая строка если следующего имени файла нет либо возвращает следующее имя файла в его полном виде, с каталогом и буквой диска.

Для эмуляции поведения функции $ZSEARCH используем рутину %ZFUNCSEARCH и локальную переменную %zsearch. В функции эмуляции проверяем, необходимо ли начать новый поиск и проверяем есть ли следующий для возврата файл. Если есть, то его возвращаем и забываем:

ZSEARCH(target)
 ; if target is not empty string, create new file list
 i target'="" d makenew
 ; get next file number
 n n=$o(%zsearch("f","")),ret
 ; if files are out, return empty string
 i n="" s ret="" k %zsearch
 ; get next file name and remove from queue
 e  s ret=%zsearch("f",n) k %zsearch("f",n)
 q ret

Функция makenew полностью пересоздает локальную переменную %zsearch по заданному шаблону имени файла:

makenew
 ; remove entire queue
 k %zsearch
 ; save current file pattern
 s %zsearch("p")=target
 n mask,file,dir,dev,saveio,saveeof
 ; normalize slashs and separate dir from file
 s mask=$tr(target,"/","\")
 s dir=mask,$p(dir,"\",$l(dir,"\"))=""
 ; if dir was not present, use current dir
 i dir="" s dir=$v("proc",7)_"\"
 s file=$p(mask,"\",$l(mask,"\"))
 ; call dir OS command and
 ;   redirect possible error message about file not found
 s dev="|PIPE|dir /b "_$zquote(dir_file)_" 2> NUL"
 ; after execution current device need to be restored
 s saveio=$io
 o dev:"rt" u dev
 ; use $zeof end of device input indicator
 s saveeof=$v("proc",5,0)
 ; read all line by line
 f  r file q:$zeof  s %zsearch("f",$i(%zsearch("f")))=dir_file
 ; restore $zeof indicator behaviour
 i $v("proc",5,saveeof)
 ; restore current device
 u saveio
 ; close dir device
 c dev
 q

Здесь в одной функци ииспользуется одновременно несколько технологических элементов:

  • нормализация наклона разделительных слешей
  • учитывание что возвращать необходимо полное имя файла включая имя каталога, но каталог может быть не задан
  • вызов внешней программы операционной системы dir
  • чтение построчно с окончанием чтения при взведении индикатора $zeof
  • восстановление поведения индикатора $zeof и текущего устройства

После импорта функции %ZFUNCSEARCH процесс MiniM при обращении к невстроенной $Z функции вызывает ее эмуляцию с поведением в точности как в Cache:

 n mask,file
 s mask="c:\downloads\*.exe"
 s file=$zsearch(mask) i file'="" d  f  s file=$zse("") q:file=""  d
 . w file,!
 q

Загрузить рутину %ZFUNCSEARCH (zip, 1Kb)

Евгений Каратаев
support@minimdb.com


Copyright (C) 2017 Eugene Karataev
Emails: Info Tech Support