22package serdes
33
44import (
5- "io"
6-
75 "github.com/ncruces/go-sqlite3"
6+ "github.com/ncruces/go-sqlite3/util/vfsutil"
87 "github.com/ncruces/go-sqlite3/vfs"
98)
109
@@ -14,16 +13,16 @@ func init() {
1413 vfs .Register (vfsName , sliceVFS {})
1514}
1615
17- var fileToOpen = make (chan * sliceFile , 1 )
16+ var fileToOpen = make (chan * [] byte , 1 )
1817
1918// Serialize backs up a database into a byte slice.
2019//
2120// https://sqlite.org/c3ref/serialize.html
2221func Serialize (db * sqlite3.Conn , schema string ) ([]byte , error ) {
23- var file sliceFile
22+ var file [] byte
2423 fileToOpen <- & file
2524 err := db .Backup (schema , "file:serdes.db?vfs=" + vfsName )
26- return file . data , err
25+ return file , err
2726}
2827
2928// Deserialize restores a database from a byte slice,
@@ -41,7 +40,7 @@ func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
4140// ["memdb"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb
4241// ["reader"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs
4342func Deserialize (db * sqlite3.Conn , schema string , data []byte ) error {
44- fileToOpen <- & sliceFile { data }
43+ fileToOpen <- & data
4544 return db .Restore (schema , "file:serdes.db?vfs=" + vfsName )
4645}
4746
@@ -53,7 +52,7 @@ func (sliceVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, e
5352 }
5453 select {
5554 case file := <- fileToOpen :
56- return file , flags | vfs .OPEN_MEMORY , nil
55+ return ( * vfsutil . SliceFile )( file ) , flags | vfs .OPEN_MEMORY , nil
5756 default :
5857 return nil , flags , sqlite3 .MISUSE
5958 }
@@ -71,70 +70,3 @@ func (sliceVFS) Access(name string, flag vfs.AccessFlag) (bool, error) {
7170func (sliceVFS ) FullPathname (name string ) (string , error ) {
7271 return name , nil
7372}
74-
75- type sliceFile struct { data []byte }
76-
77- func (f * sliceFile ) ReadAt (b []byte , off int64 ) (n int , err error ) {
78- if d := f .data ; off < int64 (len (d )) {
79- n = copy (b , d [off :])
80- }
81- if n == 0 {
82- err = io .EOF
83- }
84- return
85- }
86-
87- func (f * sliceFile ) WriteAt (b []byte , off int64 ) (n int , err error ) {
88- if d := f .data ; off > int64 (len (d )) {
89- f .data = append (d , make ([]byte , off - int64 (len (d )))... )
90- }
91- d := append (f .data [:off ], b ... )
92- if len (d ) > len (f .data ) {
93- f .data = d
94- }
95- return len (b ), nil
96- }
97-
98- func (f * sliceFile ) Size () (int64 , error ) {
99- return int64 (len (f .data )), nil
100- }
101-
102- func (f * sliceFile ) Truncate (size int64 ) error {
103- if d := f .data ; size < int64 (len (d )) {
104- f .data = d [:size ]
105- }
106- return nil
107- }
108-
109- func (f * sliceFile ) SizeHint (size int64 ) error {
110- if d := f .data ; size > int64 (len (d )) {
111- f .data = append (d , make ([]byte , size - int64 (len (d )))... )
112- }
113- return nil
114- }
115-
116- func (* sliceFile ) Close () error { return nil }
117-
118- func (* sliceFile ) Sync (flag vfs.SyncFlag ) error { return nil }
119-
120- func (* sliceFile ) Lock (lock vfs.LockLevel ) error { return nil }
121-
122- func (* sliceFile ) Unlock (lock vfs.LockLevel ) error { return nil }
123-
124- func (* sliceFile ) CheckReservedLock () (bool , error ) {
125- // notest // OPEN_MEMORY
126- return false , nil
127- }
128-
129- func (* sliceFile ) SectorSize () int {
130- // notest // IOCAP_POWERSAFE_OVERWRITE
131- return 0
132- }
133-
134- func (* sliceFile ) DeviceCharacteristics () vfs.DeviceCharacteristic {
135- return vfs .IOCAP_ATOMIC |
136- vfs .IOCAP_SAFE_APPEND |
137- vfs .IOCAP_SEQUENTIAL |
138- vfs .IOCAP_POWERSAFE_OVERWRITE |
139- vfs .IOCAP_SUBPAGE_READ
140- }
0 commit comments