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