Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issue#12 #14

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions db/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ func newBackend() *backend {
}

func (b *backend) getData(offset int64) []byte {
rec, err := b.fc.Fetch(offset)
rec := &recordio.Record{Data: nil}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rec := &recordio.Record{}

err := b.fc.Fetch(offset, rec)
if err != nil {
panic("unimplemented")
}
Expand Down Expand Up @@ -87,7 +88,7 @@ func (b *backend) Put(rev int, path Path, data []byte) {
}

b.rev++
offset, err := b.ap.Append(recordio.Record{data})
offset, err := b.ap.Append(&recordio.Record{data})
if err != nil {
panic("unimplemented")
}
Expand Down
6 changes: 3 additions & 3 deletions db/recordio/appender.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package recordio
import "io"

type Appender interface {
Append(Record) (int64, error)
Append(Encoder) (int64, error)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

keep Append(Record)

}

type appender struct {
Expand All @@ -15,13 +15,13 @@ func NewAppender(w io.WriteSeeker) Appender {
}

// Not thread-safe
func (ap *appender) Append(r Record) (offset int64, err error) {
func (ap *appender) Append(r Encoder) (offset int64, err error) {
offset, err = ap.w.Seek(0, 2)
if err != nil {
return -1, err
}

err = (&r).encodeTo(ap.w)
err = r.EncodeTo(ap.w)
if err != nil {
return -1, err
}
Expand Down
13 changes: 6 additions & 7 deletions db/recordio/fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package recordio
import "io"

type Fetcher interface {
Fetch(offset int64) (Record, error)
Fetch(offset int64, d Decoder) error
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fetch(offset int64, r Record)

}

type fetcher struct {
Expand All @@ -14,17 +14,16 @@ func NewFetcher(r io.ReadSeeker) Fetcher {
return &fetcher{r}
}

func (fc *fetcher) Fetch(offset int64) (Record, error) {
func (fc *fetcher) Fetch(offset int64, d Decoder) error {
_, err := fc.r.Seek(offset, 0)
if err != nil {
return Record{}, err
return err
}

r := Record{}
err = (&r).decodeFrom(fc.r)
err = d.DecodeFrom(fc.r)
if err != nil {
return Record{}, err
return err
}

return r, nil
return nil
}
9 changes: 5 additions & 4 deletions db/recordio/io_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ func TestFetch(t *testing.T) {

tests := []struct {
offset int64
record Record
record *Record
}{
{-1, Record{[]byte("someData")}},
{-1, Record{[]byte("someOtherData")}},
{-1, &Record{[]byte("someData")}},
{-1, &Record{[]byte("someOtherData")}},
}

for i, tt := range tests {
Expand All @@ -41,7 +41,8 @@ func TestFetch(t *testing.T) {
}

for i, tt := range tests {
recRead, err := fc.Fetch(tt.offset)
recRead := &Record{Data: nil}
err := fc.Fetch(tt.offset, recRead)
if err != nil {
t.Errorf("#%d: Fetch failed: %s", i, err.Error())
}
Expand Down
23 changes: 21 additions & 2 deletions db/recordio/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,29 @@ const (
sizeOfLength = 4
)

// Encoder is an interface implemented by an object that can
// encode itself into a binary representation with an io.Writer
type Encoder interface {
EncodeTo(wr io.Writer) error
}

// Decoder is an interface implemented by an object that can
// decodes itself from a binary representation provided by
// an io.Reader
type Decoder interface {
DecodeFrom(rd io.Reader) error
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

type Record interface {
   Encoder
   Decoder
}

// Record is a struct that holds some binary data and can be
// encoded into/decoded from the following binary form
// [lenth of record] : 4 bytes
// [content of record]
type Record struct {
Data []byte
}

func (r *Record) encodeTo(wr io.Writer) error {
// EncodeTo encodes a binary data in record object to an io.Writer
func (r *Record) EncodeTo(wr io.Writer) error {
// Write length
lBuf := make([]byte, sizeOfLength)
binary.LittleEndian.PutUint32(lBuf, uint32(len(r.Data)))
Expand All @@ -28,7 +46,8 @@ func (r *Record) encodeTo(wr io.Writer) error {
return nil
}

func (r *Record) decodeFrom(rd io.Reader) error {
// DecodeFrom decodes binary data out of io.Reader
func (r *Record) DecodeFrom(rd io.Reader) error {
var length uint32
// Read length
err := binary.Read(rd, binary.LittleEndian, &length)
Expand Down
4 changes: 2 additions & 2 deletions db/recordio/record_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ func TestEncodeDecode(t *testing.T) {
buf := new(bytes.Buffer)
recordToWrite := &Record{tt.data}

if err := recordToWrite.encodeTo(buf); err != nil {
if err := recordToWrite.EncodeTo(buf); err != nil {
t.Fatalf("#%d: cannot encode, err: %s", i, err)
}
recordToRead := new(Record)
if err := recordToRead.decodeFrom(buf); err != nil {
if err := recordToRead.DecodeFrom(buf); err != nil {
t.Fatalf("#%d: cannot decode, err: %s", i, err)
}
if !reflect.DeepEqual(recordToRead, recordToWrite) {
Expand Down