bufra

package module
v0.0.0-...-a17c8cb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 15, 2017 License: MIT Imports: 1 Imported by: 22

README

buf-readerat

GoDoc Build Status

Package buf-readerat implements buffered io.ReaderAt. It wraps an io.ReaderAt object, creating another io.ReaderAt object that also implements the interface but provides buffering.

This package is especially useful for packages those who require io.ReaderAt for initialize, like zip.Reader.

Installation

go get github.com/avvmoto/buf-readerat

Usage

Use BufReaderAt
r := bytes.NewReader([]byte("123456789"))

bra := bufra.NewBufReaderAt(r, 8)

buf := make([]byte, 4)
if _, err := bra.ReadAt(buf, 4); err != nil {
	log.Fatal(err)
}
fmt.Printf("%s\n", buf)
Use Zip file on Google Cloud Storage within Google App Engine

import "cloud.google.com/go/storage"


// wrap storage.NewRangeReader to use as io.ReaderAt
type rowGCSReaderAt struct {
	ctx context.Context
	obj *storage.ObjectHandle
}

func newRowGCSReaderAt(ctx context.Context, obj *storage.ObjectHandle) *rowGCSReaderAt {
	return &rowGCSReaderAt{
		ctx: ctx,
		obj: obj,
	}
}

// Wrap NewRangeReader
func (ra *rowGCSReaderAt) ReadAt(b []byte, off int64) (n int, err error) {
	if ra == nil {
		return 0, errors.New("invalid")
	}

	rc, err := ra.obj.NewRangeReader(ra.ctx, off, int64(len(b)))
	if err != nil {
		return
	}
	defer rc.Close()

	n, err = rc.Read(b)
	return
}

type GCSReaderAt struct {
	cache *BufReaderAt
}

func NewGCSReaderAt(ctx context.Context, obj *storage.ObjectHandle) (*GCSReaderAt) {
	rowReaderAt := newRowGCSReaderAt(ctx, obj)
	cra := NewBufReaderAt(rowReaderAt, cacheSize)

	return &GCSReaderAt{
		cache: cra,
	}
}

func (ra *GCSReaderAt) ReadAt(b []byte, off int64) (n int, err error) {
	return ra.cache.ReadAt(b, off)
}

License

Copyright (c) 2016-present avvmoto

Licensed under MIT License

Documentation

Overview

Package buf-readerat implements buffered io.ReaderAt. It wraps an io.ReaderAt object, creating another io.ReaderAt object that also implements the interface but provides buffering.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BufReaderAt

type BufReaderAt struct {
	// contains filtered or unexported fields
}

BufReaderAt implements buffering for an io.ReaderAt object.

Example (ReadAt)
package main

import (
	"bytes"
	"fmt"
	"log"

	bufra "github.com/avvmoto/buf-readerat"
)

func main() {
	r := bytes.NewReader([]byte("123456789"))

	bra := bufra.NewBufReaderAt(r, 8)

	buf := make([]byte, 4)
	if _, err := bra.ReadAt(buf, 4); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", buf)

}
Output:

5678

func NewBufReaderAt

func NewBufReaderAt(readerAt io.ReaderAt, size int) *BufReaderAt

NewBufReaderAt returns a new BufReaderAt whose buffer has the specified size.

func (*BufReaderAt) ReadAt

func (r *BufReaderAt) ReadAt(b []byte, off int64) (n int, err error)

ReadAt implements bufferd io.ReadAt. If the under underlying ReadAt return some error, this ReadAt return the same error at corresponding offset.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL