Skip to content

Commit

Permalink
add supper_block parse
Browse files Browse the repository at this point in the history
  • Loading branch information
oikomi committed Jan 11, 2016
1 parent 047c78b commit cf27b8d
Show file tree
Hide file tree
Showing 5 changed files with 404 additions and 0 deletions.
3 changes: 3 additions & 0 deletions store/tools/supper_block_parse/compile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

go build -o supper_block_parse
25 changes: 25 additions & 0 deletions store/tools/supper_block_parse/const.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package main

const (
SUPPER_BLOCK_MAGIC_SIZE = 4
SUPPER_BLOCK_VER_SIZE = 1
SUPPER_BLOCK_PADDING_SIZE = 3

NEEDLE_HEADER_MAGIC_SIZE = 4
NEEDLE_COOKIE_SIZE = 4
NEEDLE_KEY_SIZE = 8
NEEDLE_FLAG_SIZE = 1
NEEDLE_DATA_SIZE = 4
NEEDLE_FOOTER_MAGIC_SIZE = 4
NEEDLE_CHECKSUM_SIZE = 4

)

const (
SUPPER_BLOCK_MAGIC_STR = "[0xAB 0xCD 0xEF 0x00]"
SUPPER_BLOCK_VER_STR = "[0x01]"
SUPPER_BLOCK_PADDING_STR = "[0x00 0x00 0x00]"

NEEDLE_HEADER_MAGIC_STR = "[0x12 0x34 0x56 0x78]"
NEEDLE_FOOTER_MAGIC_STR = "[0x87 0x65 0x43 0x21]"
)
218 changes: 218 additions & 0 deletions store/tools/supper_block_parse/supper_block.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
package main

import (
"os"
"io"
"fmt"
"bytes"
"bufio"
)

var (
MAGIC = []byte{0xab, 0xcd, 0xef, 0x00}
VER = []byte{byte(1)}
PADDING = bytes.Repeat([]byte{byte(0)}, 3)

NEEDLE_HEADER_MAGIC = []byte{0x12, 0x34, 0x56, 0x78}
NEEDLE_FOOTER_MAGIC = []byte{0x87, 0x65, 0x43, 0x21}
)

type NeedleData struct {
NeedleHeaderMagic string `json:"needle_header_magic"`
NeedleCookie int32 `json:"needle_cookie"`
NeedleKey int64 `json:"needle_key"`
NeedleFlag int64 `json:"needle_flag"`
NeedleDataSize int32 `json:"needle_data_size"`
NeedleFooterMagic string `json:"needle_footer_magic"`
NeedleCheckSum int32 `json:"needle_checksum"`
}

type SuperBlockHeader struct {
Magic string `json:"magic"`
Ver string `json:"ver"`
Padding string `json:"padding"`
}

type SuperBlock struct {
fd *os.File
r *bufio.Reader
offset int64

SuperBlockHeader *SuperBlockHeader `json:"supper_block_header"`

NeedleNum int64 `json:"needle_num"`

NeedleDetail []*NeedleData `json:"needle_detail"`
}


func NewSuperBlock() *SuperBlock {
return &SuperBlock {
SuperBlockHeader : new(SuperBlockHeader),
NeedleDetail : make([]*NeedleData, 0),
}
}

func (s *SuperBlock)parseSupperBlockHeader() (err error) {
var (
n int
supperBlockMagicBuf []byte = make([]byte, SUPPER_BLOCK_MAGIC_SIZE)
supperBlockVerBuf []byte = make([]byte, SUPPER_BLOCK_VER_SIZE)
supperBlockPaddingBuf []byte = make([]byte, SUPPER_BLOCK_PADDING_SIZE)
)

n, err = s.fd.Read(supperBlockMagicBuf)
if err != nil {
return
}
s.offset += int64(n)

if !bytes.Equal(supperBlockMagicBuf, MAGIC) {
fmt.Println("Magic not match")
return
} else {
s.SuperBlockHeader.Magic = SUPPER_BLOCK_MAGIC_STR
}

n, err = s.fd.Read(supperBlockVerBuf)
if err != nil {
return
}
s.offset += int64(n)

if !bytes.Equal(supperBlockVerBuf, VER) {
fmt.Println("ver not match")
return
} else {
s.SuperBlockHeader.Ver = SUPPER_BLOCK_VER_STR
}

n, err = s.fd.Read(supperBlockPaddingBuf)
if err != nil {
return
}
s.offset += int64(n)

if !bytes.Equal(supperBlockPaddingBuf, PADDING) {
fmt.Println("ver not match")
return
} else {
s.SuperBlockHeader.Padding = SUPPER_BLOCK_PADDING_STR
}

return
}

func (s *SuperBlock)parseNeedles() (err error) {
var (
n int
needleHeaderMagicBuf []byte = make([]byte, NEEDLE_HEADER_MAGIC_SIZE)
needleCookieBuf []byte = make([]byte, NEEDLE_COOKIE_SIZE)
needleKeyBuf []byte = make([]byte, NEEDLE_KEY_SIZE)
needleFlagBuf []byte = make([]byte, NEEDLE_FLAG_SIZE)
needleDataBuf []byte = make([]byte, NEEDLE_DATA_SIZE)
needleFooterMagicBuf []byte = make([]byte, NEEDLE_FOOTER_MAGIC_SIZE)
needleCheckSumBuf []byte = make([]byte, NEEDLE_CHECKSUM_SIZE)
)

for {
needle := new(NeedleData)

n, err = s.fd.Read(needleHeaderMagicBuf)
if err != nil || err == io.EOF {
return
}
s.offset += int64(n)

if !bytes.Equal(needleHeaderMagicBuf, NEEDLE_HEADER_MAGIC) {
fmt.Println("header magic not match")
break
} else {
needle.NeedleHeaderMagic = NEEDLE_HEADER_MAGIC_STR
}

n, err = s.fd.Read(needleCookieBuf)
if err != nil || err == io.EOF {
return
} else {
needle.NeedleCookie = Byte4ToInt32(needleCookieBuf, BigEndian)
}
s.offset += int64(n)

n, err = s.fd.Read(needleKeyBuf)
if err != nil || err == io.EOF {
return
} else {
needle.NeedleKey = Byte8ToInt64(needleKeyBuf, BigEndian)
}
s.offset += int64(n)

n, err = s.fd.Read(needleFlagBuf)
if err != nil || err == io.EOF {
return
} else {
needle.NeedleFlag = Byte2Int(needleFlagBuf)
}
s.offset += int64(n)

n, err = s.fd.Read(needleDataBuf)
if err != nil || err == io.EOF {
return
} else {
needle.NeedleDataSize = Byte4ToInt32(needleDataBuf, BigEndian)
}
s.offset += int64(n)
s.offset += (int64)(needle.NeedleDataSize)
s.fd.Seek(s.offset, 0)

n, err = s.fd.Read(needleFooterMagicBuf)
if err != nil || err == io.EOF {
return
}
if !bytes.Equal(needleFooterMagicBuf, NEEDLE_FOOTER_MAGIC) {
fmt.Println("footer magic not match")
break
} else {
needle.NeedleFooterMagic = NEEDLE_FOOTER_MAGIC_STR
}
s.offset += int64(n)

n, err = s.fd.Read(needleCheckSumBuf)
if err != nil || err == io.EOF {
return
} else {
needle.NeedleCheckSum = Byte4ToInt32(needleCheckSumBuf, BigEndian)
}
s.offset += int64(n)

if s.offset % 8 > 0 {
paddingBuf := make([]byte, 8 - s.offset % 8)

n, err = s.fd.Read(paddingBuf)
if err != nil || err == io.EOF {
return
}
s.offset += int64(n)
s.fd.Seek(s.offset, 0)
}

s.NeedleDetail = append(s.NeedleDetail, needle)
s.NeedleNum ++
}

return nil
}

func (s *SuperBlock)doParse() (err error){
err = s.parseSupperBlockHeader()
if err != nil {
return
}
err = s.parseNeedles()
if err != nil {
return
}

return
}

48 changes: 48 additions & 0 deletions store/tools/supper_block_parse/supper_block_parse.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package main

import (
"os"
"fmt"
"flag"
"encoding/json"
)

var (
supperBlockFile string
)

func init() {
flag.StringVar(&supperBlockFile, "i", "", "input a supper_block file")
}

func help() {
fmt.Println("supper_block_parse -i supper_block_file")
}

func main() {
var (
err error
)

flag.Parse()

if supperBlockFile == "" {
help()
}

supperBlock := NewSuperBlock()

supperBlock.fd, err = os.Open(supperBlockFile)
if err != nil {
return
}

err = supperBlock.doParse()
res, err := json.Marshal(supperBlock)
if err != nil {
return
}
fmt.Println(string(res))

supperBlock.fd.Close()
}
Loading

0 comments on commit cf27b8d

Please sign in to comment.