перенести сценарий perl / dbm на новый сервер и выйти из dbm? - PullRequest
0 голосов
/ 12 ноября 2009

Мне было поручено зеркалирование сайта на новом сервере. На старом сайте есть несколько сценариев Perl, которые, насколько я могу видеть изнутри (я ничего не знаю о Perl, хотя в целом я достаточно хорошо разбираюсь в кодировании и, в частности, в PHP / js / etc), не зависят от старого. сервер. Тем не менее, когда я пытаюсь запустить этот скрипт, который просматривает файл базы данных, чтобы найти соответствующий файл статьи, он ничего не получает.

По сути, это, как я объясняю, элементарная старая CMS, где он искал в файле PAG имя файла и отображал его. Я немного потерян здесь. Есть ли причина, по которой зеркалирование не работает на новом сайте? Я проверил разрешения, я проверил, что Perl установлен в тех же каталогах / usr / etc . Я думаю, что он использует dbm, потому что, согласно другой статье , если я вижу такие команды:

 dbmopen( %ARTS, $art_dbm, 0644 );
 $entry = $ARTS{$article_id};
 dbmclose( %ARTS );

это должно быть дБм, верно?

В связанной заметке, есть ли способ объединить информацию этого PAG-файла с исходными файлами без невероятно сложного сценария Perl; т.е. заново создать 100 текстовых файлов с этой информацией в самом файле, а не хранить отдельно?

РЕДАКТИРОВАТЬ: спасибо за 1-й ответ ниже. Можете ли вы объяснить, что это за хэш и маска? Я дважды проверил, что файл .pag (имя базы данных) действительно находится в том месте, где он определен ранее в файле .pl, и что он был передан в двоичном виде. все же как-то я не могу заставить его открыть это правильно!

РЕДАКТИРОВАТЬ 3: Хорошо, извините, окончательное редактирование здесь: Я использовал приведенный ниже код штампа (Shwern) и обнаружил, что он не находит этот файл БД, несмотря на то, что он там есть (два файла article.pag и article.dir, но переменная ссылается только на «статьи» без расширений) в нужном каталоге и с правильными разрешениями ... Итак, вопрос теперь в том, что, черт возьми, происходит? это разные версии Perl? или я просто делаю что-то простое и глупое? для записи (да, это ужасно), у меня пока нет доступа к оболочке, хотя я работаю над этим ... Меня попросили сделать это из-за моих навыков "новой сети", и я, конечно, не подходит человек для таких вещей, как Perl и DBM, хотя я могу читать файлы и понимать их. В качестве последнего предложения, кто-нибудь знает, как (сценарий или тому подобное) я мог бы попросить людей с оригинального сервера (которые НЕ являются программистами) сделать ASCII-дамп этого или это было бы не по линии? Мне нужно вставить это в CSV и обратно в файл, чтобы я мог использовать его в другом БД ... тьфу какой кошмар!

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

У вас все еще есть доступ к оригинальным машинам?

Несмотря на то, что вы используете файлы DBM, эта реальная функциональность может исходить от одной из нескольких реализаций, некоторые из которых несовместимы. Я дам дамп файла с тем же perl, который его создал, а затем заново создаю его с новым perl.

1 голос
/ 12 ноября 2009

Если я правильно прочитал ваш вопрос, у вас возникли проблемы с открытием базы данных на новом компьютере. База данных там существует?

Документация по методу dbmopen доступна в командной строке через perldoc -f dbmopen (и по этой ссылке для последней стабильной версии perl, 5.10.1).

Как видно из документов, второй аргумент dbmopen содержит открываемое имя файла. В вставленном вами коде он содержится в скалярной переменной $art_dbm. Итак, вам нужно найти какое-то более раннее объявление этой переменной (возможно, оно загружено из файла конфигурации или может быть жестко запрограммировано). Затем, как только вы найдете эту БД, все, что нужно, - это перенести этот файл на ваш новый компьютер.

Если вам нужна дополнительная помощь в расшифровке кода, не стесняйтесь редактировать свой вопрос с помощью фрагмента кода, и мы можем перейти оттуда.

(Теперь, если вы нашли базу данных, но просто не можете ее открыть, у вас есть другая проблема. Однако прошло много времени с тех пор, как я работал с файлами PAG.)

0 голосов
/ 12 ноября 2009

Есть несколько вещей, которые могут пойти не так. Наиболее очевидным является то, что вызов dbmopen () не открывает файл. Если файл DBM не существует, вместо сбоя dbmopen () просто создает новый, из-за чего он может быть пустым.

Чтобы исключить эту возможность, убедитесь, что файл DBM существует и доступен для чтения. Вы также хотите проверить, успешно ли dbmopen () выполнил (обычно) ошибку, если имеет неправильный формат.

die "$art_dbm does not exist" unless -e $art_dbm;
die "Cannot read $art_dbm"    unless -r $art_dbm;
dbmopen( %ARTS, $art_dbm, 0644 ) or die "dbmopen of $art_dbm failed: $!";

К сожалению, dbmopen () слишком умен для своего блага. Если вы дадите ему "foo", то может создать вместо него "foo.db". Зависит от реализации. Смотри ниже.

Другая возможность состоит в том, что ваши два Perls пытаются открыть файл с двумя различными реализациями DBM. Perl может быть скомпилирован с различными наборами реализаций DBM на разных компьютерах. dbmopen () будет использовать первый в жестко закодированном (и исторически ограниченном) списке. На самом деле это оболочка AnyDBM_File . Вы можете проверить, какая реализация используется с ...

use AnyDBM_File;
print "@AnyDBM_File::ISA\n";

Убедитесь, что они одинаковы. Если нет, загрузите соответствующую библиотеку DBM перед использованием dbmopen. perldoc -f dbmopen объясняет.

Вот демонстрация. Сначала мы посмотрим, что dbmopen () будет по умолчанию.

$ perl -wle 'use AnyDBM_File; print "@AnyDBM_File::ISA"'
NDBM_File

Затем создайте и заполните файл dbm.

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; $foo{23} = 42;  print %foo'
2342

Теперь покажите, что мы можем прочитать.

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'
2342

И попробуйте прочитать его, используя другую реализацию DBM.

$ perl -wle 'use GDBM_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'

В файле ничего нет, но и ошибки нет. Оказывается, он создал файл с именем tmpdbm, тогда как ndbm использовал tmpdbm.db. Давайте попробуем Беркли DB.

$ perl -wle 'use DB_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo'
Inappropriate file type or format at -e line 1.

По крайней мере, это дает ошибку.

Лучше всего выяснить, какую реализацию DBM использует исходная машина, и использовать этот модуль перед вызовом dbmopen (). Это сделает ситуацию статичной.

PS Утилита Unix file также даст вам хорошее представление о том, что это за тип DBM.

$ file tmpdbm
tmpdbm: GNU dbm 1.x or ndbm database, little endian
$ file tmpdbm.db
tmpdbm.db: Berkeley DB 1.85 (Hash, version 2, native byte-order)

И надеюсь, что $diety это не проблема порядка следования байтов, теперь она встречается реже, когда почти все x86.

PPS Как вы можете видеть, использование файлов DBM немного беспорядочно. Странно, учитывая, что он должен быть просто хешем на диске.

...