Jump to content
TrinityCore

Reading DB2 files - some questions


Brainy
 Share

Recommended Posts

Hey :)

a few hours ago I've started writing a PHP library to access the db2 files of the current WoW client. 

To test my library I've implemented the structure of CharTitles.db2. This looks like that:

class CharTitles extends DB2File
{
    public function __construct(File $file)
    {
        parent::__construct(new BinaryReader($file->getBuffer()));
    }

    public function getStructure() : array
    {
        return [
            DB2File::FIELD_STR,
            DB2File::FIELD_STR,
            DB2File::FIELD_INT16,
            DB2File::FIELD_BYTE
        ];
    }

    public function hasIndexFieldInData() : bool
    {
        return true;
    }
}

I've taken the structure from the current trinitycore version.

If I load the file now, I'll just get one correct record (the first one). The others are containing bad data.

The reason for this is a single byte after each record so if change the structure to this

            DB2File::FIELD_STR,
            DB2File::FIELD_STR,
            DB2File::FIELD_INT16,
            DB2File::FIELD_INT16

all will work as it should.

Now my question.

What exactly is that byte after each record? Is it a kind of seperator or is the structure of the current trinitycore just outdated?

Thanks in advance!

Link to comment
Share on other sites

I did another test with ChatChannels.db2. It seems that the total amount of bytes in a record modulo 4 must be 0.

So I've implemented following logic

            $bytesToSkip = 4 - ($recordSize % 4);
            if ($bytesToSkip != 4)
                $this->reader->skip($bytesToSkip);

Is this correct or just a bad hack?

 

EDIT#1: In general it seems to work

  [records:protected] => Array
        (
            [0] => DB2\DB2Record Object
                (
                    [id:protected] => 1
                    [fields:protected] => Array
                        (
                            [0] => 1572875
                            [1] => General - %s
                            [2] => General
                            [3] => 0
                        )

                )

            [1] => DB2\DB2Record Object
                (
                    [id:protected] => 2
                    [fields:protected] => Array
                        (
                            [0] => 1048635
                            [1] => Trade - %s
                            [2] => Trade
                            [3] => 0
                        )

                ) .....
 

Link to comment
Share on other sites

Ok understand. Thanks you Shauren.

But now I have another question. 

For the AreaTable.db2 I can read this header

DB2Header Object
(
    [magic] => WDB5
    [recordCount] => 5564
    [fieldCount] => 23
    [recordSize] => 56
    [stringTableSize] => 158430
    [tableHash] => 1918102339
    [layoutHash] => 886938365
    [minId] => 1
    [maxId] => 8623
    [locale] => 1
    [copyTableSize] => 0
    [flags] => 262144
    [idIndex] => 0
)

You see the recordSize of 56 but if I count the bytes of the structure excepting the ID field, it will be 58 bytes long.

How is this possible?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...