Как прочитать код PL/SQL в файле Oracle Forms .FMT?

Oracle Forms10g предоставляет инструмент для преобразования модулей Oracle Forms из двоичного формата (.FMB), с которым работает Oracle Forms Builder, в текстовый формат (.FMT).

Например, если вы создаете модуль с именем mymodule.fmb с помощью Oracle Forms Builder, а затем вызываете

frmcmp module=mymodule.fmb script=yes batch=yes logon=no

из командной строки утилита Oracle Forms Convert создаст файл с именем mymodule.fmt из файла mymodule.fmb. Предполагается, что этот текстовый файл может быть «читаем» людьми, за исключением кода PL/SQL триггеров и программных модулей, который закодирован.

Например, это фрагмент файла .FMT с кодовым кодом PL/SQL.

DEFINE  F50P
BEGIN
   PP = 10
   PI = 3
   PN = 464
   PL = 1138
   PV = (BLONG)
<<"
00000049 00800000 00440000 00000000 00000031 0000000d 00000002 a0011519 
00002420 0000045e 001f0000 00165030 5f32335f 4f43545f 32303038 31365f33 
375f3039 00000006 42454749 4e0a0000 0042676f 5f626c6f 636b2820 27504149 
53455327 20293b0a 69662066 6f726d5f 73756363 65737320 7468656e 0a096578 
65637574 655f7175 6572793b 0a656e64 2069663b 00000005 0a454e44 3b000000 
1d574845 4e2d4e45 572d464f 524d2d49 4e535441 4e434520 28466f72 6d290000 

Вы когда-нибудь пытались декодировать такие файлы, чтобы иметь возможность извлечь PL/SQL-код формы?

Было бы очень полезно иметь возможность поиска строки в коде PL/SQL большого количества файлов .FMT вместо использования Oracle Forms Builder для ручного открытия каждого из соответствующих файлов .FMB и поиска строки в каждом из них. их.

Спасибо!


person Aurelio Martin Massoni    schedule 23.10.2008    source источник
comment
Еще в Forms 4.5 (когда Developer 2000 было шикарным футуристическим названием) код PL/SQL был текстом в файле FMT, так что вы могли искать код — на самом деле вы также могли найти его в файлах FMB. Возможно, оракул намеренно запутывает это?   -  person hamishmcn    schedule 23.10.2008
comment
Я был не прав, байты - это просто шестнадцатеричные значения символов (см. мой пост ниже)   -  person hamishmcn    schedule 23.10.2008
comment
Если все, что вы делаете, это ищете текст, вы должны быть в состоянии отлично найти двоичный файл. Я делаю это все время, используя python и регулярное выражение, чтобы узнать, на какие формы повлияет данная хранимая процедура.   -  person kurosch    schedule 25.10.2008


Ответы (4)


Наряду с API обратите внимание, что если вы работаете в начале этого процесса, вам, вероятно, будет лучше создать версию XML, чем версию FMT. FMT — это более старый формат, сохраненный для обратной совместимости, и таким инструментам, как недавно анонсированный конвертер Forms -> Oracle APEX, потребуется XML. Это также легче читать.

В Forms 10g, выпуск 1 (9.0.4) преобразователь XML представляет собой отдельную программу командной строки. формы2xml. Я думаю, что это все еще верно для 10.1

Кроме того, XML легче читать и интерпретировать.

person Jim Hudson    schedule 24.10.2008
comment
Спасибо! PL/SQL хранится в виде обычного текста в XML, и это гораздо лучший формат для поиска. - person Aurelio Martin Massoni; 27.10.2008

Байты - это просто шестнадцатеричные значения символов. например: взять 4-ю строку и поместить ее в следующий код Python:

[chr(x) for x in [0x53,0x45,0x53,0x27 ,0x20,0x29,0x3b,0x0a ,0x69,0x66,0x20,0x66 ,0x6f,0x72,0x6d,0x5f ,0x73,0x75,0x63,0x63 ,0x65,0x73,0x73,0x20 ,0x74,0x68,0x65,0x6e ,0x0a,0x09,0x65,0x78]]

дает следующий результат:

['S', 'E', 'S', "'", ' ', ')', ';', '\n', 'i', 'f', ' ', 'f', 'o', 'r', 'm', '_', 's', 'u', 'c', 'c', 'e', 's', 's', ' ', 't', 'h', 'e', 'n', '\n', '\t', 'e', 'x']

который узнаваем формирует pl/sql. Так что, похоже, не составит большого труда создать скрипт, который брал бы каталог файлов FMT и создавал соответствующие файлы с текстом, по которому можно было бы осуществлять поиск.
Получайте удовольствие!

person hamishmcn    schedule 23.10.2008
comment
В целях поиска я удалю из вывода все непечатаемые символы (например, 0x00). Спасибо! - person Aurelio Martin Massoni; 24.10.2008

Oracle Forms 9i и более поздние версии имеют программный API, позволяющий вам делать именно то, что вы описываете. Для этого вам потребуется просмотреть документацию по формам, но это может оказаться быстрее, чем пытаться извлечь двоичные строки.

Если вы готовы платить за существующий инструмент, используйте следующее:

http://www.orcl-toolbox.com/

Их FormsAPI и FormsTools позволяют вам извлекать, сравнивать, изменять и обновлять ваши формы.

person Thomas Jones-Low    schedule 24.10.2008

Согласно этой странице у автора есть perl-скрипт для преобразования шестнадцатеричного обратно в ascii-текст (он говорит отправить ему электронное письмо, и он отправит его)

person hamishmcn    schedule 23.10.2008