Remove previous POCs

Signed-off-by: Antonio Navarro Perez <antnavper@gmail.com>
This commit is contained in:
Antonio Navarro Perez 2020-06-13 12:15:46 +02:00
parent 401a79379f
commit b8392c4c50
50 changed files with 0 additions and 1958 deletions

65
iio/disk.go Normal file
View file

@ -0,0 +1,65 @@
package iio
import (
"io"
"io/ioutil"
"os"
"sync"
)
type DiskTeeReader struct {
io.ReaderAt
io.Closer
io.Reader
m sync.Mutex
fo int64
fr *os.File
to int64
tr io.Reader
}
func NewDiskTeeReader(r io.Reader) (*DiskTeeReader, error) {
fr, err := ioutil.TempFile("", "dtb_tmp")
if err != nil {
return nil, err
}
tr := io.TeeReader(r, fr)
return &DiskTeeReader{fr: fr, tr: tr}, nil
}
func (dtr *DiskTeeReader) ReadAt(p []byte, off int64) (int, error) {
dtr.m.Lock()
defer dtr.m.Unlock()
tb := off + int64(len(p))
if tb > dtr.fo {
w, err := io.CopyN(ioutil.Discard, dtr.tr, tb-dtr.fo)
dtr.to += w
if err != nil && err != io.EOF {
return 0, err
}
}
n, err := dtr.fr.ReadAt(p, off)
dtr.fo += int64(n)
return n, err
}
func (dtr *DiskTeeReader) Read(p []byte) (n int, err error) {
dtr.m.Lock()
defer dtr.m.Unlock()
// use directly tee reader here
n, err = dtr.tr.Read(p)
dtr.to += int64(n)
return
}
func (dtr *DiskTeeReader) Close() error {
if err := dtr.fr.Close(); err != nil {
return err
}
return os.Remove(dtr.fr.Name())
}

46
iio/disk_test.go Normal file
View file

@ -0,0 +1,46 @@
package iio
import (
"bytes"
"io"
"testing"
"github.com/stretchr/testify/require"
)
var testData []byte = []byte("Hello World")
func TestReadData(t *testing.T) {
require := require.New(t)
br := bytes.NewReader(testData)
r, err := NewDiskTeeReader(br)
require.NoError(err)
toRead := make([]byte, 5)
n, err := r.ReadAt(toRead, 6)
require.NoError(err)
require.Equal(5, n)
require.Equal("World", string(toRead))
r.ReadAt(toRead, 0)
require.NoError(err)
require.Equal(5, n)
require.Equal("Hello", string(toRead))
}
func TestReadDataEOF(t *testing.T) {
require := require.New(t)
br := bytes.NewReader(testData)
r, err := NewDiskTeeReader(br)
require.NoError(err)
toRead := make([]byte, 6)
n, err := r.ReadAt(toRead, 6)
require.Equal(io.EOF, err)
require.Equal(5, n)
require.Equal("World\x00", string(toRead))
}

21
iio/utils.go Normal file
View file

@ -0,0 +1,21 @@
package iio
import (
"io"
"log"
)
func CloseIfCloseable(r interface{}) error {
log.Println("closing file...")
if r == nil {
return nil
}
closer, ok := r.(io.Closer)
if !ok {
log.Println("file is not implementing close method")
return nil
}
return closer.Close()
}

28
iio/wrapper.go Normal file
View file

@ -0,0 +1,28 @@
package iio
import (
"io"
"sync"
)
type readAtWrapper struct {
mu sync.Mutex
io.ReadSeeker
io.ReaderAt
}
func NewReadAtWrapper(r io.ReadSeeker) io.ReaderAt {
return &readAtWrapper{ReadSeeker: r}
}
func (rw *readAtWrapper) ReadAt(p []byte, off int64) (int, error) {
rw.mu.Lock()
defer rw.mu.Unlock()
_, err := rw.Seek(off, io.SeekStart)
if err != nil {
return 0, err
}
return rw.Read(p)
}