LINUX.ORG.RU

Импорт в FireBird, файл без сперазделителя

 


0

2

Есть файл схемы\пл-функций\всякой подобной бурды на 18к строк.

Пытаюсь заимпортить его через ISQL - говорит «не, бать, надо каждую функцию отделять спецразделителем, а то я не понимать, когда у тебя кончается строка в функции, а когда функция». Типа:

SET TERM ^;
CREATE PROCEDURE "TEST" ("A" INTEGER)
AS
BEGIN
   EXIT;
END ^
SET TERM ;^

У меня же все функции имеют в окончании END*;*, я так понял что так работает утилита экспорта.

Как мне импортировать это легаси-говно, которое даже распарсить собственный синтаксис не может чтобы не править руками 18к строк?

★★★★

Наверное, самый просто способ с помощью awk привести к нужному виду.

Можно ещё спросить тут https://www.sql.ru/forum/interbase

В firebird штатная утилита резервного копирования gbak делает бекап в бинарном формате. Так что бурда на 18К строк была сделана не штатными для firebird способами.

NeoZX ()
Ответ на: комментарий от NeoZX

Наверное, самый просто способ с помощью awk привести к нужному виду.

Боюсь не поможет, потому что там есть END внутри процедур, awk тогда сломает внутренний END.

Так что бурда на 18К строк была сделана не штатными для firebird способами.

Это печально.

Можно ещё спросить тут https://www.sql.ru/forum/interbase

Я подумал, что оно мертво, там вроде 1-2 сообщения в сутки.

PPP328 ★★★★ ()
Ответ на: комментарий от PPP328

Боюсь не поможет, потому что там есть END внутри процедур, awk тогда сломает внутренний END.

awk вместо sed очевидно предложили из-за возможности парсинга (и вообще - сомневаться в полубожественном awk - попахивает ересью!):

 cat dbtest | awk '{print $0; if($0~"BEGIN") count++; if ($0~"END" && (--count) == 0) print "разделительная хрень"}'
SET TERM ^;
CREATE PROCEDURE TEST (A INTEGER)
AS
BEGIN
   foo
	BEGIN
		IF (city IS NOT NULL) THEN
			line5 = city || ', ' || state || '  ' || postcode;
		ELSE
			line5 = state || '  ' || postcode;
	END
		
   EXIT;
END ^
разделительная хрень
SET TERM ;^

anonymous ()
Ответ на: комментарий от PPP328

Сломается, если BEGIN/END внутри строк или комментариев. Но спасибо, в крайнем случае попробую так.

Не должно, если уточнить в регексе, что ищем-считаем мы только отдельно стоящие «whitespace*BEGIN*whitespace\n»

if($0~"^[w]*BEGIN[w]*\n") count++; if ($0~"^[w]*END[w]*"
хм, кстати, а тупо
 awk '{print $0; if ($0~"^END[w]*") print "разделительная хрень"}'
т.е. END в самом начале строки, не катит?

anonymous ()
Ответ на: комментарий от PPP328

Ну, велосипед^W полубожественный парсер на awk пишется за пару минут:

function check(name, num) {                                                                           
    if (num < 0) {                                                                                    
        print("Error parsing ",name);                                                                 
        exit(-1);                                                                                     
  }                                                                                                   
}                                                                                                     
{                                                                                                     
    print $0;                                                                                         
    if ($0 ~ /\/\*/) comm++;                                                                          
    else if($0 ~ /\*\//) comm--;                                                                      
    else if( ($0 ~ /[:space:]*BEGIN/) && (!comm)) block++;                                            
    else if( ($0 ~ /[:space:]*END/) && (!comm)) block--;                                              
    check("comments", comm);                                                                          
    check("blocks", block);                                                                           
    if (($0 ~ /[:space:]*END/) && (!comm) && (!block))                                                
        print "terminator";                                                                           
}
(сломается, если на одной строке сразу BEGIN END или BEGIN/END плюс /* или */) но судя по включению комментариев в экспорт - «сюрпризы» на этом наверняка не заканчиваются.

anonymous ()

В общем решилось без AWK. Импортировал через IBExpert, пришлось правда помучится с «вам нужна работающая база данных, чтобы выполнить скрипт, в котором создается база данных», но это мелочи.

PPP328 ★★★★ ()
Ответ на: комментарий от den73

Нет, потому что тогда

  1. нужно как-то обойтись без умножения в плскл функциях.
  2. нужно ставить его после каждой функции во всем 18к строчном файле.

Я уже решил проблему через IBExpert, хоть у этой программы и полно своих проблем.

PPP328 ★★★★ ()