Documentation
¶
Overview ¶
Example ¶
// Create a buffer to write our archive to.
buf := new(bytes.Buffer)
// Create a new siva archive.
w := siva.NewWriter(buf)
// Add some files to the archive.
var files = []struct {
Name, Body string
}{
{"readme.txt", "This archive contains some text files."},
{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
{"todo.txt", "Get animal handling license."},
}
for _, file := range files {
hdr := &siva.Header{
Name: file.Name,
Mode: 0600,
ModTime: time.Now(),
}
if err := w.WriteHeader(hdr); err != nil {
log.Fatalln(err)
}
if _, err := w.Write([]byte(file.Body)); err != nil {
log.Fatalln(err)
}
}
// Make sure to check the error on Close.
if err := w.Close(); err != nil {
log.Fatalln(err)
}
// Open the siva archive for reading.
file := bytes.NewReader(buf.Bytes())
r := siva.NewReader(file)
// Get all files in the siva file.
i, err := r.Index()
if err != nil {
log.Fatalln(err)
}
// Iterate through the files in the archive.
for _, e := range i {
content, err := r.Get(e)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("Contents of %s:\n", e.Name)
if _, err := io.Copy(os.Stdout, content); err != nil {
log.Fatalln(err)
}
fmt.Println()
}
Output: Contents of readme.txt: This archive contains some text files. Contents of gopher.txt: Gopher names: George Geoffrey Gonzo Contents of todo.txt: Get animal handling license.
Index ¶
- Constants
- Variables
- type Flag
- type Header
- type Index
- func (i *Index) Filter() Index
- func (i Index) Find(name string) *IndexEntry
- func (i Index) Glob(pattern string) ([]*IndexEntry, error)
- func (s Index) Len() int
- func (s Index) Less(i, j int) bool
- func (i *Index) ReadFrom(r io.ReadSeeker, endBlock uint64) error
- func (s Index) Swap(i, j int)
- func (i *Index) WriteTo(w io.Writer) error
- type IndexEntry
- type IndexFooter
- type IndexReadError
- type IndexWriteError
- type ReadWriter
- func (w ReadWriter) Close() error
- func (w ReadWriter) Flush() error
- func (r ReadWriter) Get(e *IndexEntry) (*io.SectionReader, error)
- func (r ReadWriter) Index() (Index, error)
- func (r ReadWriter) Read(p []byte) (n int, err error)
- func (r ReadWriter) Seek(e *IndexEntry) (int64, error)
- func (w ReadWriter) Write(b []byte) (int, error)
- func (w ReadWriter) WriteHeader(h *Header) error
- type Reader
- type Writer
Examples ¶
Constants ¶
const (
IndexVersion uint8 = 1
)
Variables ¶
var ( IndexSignature = []byte{'I', 'B', 'A'} ErrInvalidIndexEntry = errors.New("invalid index entry") ErrInvalidSignature = errors.New("invalid signature") ErrEmptyIndex = errors.New("empty index") ErrUnsupportedIndexVersion = errors.New("unsupported index version") ErrCRC32Missmatch = errors.New("crc32 missmatch") )
var ( ErrPendingContent = errors.New("entry wasn't fully read") ErrInvalidCheckshum = errors.New("invalid checksum") ErrInvalidReaderAt = errors.New("reader provided dosen't implement ReaderAt interface") )
var ( ErrMissingHeader = errors.New("WriteHeader was not called, or already flushed") ErrClosedWriter = errors.New("Writer is closed") )
Functions ¶
This section is empty.
Types ¶
type Index ¶
type Index []*IndexEntry
Index contains all the files on a siva file, including duplicate files or even does flagged as deleted.
func (*Index) Filter ¶
Filter returns a filtered version of the current Index removing duplicates keeping the latest versions and filtering all the deleted files
func (Index) Find ¶
func (i Index) Find(name string) *IndexEntry
Find returns the first IndexEntry with the given name, if any
func (Index) Glob ¶ added in v1.1.0
func (i Index) Glob(pattern string) ([]*IndexEntry, error)
Glob returns all index entries whose name matches pattern or nil if there is no matching entry. The syntax of patterns is the same as in filepath.Match.
type IndexEntry ¶
type IndexEntry struct {
Header
Start uint64
Size uint64
CRC32 uint32
// contains filtered or unexported fields
}
type IndexFooter ¶
type IndexFooter struct {
}
type IndexReadError ¶ added in v1.1.2
type IndexReadError struct {
Err error
}
func (*IndexReadError) Error ¶ added in v1.1.2
func (e *IndexReadError) Error() string
type IndexWriteError ¶ added in v1.1.2
type IndexWriteError struct {
Err error
}
func (*IndexWriteError) Error ¶ added in v1.1.2
func (e *IndexWriteError) Error() string
type ReadWriter ¶ added in v1.1.0
type ReadWriter struct {
// contains filtered or unexported fields
}
ReadWriter can read and write to the same siva file. It is not thread-safe.
func NewReaderWriter ¶ added in v1.1.0
func NewReaderWriter(rw io.ReadWriteSeeker) (*ReadWriter, error)
func (ReadWriter) Close ¶ added in v1.1.0
func (w ReadWriter) Close() error
Close closes the siva archive, writing the Index footer to the current writer.
func (ReadWriter) Flush ¶ added in v1.1.0
func (w ReadWriter) Flush() error
Flush finishes writing the current file (optional)
func (ReadWriter) Get ¶ added in v1.1.0
func (r ReadWriter) Get(e *IndexEntry) (*io.SectionReader, error)
Get returns a new io.SectionReader allowing concurrent read access to the content of the read
func (ReadWriter) Index ¶ added in v1.1.0
Index reads the index of the siva file from the provided reader
func (ReadWriter) Read ¶ added in v1.1.0
Read reads up to len(p) bytes, starting at the current position set by Seek and ending in the end of the content, retuning a io.EOF when its reached
func (ReadWriter) Seek ¶ added in v1.1.0
func (r ReadWriter) Seek(e *IndexEntry) (int64, error)
Seek seek the internal reader to the starting position of the content for the given IndexEntry
func (ReadWriter) Write ¶ added in v1.1.0
Write writes to the current entry in the siva archive, WriteHeader should called before, if not returns ErrMissingHeader
func (ReadWriter) WriteHeader ¶ added in v1.1.0
WriteHeader writes hdr and prepares to accept the file's contents.
type Reader ¶
type Reader interface {
io.Reader
Seek(e *IndexEntry) (int64, error)
Index() (Index, error)
Get(e *IndexEntry) (*io.SectionReader, error)
}
A Reader provides random access to the contents of a siva archive.
func NewReader ¶
func NewReader(r io.ReadSeeker) Reader
NewReader creates a new Reader reading from r, reader requires be seekable and optionally should implement io.ReaderAt to make usage of the Get method
