
PowerBuilder::ORCA - Perl API äëÿ ðàáîòû ñ .pbl è îáúåêòàìè PowerBuider

use PowerBuilder::ORCA qw/:const/;
#îòêðûâàåì ORCA-ñåññèþ
my $ses=new PowerBuilder::ORCA(['d:\WORK\C\xs\PowerBuilder\ORCA\pbtest.pbl'],
'd:\WORK\C\xs\PowerBuilder\ORCA\pbtest.pbl',
'pbtest');
#òåïåðü ìîæíî âûïîëíÿòü ìàíèïóëÿöèè ñ îáúåêòàìè
my $rc=$ses->Export("pbtest.pbl","f_is_dir",PBORCA_FUNCTION,$buf);
my %h;
$ses->EntryInfo("pbtest.pbl","f_db_connect",PBORCA_FUNCTION,\%h);
#çàêðûâàåì ñåññèþ
$ses->Close();

Ýòîò ìîäóëü äàåò âîçìîæíîñòü èñïîëüçîâàòü Powersoft Open Library API (ORCA) èç Perl. ORCA ïðåäñòàâëÿåò ñîáîé API äëÿ äîñòóïà ê ôóíêöèÿì PowerBuilder Library Manager. Èñïîëüçóÿ ORCA ìîæíî ïðîãðàììíî âûïîëíÿòü òå æå îïåðàöèè ïî óïðàâëåíèþ îáúåêòàìè è áèáëèîòåêàìè, ÷òî è â Powerbuilder Libarary painter. ORCA API áûëî ðàçðàáîòàíî äëÿ ïðîèçâîäèòåëåé CASE ñðåäñòâ, êîòîðûì íåîáõîäèì ïðîãðàììíûé äîñòóï ê ôàéëàì .pbl äëÿ ñîçäàíèÿ è ìîäèôèêàöèè îáúåêòîâ PowerBuilder. ERwin è S-Designor ðàáîòàþò ÷åðåç ORCA.
Äëÿ çàïóñêà ïðîãðàìì èñïîëüçóþùèõ ORCA API íåîáõîäèìà pborcNN.dll, êîòîðàÿ âõîäèò â ñîñòàâ professional è enterprise âåðñèé PB, ãäå NN - íîìåð âåðñèè PB. Äëÿ PB 6 - pborc60.dll.
Ïîäðîáíîå îïèñàíèå èäåîëîãèè è ôóíêöèé ORCA ìîæíî íàéòè â äîêóìåíòàöèè ïî PB (http://manuals.sybase.com/onlinebooks/group-pb/adt/orca/).
Ñîîòâåòñòâèå èìåí ôóíêöèé ORCA API è ôóíêöèé ïðåäîñòàâëÿåìûõ ORCA.pm:
ORCA API ORCA.pm
------------------------------ ------------------
PBORCA_SessionClose Close
PBORCA_SessionGetError GetError
PBORCA_SessionOpen new
PBORCA_SessionSetCurrentAppl SetAppl
PBORCA_SessionSetLibraryList SetLibList
PBORCA_LibraryCommentModify LibCommentModify
PBORCA_LibraryCreate LibCreate
PBORCA_LibraryDelete LibDel
PBORCA_LibraryDirectory LibInfo,LibDir,LibDirList
PBORCA_LibraryEntryCopy Copy
PBORCA_LibraryEntryDelete Del
PBORCA_LibraryEntryExport Export
PBORCA_LibraryEntryInformation EntryInfo
PBORCA_LibraryEntryMove Move
PBORCA_CheckOutEntry CheckOut
PBORCA_CheckInEntry CheckIn
PBORCA_ListCheckOutEntries ListCheckOutEntries
PBORCA_CompileEntryImport Import
PBORCA_CompileEntryImportList ImportList
PBORCA_CompileEntryRegenerate Regenerate
PBORCA_ExecutableCreate ExeCreate
PBORCA_DynamicLibraryCreate DllCreate
PBORCA_ObjectQueryHierarchy ObjectQueryHierarchy
PBORCA_ObjectQueryReference ObjectQueryReference

Áîëüøèíñòâî ôóíêöèé âîçâðàùàþò íåíóëåâîé êîä îøèáêè â ñëó÷àå íåóäà÷íîãî çàâåðøåíèÿ. Ñîîáùåíèå îá îøèáêå ìîæíî ïîëó÷èòü ô-åé GetError.
Êîä Îïèñàíèå
--- -----------------------------------
0 Operation successful
-1 Invalid parameter list
-2 Duplicate operation
-3 Object not found
-4 Bad library name
-5 Library list not set
-6 Library not in library list
-7 Library I/O error
-8 Object exists
-9 Invalid name
-10 Buffer size is too small
-11 Compile error
-12 Link error
-13 Current application not set
-14 Object has no ancestors
-15 Object has no references
-16 Invalid # of PBDs
-17 PBD create error
-18 Source Management error
Äëÿ ôóíêöèé, â êîòîðûå ïàðìåòðîì ïåðåäàåòñÿ òèï îáúåêòà, çíà÷åíèåì ýòîãî ïàðàìåòðà äîëæåíà áûòü îäíà èç êîíñòàíò, îïèñàííûõ â ðàçäåëå "Exported constants".
Ïåðåä íà÷àëîì ðàáîòû íåîáõîäèìî óêàçàòü èìÿ ORCA dll. Dll ORCA ðàçíûõ âåðñèé PB èìåþò ðàçíûå èìåíà.
Çàãðóæàåò äëÿ ðàáîòû óêàçàííóþ dll. Åñëè ôàéë íå ñóùåñòâóåò è èìÿ ôàéëà óêàçàíî áåç ïóòè - èùåò åãî ïî PATH. Åñëè èìÿ ôàéëà íå çàäàíî - ïðîâåðÿåò ïåðåìåííóþ ñðåäû ORCA_DLL, åñëè îíà çàäàíà - çàãðóæàåò óêàçàíóþ â íåé dll. Åñëè ïåðåìåííàÿ ñðåäû íå çàäàíà - èùåò ïî PATH dll âåðñèè 9,8,7,6 èëè 5 è çàãðóæàåò ïåðâóþ íàéäåííóþ. Åñëè íè÷åãî íå ïîìîãëî - óìèðàåò.
Èìÿ çàãðóæåííîé dll ñîõðàíÿåòñÿ â ïåðåìåííîé $PowerBuilder::ORCA::ORCA_Dll.
Ñîçäàåò íîâûé îáúåêò, îòêðûâàåò ORCA ñåññèþ, âîçâðàùàåò óêàçàòåëü íà îáúåêò. Âòîðîé âàðèàíò âûçîâà óñòàíàâëèâàåò òàêæå library list, ïîñëåäíèé âàðèàíò óñòàíàâëèâàåò library list è òåêóùåå ïðèëîæåíèå. ×àñòü ôóíêöèé ORCA òðåáóþò óñòàíîâëåííîãî library list è òåêóùåãî ïðèëîæåíèÿ (ñì. SetLibList è SetAppl).
Óñòàíàâëèâàåò library list äëÿ ñåññèè. Library list èñïîëüçóåòñÿ äëÿ ïîèñêà ïðè ðàçðåøåíèè ññûëîê ì-äó îáúåêòàìè. Ïðè ïîèñêå áèáëèîòåêè ïðîñìàòðèâàþòñÿ â çàäàííîì ïîðÿäêå. Ïî âîçìîæíîñòè, ñëåäóåò óêàçûâàòü ïîëíûé ïóòü ê ôàéëàì. Ô-ÿ ìîæåò áûòü âûçâàíà äëÿ ñåññèè òîëüêî îäèí ðàç, åäèíñòâåííûé ñïîñîá èçìåíèòü ñïèñîê, ïîñëå òîãî êàê îí áûë óñòàíîâëåí, - çàêðûòü òåêóùóþ ñåññèþ è ñîçäàòü íîâóþ.
Ñëåäóþùèå ôóíêöèè ìîãóò èñïîëüçîâàòüñÿ áåç óñòàíîâêè library list:
CommentModify
LibCreate
LibDel
LibInfo,LibDir,LibDirList
Copy
Del
Export
EntryInfo
Move
CheckOut
CheckIn
Ôóíêöèè âûïîëíÿþùèå êîìïèëÿöèþ è âîçâðàùàþùèå èíôîðìàöèþ î ñâÿçÿõ ì-äó îáúåêòàìè òðåáóþò çàäàíèÿ library list.
Óñòàíàâëèâàåò òåêóùåå ïðèëîæåíèå. Ïåðåä âûçîâîì ýòîé ô-èè íåîáõîäèìî óñòàíîâèòü library list ô-åé SetLibList(). Ôóíêöèè âûïîëíÿþùèå êîìïèëÿöèþ è âîçâðàùàþùèå èíôîðìàöèþ î ñâÿçÿõ ì-äó îáúåêòàìè òðåáóþò âûçîâà ýòîé ô-èè. Ô-ÿ ìîæåò áûòü âûçâàíà äëÿ ñåññèè òîëüêî îäèí ðàç. Äëÿ ïåðåêëþ÷åíèÿ íà äðóãîå ïðèëîæåíèå íåîáõîäèìî çàêðûòü òåêóùóþ ñåññèþ è ñîçäàòü íîâóþ. Áèáëèîòåêè, ïî âîçìîæíîñòè, ñëåäóåò óêàçûâàòü ñ ïîëíûì ïóòåì. Áèáëèîòåêà $pbl äîëæíà âõîäèòü â Libarary list è åå èìÿ äîëæíî áûòü óêàçàíî â òî÷íîñòè òàêæå, êàê ïðè óñòàíîâêå Library list.
Çàêðûâàåò ñåññèþ, îñâîáîæäàåò ðåñóðñû.
Âîçâðàùàåò îïèñàíèå ïîñëåäíåé îøèáêè ORCA ñåññèè. Ìîæåò áûòü âûçâàíà â ëþáîé ìîìåíò ïîñëå òîãî êàê êàêàÿ-ëèáî èç ô-èé ORCA çàâåðøèëàñü ñ ïðèçíàêîì îøèáêè. Âñå ôóíêöèè âîçâðàùàþò íåíóëåâîé êîä âîçâðàòà â ñëó÷àå îøèáêè. GetError âîçâðàùàåò ïîëíûé òåêñò ñîîáùåíèÿ îá îøèáêå. Åñëè îøèáîê íå áûëî, âîçâðàùàåòñÿ ïóñòàÿ ñòðîêà.
Âîçâðàùàåò èíôîðìàöèþ îá îáúåêòå $obj òèïà $type èç áèáëèîòåêè $pbl. Èíôîðìàöèÿ âêëþ÷àåò â ñåáÿ êîììåíòàðèé, ðàçìåð èñõîäíîãî òåêñòà, ðàçìåð îáúåêòà è âðåìÿ ïîñëåäíåãî èçìåíåíèÿ. Èíôîðìàöèÿ âîçâðàùàåòñÿ â õýøå %hbuf. Êëþ÷è õýøà ñîîòâåòñòâóþò ïàðàìåòðàì ñòðóêòóðû PBORCA_ENTRYINFO:
Comments Êîììåíòàðèé
CreateTime Âðåìÿ ñîçäàíèÿ
ObjectSize Ðàçìåð
SourceSize Ðàçìåð èñõîäíîãî òåêñòà
Íàáëþäåíèÿ: SourceSize ORCA âîçâðàùàåò íåêîððåêòíî.
Ïîìåùàåò èñõîäíûé òåêñò îáúåêòà $obj òèïà $type èç áèáëèîòåêè pbl â áóôåð $buf.
Ïðè ýêñïîðòå èñõîäíîãî òåêñòà ñðåäñòâàìè PowerBuilder IDE â ôàéë ïîìèìî ñîáñòâåííî èñõîäíîãî òåêñòà äîïèñûâàþòñÿ äâå ñòðîêè çàãîëîâêà. Ôóíêöèÿ Export ýòîãî íå äåëàåò, $buf ñîäåðæèò òîëüêî èñõîäíûé òåêñò îáúåêòà.
Èìïîðòèðóåò èñõîäíûé òåêñò $syntax îáúåêòà $obj òèïà $type â áèáëèîòåêó $pbl, êîìïèëèðóåò îáúåêò. $comment - êîììåíòàðèé ê îáúåêòó (òîò, ÷òî ïîêàçûâàåò library painter). Åñëè áûëè îøèáêè êîìïèëÿöèè $rc==-11, â $errbuf - ñîîáùåíèÿ îá îøèáêàõ. Áèáëèîòåêà $pbl äîëæíà âõîäèòü â Libarary list è åå èìÿ äîëæíî áûòü óêàçàíî â òî÷íîñòè òàêæå, êàê ïðè óñòàíîâêå Library list.
Àíàëîã Import, íî çà îäèí âûçîâ îáðàáàòûâàåòñÿ íåñêîëüêî îáúåêòîâ. Ïðåäíàçíà÷åíà äëÿ èìïîðòà íåñêîëüêèõ âçàèìîñâÿçàííûõ îáúåêòîâ, íàïðèìåð îêíà, åãî ìåíþ è user_object-à, êîòîðûé îíè èñïîëüçóþò. Âàæíî ñîáëþäàòü ïðàâèëà ïîñëåäîâàòåëüíîñòè ðàçìåùåíèå èíôîðìàöèè îá îáúåêòàõ â ìàññèâàõ. Ïðåäêè äîëæíû ðàçìåùàòüñÿ ïåðåä ïîòîìêàìè, user_object-û, íà êîòîðûå ññûëàþòñÿ äðóãèå îáúåêòû, äîëæíû ðàçìåùàòüñÿ ïåðåä ýòèìè îáúåêòàìè. $errbuf - áóôåð äëÿ âîçâðàòà èíôîðìàöèè îá îøèáêàõ, ìîæåò áûòü ñêàëÿðîì èëè ìàññèâîì (ñì. îïèñàíèå Regenerate). Áèáëèîòåêà $pbl äîëæíà âõîäèòü â Libarary list è åå èìÿ äîëæíî áûòü óêàçàíî â òî÷íîñòè òàêæå, êàê ïðè óñòàíîâêå Library list.
Êîìïèëèðóåò îáúåêò $obj òèïà $type â áèáëèîòåêå $pbl. Åñëè áûëè îøèáêè êîìïèëÿöèè $rc==-11, â $errbuf - ñîîáùåíèÿ îá îøèáêàõ. $errbuf ìîæåò áûòü ññûëêîé íà ñêàëÿð èëè ññûëêîé íà ìàññèâ.  ïåðâîì ñëó÷àå ñêàëÿð ñîäåðæèò âñå ñîîáùåíèÿ îá îøèáêàõ, îáúåäèíåííûå â ñòðîêó. Âî âòîðîì ñëó÷àå âîçâðàùàåòñÿ ìàññèâ ñîîáùåíèé, ïîëó÷åííûõ îò PB â õýøàõ, ïîâòîðÿþùèõ ñòðóêòóðó pborca_comperr:
Level
MessageNumber
MessageText
ColumnNumber
LineNumber
Êîïèðóåò îáúåêò $obj òèïà $type èç áèáëèîòåêå $src_pbl â áèáëèîòåêó $dst_pbl.
Ïåðåíîñèò îáúåêò $obj òèïà $type èç áèáëèîòåêå $src_pbl â áèáëèîòåêó $dst_pbl.
Óäàëÿåò îáúåêò $obj òèïà $type èç áèáëèîòåêè $pbl.
Âîçâðàùàåò èíôîðìàöèþ î áèáëèîòåêå $pbl. $comment - êîììåíòàðèé, $n_obj - ÷èñëî îáúåêòîâ â áèáëèîòåêå.
Ìàññèâ @objects çàïîëíÿåòñÿ èíôîðìàöèåé îá îáúåêòàõ â áèáëèîòåêå $pbl. Êàæäûé ýëåìåíò @objects - ññûëêà íà õýø ñî ñëåäóþùèìè êëþ÷àìè:
Name èìÿ îáúåêòà
Type òèï îáúåêòà
Size ðàçìåð îáúåêòà
CreateTime âðåìÿ ñîçäàíèÿ îáúåêòà
Comment êîììåíòàðèé
Âîçâðàùàåò ññûëêó íà ìàññèâ ñ èìåíàìè îáúåêòîâ çàäàííîãî òèïà â áèáëèîòåêå $pbl. Åñëè òèï íå çàäàí - âîçâðàùàþòñÿ èìåíà âñåõ îáúåêòîâ. Ìîæíî íåïîñðåäñòâåííî èñïîëüçîâàòü â öèêëàõ: for my $obj_name ( LibDirList('lib1.pbl') ) { ... }
Ñîçäàåò áèáëèîòåêó ñ èìåíåì $pbl. Íå òðåáóåò óñòàíîâêè library list.
Óäàëÿåò áèáëèîòåêó ñ èìåíåì $pbl. Íå òðåáóåò óñòàíîâêè library list.
Óñòàíàâëèâàåò êîììåíòàðèé äëÿ áèáëèîòåêè $pbl. Íå òðåáóåò óñòàíîâêè library list.
Âûïîëíÿåò check out äëÿ îáúåêòà $obj òèïà $type èç îñíîâíîé áèáëèîòåêè $master_pbl â ðàáî÷óþ áèáëèîòåêó $work_pbl. Çíà÷åíèå $copy: 0 - óñòàíîâèòü ñòàòóñ "check out" äëÿ îáúåêòà â master è work áèáëèîòåêàõ, îñòàâèâ îáúåêò â work áèáëèîòåêå áåç èçìåíåíèé; 1 - óñòàíîâèòü ñòàòóñ è ñêîïèðîâàòü îáúåêò èç master â work áèáëèîòåêó. $user_id - id ïîëüçîâàòåëÿ.
Âûïîëíÿåò check in äëÿ îáúåêòà $obj òèïà $type èç ðàáî÷åé áèáëèîòåêè $work_pbl â îñíîâíóþ áèáëèîòåêó $master_pbl. $move: 0 - ñáðîñèòü check out ñòàòóñ îáúåêòîâ, íå îáíîâëÿòü îáúåêò â master áèáëèîòåêå è íå óäàëÿòü êîïèþ îáúåêòà èç work áèáëèîòåêè; 1 - ñáðîñèòü ñòàòóñ è ïåðåìåñòèòü êîïèþ îáúåêòà èç work áèáëèîòåêè â master. $user_id - id ïîëüçîâàòåëÿ, ñäåëàâøåãî check out.
Ïîìåùàåò check out èíôîðìàöèþ îá îáúåêòàõ â ìàññèâ @storage. Êàæäûé ýëåìåíò ìàññèâà - õýø ñî ñëåäóþùèìè êëþ÷àìè:
LibName èìÿ áèáëèîòåêè
Name èìÿ îáúåêòà
UserID èìÿ ïîëüçîâàòåëÿ
Mode ñòàòóñ (s - source, r - registered, d - distanation)
Õýø ñîîòâåòñòâóåò ñòðóêòóðå PBORCA_CHECKOUT.
Ïîìåùàåò èíôîðìàöèþ îá èåðàðõèè ïðåäêîâ îáúåêòà $obj òèïà $type èç áèáëèîòåêè $pbl â ìàññèâ @storage. Îïåðàöèÿ ïðèìåíèìà òîëüêî ê îáúåêòàì òèïà window, menu è user_object. Äîëæåí áûòü óñòàíîâëåí library list, $pbl äîëæíà â íåãî âõîäèòü.
Ïîìåùàåò èíôîðìàöèþ îá îáúåêòàõ, íà êîòîðûå ññûëàåòñÿ îáúåêò $obj òèïà $type èç áèáëèîòåêè $pbl â ìàññèâ @storage. Äîëæåí áûòü óñòàíîâëåí library list, $pbl äîëæíà â íåãî âõîäèòü. Êàæäûé ýëåìåíò ìàññèâà - õýø ñî ñëåäóþùèìè êëþ÷àìè:
LibName èìÿ áèáëèîòåêè
Name èìÿ îáúåêòà
Type òèï îáúåêòà
RefType òèï ññûëêè (o - open, s - simple) [íåäîêóìåíòèðîâàííî]
Õýø ñîîòâåòñòâóåò ñòðóêòóðå PBORCA_REFERENCE.
Ñîçäàåò PowerBuilder Dynamic Library (PBD) èëè PowerBuilder Dll èç áèáëèîòåêè $pbl. $pbr - èìÿ ôàéëà ðåñóðñîâ èëè undef, åñëè ôàéëà ðåñóðñîâ íåò. $options - êîìáèíàöèÿ èç ôëàãîâ çàäàííûõ â "Ïàðàìåòðû ãåíåðàöèè êîäà". Library list è current application äîëæíû áûòü óñòàíîâëåíû. Åñëè ïëàíèðóåòñÿ ïðèëîæåíèå ñ äèíàìè÷åñêèìè áèáëèîòåêàìè, èõ íåîáõîäèìî ïîñòðîèòü ïåðåä ïîñòðîåíèåì exe ôàéëà.
Ñîçäàåò exe ôàéë ïðèëîæåíèÿ â P-êîäå èëè â ìàøèííîì êîäå. Äëÿ ìàøèííîãî êîäà ìîæíî çàäàâàòü òèï îïòèìèçàöèè è âêëþ÷åíèå îòëàäî÷íîé èíôîðìàöèè. Ïðèëîæåíèå ñîçäàåòñÿ â ñîîòâåòñòâèè ñ library list.  ìàññèâå pbd_flags ìîæíî óêàçàòü, êàêèå áèáëèîòåêè áóäóò äèíàìè÷åñêèìè è óæå îòêîìïèëèðîâàíû â pbd/dll, à êàêèå ñëåäóåò âêëþ÷èòü â exe ôàéë. Library list è current application äîëæíû áûòü óñòàíîâëåíû.
Ïàðàìåòðû: $exe - èìÿ èñïîëíÿåìîãî ôàéëà (íå äîëæíî áûòü íà äèñêå, èíà÷å - îøèáêà) $ico - èêîíêà $pbr - ôàéë ðåñóðñîâ @pbd_flags - äëÿ êàæäîé pbl â library list 0 - âêëþ÷èòü îáúåêòû â .exe ôàéë; 1 - èñïîëüçîâàòü óæå ïîñòðîåííóþ pbd/dll ÷èñëî ýëåìåíòîâ â ìàññèâå äîëæíî ñîîòâåòñòâîâàòü ÷èñëó áèáëèîòåê â library list $options - ïàðàìåòðû ãåíåðàöèè êîäà (ñì. "Ïàðàìåòðû ãåíåðàöèè êîäà") $errors - áóôåð îøèáîê.

Êîñòàíòû ýêñïîðòèðóþòñÿ, åñëè óêàçàí òýã const:
use use PowerBuilder::ORCA qw/:const/;
PBORCA_APPLICATION
PBORCA_DATAWINDOW
PBORCA_FUNCTION
PBORCA_MENU
PBORCA_PIPELINE
PBORCA_PROJECT
PBORCA_PROXYOBJECT
PBORCA_QUERY
PBORCA_STRUCTURE
PBORCA_USEROBJECT
PBORCA_WINDOW
PBORCA_P_CODE
PBORCA_MACHINE_CODE
PBORCA_MACHINE_CODE_NATIVE
PBORCA_MACHINE_CODE_16
PBORCA_P_CODE_16
PBORCA_OPEN_SERVER
PBORCA_TRACE_INFO
PBORCA_ERROR_CONTEXT
PBORCA_MACHINE_CODE_OPT
PBORCA_MACHINE_CODE_OPT_SPEED
PBORCA_MACHINE_CODE_OPT_SPACE
PBORCA_MACHINE_CODE_OPT_NONE

- ïîëíîöåííûé òåñòîâûé ïðèìåð, ïðîâåðåí íà PB5, PB6 è PB8
- äîðàáîòêè è èñïðàâëåíèÿ îøèáîê â EntryInfo,Import,ImportList
- íå áûëà îïèñàíà ôóíêöèÿ Del â äîêóìåíòàöèè
- òåïåðü ìîäóëü ìîæåò ðàáîòàòü ñ ëþáîé âåðñèåé PB - dll ORCA ëèíêóåòñÿ
äèíàìè÷åñêè

Ãäå-òî âíóòðè ORCA åñòü memory leak.  ÷àñòíîñòè, ýòèì ãðåøíà PBORCA_LibraryDirectory, âûçûâàåìàÿ ñ callback-îì. Ñîîòâåòñòâåííî, ïàìÿòü óòåêàåò ïðè âûçîâå LibDir, õîòÿ åå XS êîä êîððåêòåí, ñ òî÷êè çðåíèÿ ðàáîòû ñ ïàìÿòüþ. Íå äóìàþ, ÷òî ýòî ñîçäàñò ïðîáëåìû â ðåàëüíîé æèçíè.
Âñå ôóíöèè áûëè îòòåñòèðîâàíû íî îøèáêè âîçìîæíû, òåì áîëåå, ÷òî ýòî ïåðâûé ðåëèç. Ñîîáùàéòå ïî e-mail.

Ilya Chelpanov, ilya@macro.ru, chelpanov@mail.ru http://i72.narod.ru/
Ýòîò ìîäóëü - ñâîáîäíîå ÏÎ. Âû ìîæåòå èñïîëüçîâàòü, ðàñïðîñòðàíÿòü è ìîäèôèöèðîâàòü åå íà òåõ æå óñëîâèÿõ, ÷òî è ñàì Perl.

PowerBuilder online books, "ORCA Guide" http://manuals.sybase.com/onlinebooks/group-pb/adt/orca/