Skip to content

New Datastore Interfaces #64

Description

@whyrusleeping

The interfaces in go-datastore have been needing updating for a while. This came up in #28 so i decided to start the conversation up. Lets collect all these ideas together here so we can move forward with this.

Interface additions i've been looking for involve streaming interfaces:

type StreamingDatastore interface {
    // GetR returns a reader to read the value directly from the source (sans buffering)
    GetR(k ds.Key) (io.Reader, error)

    // PutW returns a new put writer that can be used to stream a value 
    // into the datastore
    PutW() (WritePutter, error)
}

// WritePutter is used to stream values into the datastore. Since the caller may not 
// know the key they want to store this value as until the write is complete (content 
// addressing) the key is set after the write is complete
type WritePutter interface{
    io.Writer
    FinishWithKey(k ds.Key) error
}

Also, for queries and maybe 'gets' in general, it would be nice to have a readonly view interface. Many storage backends (bolt in particular) allow you to read and operate on the data within the datastore without making a copy (i.e. using the datastores memory) within a closure. This would be really useful for things like 'load this protobuf object from disk' where we don't need our own copy of the bytes.

// A datastore implementing ReadClosurer allows passing a closure to operate
// on a readonly view of the data in question
type ReadClosurer interface {
    GetFunc(k ds.Key, func(i interface{}) error) error
}

Alternatively, this could be done with an output parameter and interfaces:

type OutParamer interface{
    GetOut(k ds.Key, out DSUnmarshaler) error
}

type DSUnmarshaler interface {
  DSUnmarshal(val []byte) error
}

This would behave similarly to the json.Unmarshaler interfaces.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions