Обратный инжиниринг базы данных BerkeleyDB - PullRequest
0 голосов
/ 10 августа 2011

У меня есть база данных eBay Turbolister, которую я пытаюсь прочитать. Чтение ключей через Perl дает:

ItemBLOBs
ItemBLOBs_BLOBIndex
ItemBLOBs_ItemId
Items
Items_FolderId
Items_Modified
Items_Status
ProductVariations
ProductVariations_ITEM_ID
ProductVariations_SYS_SKU
RawDescriptions
VariationPictureBLOBs
VariationPictureBLOBs_BLOBIndex
VariationPictureBLOBs_ItemId
VariationPictureBLOBs_VARIATION_VALUE
VariationPictures
VariationPictures_BLOBOrder
VariationPictures_ItemId
VariationPictures_VARIATION_VALUE
VariationSpecifics
__DATA
__SEQUENCE

Чтение значений не так успешно. Он дает двоичные значения, чья добавленная длина намного меньше длины файла базы данных.

Используемый мной скрипт Perl:

#!/usr/bin/perl
use strict;
use BerkeleyDB;

my $filename = 'database';
my %o;

tie %o, "BerkeleyDB::Btree", -Filename => $filename,
                             -Flags    => DB_RDONLY
or die "Cannot open database '$filename: $!\n";

foreach (keys %o)
      { print "$_\n" }

Моя конечная цель - использовать Java, но сейчас я даже не могу читать ключи с помощью Java.

Есть идеи, как поступить?

Примечание. Чтобы любое решение работало, мне пришлось переключиться с BDB Java Edition на нативную привязку Java.

1 Ответ

0 голосов
/ 10 августа 2011

Я делаю это в Java что-то вроде следующего:

public static void main(final String[] args) throws Exception
{
    final EnvironmentConfig environmentConfig = new EnvironmentConfig();
    //setup EnvironmentConfig

    final DatabaseConfig primaryConfig = new DatabaseConfig();
    //setup DatabaseConfig

    final SecondaryConfig secondaryConfig = new SecondaryConfig();
    //setup SecondaryConfig if necessary

    final Database primary = environment.openDatabase(null,
            pathToDb, null, primaryConfig);

    final DatabaseEntry key = new DatabaseEntry(new byte[ONE_KIBIBYTE]);
    final DatabaseEntry value = new DatabaseEntry(new byte[ONE_MEBIBYTE]);

    final Cursor cursor = primary.openCursor(null, null);

    OperationStatus status = cursor.getFirst(key, value, null);
    int count = 0;
    while (status.equals(OperationStatus.SUCCESS))
    {
        ++count;
        int readId = -1;
        int size = -1;
        try
        {
            final TupleInput input = new TupleInput(value.getData(), value
                    .getOffset(), value.getSize());
            size = value.getSize();
            readId = input.readInt();

            //read other fields from 'input' local variable

            if (status.equals(OperationStatus.SUCCESS))
            {
                status = cursor.getNext(key, value, null);
            }
        }
        catch (final Exception e)
        {
            throw new RuntimeException(e);
        }
    }
}
...