Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Извлечение данных из формата dbm в txt


Автор: Martein 15.6.2009, 22:32
Здравсвуйте, есть вопрос на который ни где не могу найти ответ.
Стоит apache. Пути к сайтам на сервере и информация о них храниться в файле vhost.db. Вопрос в том чем такую бд можно открыть, пробовал различные программы - выдавали ошибку об отсутсвии индекса, повреждение чего то там... Открываю с помощью блокнота очень много непонятных символов. Плюс к тому же записи повторяються по несколько раз... в общем полная неразбериха. Начал копаться выяснил инофрмацию о формате db

Код

# Хэш файл
MapType: dbm[=type], MapSource: Путь к существующему файлу в файловой системе Unix

Здесь, источник  это двоичный файл DBM формата содержащий то же самое содержимое что и простой текстовый файл, однако в специальном виде, оптимизированном
для действительно быстрого поиска. Этот тип может быть sdbm, gdbm, ndbm, или db в зависимости от настроек при компиляции. Если тип опущен, выбирается тип
установленный по умолчанию при компиляции. Вы можете создавать такой файл любой утилитой DBM или следующим Perl скриптом. Убедитесь что он настроен для создания
требуемого типа DBM файла. Этот пример создает файл NDBM.

#!/path/to/bin/perl
##
##  txt2dbm -- convert txt map to dbm format
##

use NDBM_File;
use Fcntl;

($txtmap, $dbmmap) = @ARGV;

open(TXT, "<$txtmap") or die "Couldn't open $txtmap!\n";
tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!\n";

while (<TXT>) {
  next if (/^\s*#/ or /^\s*$/);
  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
}

untie %DB;
close(TXT);

$ txt2dbm map.txt map.db



Вот вырезка из моего конфига vhost.conf
Код

# define the map file
RewriteMap   vhost      dbm=DB:conf/vhost 


На одном из форум подсказали ссылку на следующий код, якобы переводящий из dbm в txt. Что с этим кодом делать не знаю хотел у вас совета спросить - как должен называться входной файл, как запускать скрипт - не знаю. Если кто то может подсказать, то буду очень благодарен если подскажетет как запускать через ActivePerl.
Код

#!/usr/bin/perl

use NDBM_File;
use Fcntl;

tie %fhand,"NDBM_File","demodata",O_RDWR|O_CREAT,0777;

if ($ARGV[0] =~ /^get$/i)
        {
        if ($#ARGV == 1) {
                $result = ($fhand{$ARGV[1]} or "no such entry");
                }
        }
if ($ARGV[0] =~ /^set$/i)
        {
        if ($#ARGV == 2) {
                $fhand{$ARGV[1]} = $ARGV[2];
                $result = "Database updated";
                }
        }
if ($ARGV[0] =~ /^list$/i)
        {
        if ($#ARGV == 0) {
                foreach (sort keys %fhand){
                $result .= sprintf ("%8s %s\n",
                        $_,$fhand{$_});
                }
                chop $result;
                }
        }

$result ||= "Invalid call";
print "$result\n";
untie %fhand;


P.S. Рад любой инфе, если кто то может помочь но нет времени, могу скромно но все же отблагодарить вебманями...

Автор: KSURi 15.6.2009, 23:06
Входной файл должен называться demodata.
Скрипт понимает три команды:
  • get <key> - получить значение ключа по имени key
  • set <key> <value> - установить значение ключа по имени key в value
  • list - вывести все пары ключ-значение
Запускать соответственно так:
Код

C:\> perl script.pl <cmd> [key] [value]

Автор: Martein 16.6.2009, 11:31
Установил ActivePerl 5.10, положил в папку C:\Documents and Settings\M@rtein скрипт 1.pl
Запустил - скрипт выдал ошибку:
Код

C:\Documents and Settings\M@rtein>perl 1.pl list
Can't locate NDBM_File.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .
) at 1.pl line 2.
BEGIN failed--compilation aborted at 1.pl line 2.


Что то в системе не так установлено или что может быть не так?!

Чуть не забыл вот код скрипта что я запускаю - 1.pl
Код

#!/usr/bin/perl
use NDBM_File;
use Fcntl;
tie %fhand,"NDBM_File","demodata",O_RDWR|O_CREAT,0777;
if ($ARGV[0] =~ /^get$/i)
        {
        if ($#ARGV == 1) {
                $result = ($fhand{$ARGV[1]} or "no such entry");
                }
        }
if ($ARGV[0] =~ /^set$/i)
        {
        if ($#ARGV == 2) {
                $fhand{$ARGV[1]} = $ARGV[2];
                $result = "Database updated";
                }
        }
if ($ARGV[0] =~ /^list$/i)
        {
        if ($#ARGV == 0) {
                foreach (sort keys %fhand){
                $result .= sprintf ("%8s %s\n",
                        $_,$fhand{$_});
                }
                chop $result;
                }
        }
$result ||= "Invalid call";
print "$result\n";
untie %fhand;

Автор: shamber 16.6.2009, 11:50
Код

Can't locate NDBM_File.pm in @INC  

Чего-то не хватает smile
модуля для работы с dbm. smile
Установите http://search.cpan.org/~nwclark/perl-5.8.9/ext/NDBM_File/NDBM_File.pm

Если не знаете как, читайте http://base.vingrad.ru/view/2790-Ustanovka-Perl-moduley-Spravochnoe-rukovodstvo

Автор: Martein 16.6.2009, 12:16
KSURi, Спасибо огромное хотел было поставить плюсик, но я здесь новичок пока, все равно респект  smile 

Автор: Martein 16.6.2009, 13:48
shamber, не получаеться установить
C:\Perl\perl-5.8.9 - это путь до разархивированного NDBM_File
Код

C:\Perl\perl-5.8.9>perl Makefile.PL
Can't open perl script "Makefile.PL": No such file or directory


Как еще можно попытаться установить?

Автор: amg 16.6.2009, 16:14
Вообще то, в perl-5.8.9 и выше этот модуль уже стандартный. Чем устанавливать его самостоятельно, поставьте perl-5.10.

Оба! Прочитал посты выше, оказывается, perl-5.10 уже стоит. 
Может, этот модуль использует чисто никсовые фичи и на винде не имеет смысла?

Автор: shamber 17.6.2009, 00:54
был не прав погорячился smile 
поищите другие модули для работы с dbm. Например http://search.cpan.org/~rkinyon/DBM-Deep-1.0014/lib/DBM/Deep.pod

Автор: Martein 17.6.2009, 13:24
К сожалениюэто модуль не помог. Я думаю то ч то ты первый раз рекомендовал был правильный, но его как то нужно установить видать...? 

Автор: KSURi 17.6.2009, 13:56
Не знаю, какой конкретно тип DBM используется в Apache, поэтому есть несколько предложений:
1. воспользоваться AnyDBM_File
2. вместо tie/untie попробовать dbmopen/dbmclose

Автор: Martein 20.6.2009, 12:52
KSURi что при установке AnyDBM_File, что NDBM_File - вылазиет одинаковое сообщение после перехода в диру с модулем и выполнения команды perl Makefile.PL
Код

Can't open perl script "Makefile.PL": No such file or directory

Как нужно установить модуль подскажите? или че не так делаю...

Автор: shamber 20.6.2009, 13:57
напишите в коммандной строке ppm. И потом в окошке выберите нужный модуль

Автор: Martein 22.6.2009, 00:22
Цитата(shamber @ 20.6.2009,  13:57)
напишите в коммандной строке ppm. И потом в окошке выберите нужный модуль

Спасибо за совет, но я пока разбирался с установкой, дошел и до этого способа
Перехожу в режим View all packages и в строке поиска ввожу название файла. Ни того ни другого там нету...  smile 

Автор: shamber 22.6.2009, 10:22
Martein, у меня присутствует. попробуйте добавить дополнительные репозитарии.

Добавлено через 1 минуту и 3 секунды
список естьhttp://win32.perl.org/wiki/index.php?title=PPM_Repositories.

Автор: Martein 17.7.2009, 15:26
Так и не получилось вопрос решить, решил действовать иначе. Поставил линукс, там запустил скрипт.  Предварительно разместив в своем домашней папке скрипт и файл базы данных. Запускаю на выполнение, скрипт отрабатывает но безрезультатно
Код

martein@martein-desktop:~$ /usr/bin/perl /home/martein/script.pl list
Invalid call

Может есть еще какие то идеи как открыть файл бд??!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)