summaryrefslogtreecommitdiff
path: root/vendor/github.com/ncruces/go-sqlite3/util/vfsutil/wrap.go
blob: ad96547fa50a730347286ce4d9d673c803122511 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// Package vfsutil implements virtual filesystem utilities.
package vfsutil

import (
	"github.com/ncruces/go-sqlite3"
	"github.com/ncruces/go-sqlite3/vfs"
)

// UnwrapFile unwraps a [vfs.File],
// possibly implementing [vfs.FileUnwrap],
// to a concrete type.
func UnwrapFile[T vfs.File](f vfs.File) (_ T, _ bool) {
	for {
		switch t := f.(type) {
		default:
			return
		case T:
			return t, true
		case vfs.FileUnwrap:
			f = t.Unwrap()
		}
	}
}

// WrapOpen helps wrap [vfs.VFS].
func WrapOpen(f vfs.VFS, name string, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) {
	if f, ok := f.(vfs.VFSFilename); name == "" && ok {
		return f.OpenFilename(nil, flags)
	}
	return f.Open(name, flags)
}

// WrapOpenFilename helps wrap [vfs.VFSFilename].
func WrapOpenFilename(f vfs.VFS, name *vfs.Filename, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) {
	if f, ok := f.(vfs.VFSFilename); ok {
		return f.OpenFilename(name, flags)
	}
	return f.Open(name.String(), flags)
}

// WrapLockState helps wrap [vfs.FileLockState].
func WrapLockState(f vfs.File) vfs.LockLevel {
	if f, ok := f.(vfs.FileLockState); ok {
		return f.LockState()
	}
	return vfs.LOCK_EXCLUSIVE + 1 // UNKNOWN_LOCK
}

// WrapPersistWAL helps wrap [vfs.FilePersistWAL].
func WrapPersistWAL(f vfs.File) bool {
	if f, ok := f.(vfs.FilePersistWAL); ok {
		return f.PersistWAL()
	}
	return false
}

// WrapSetPersistWAL helps wrap [vfs.FilePersistWAL].
func WrapSetPersistWAL(f vfs.File, keepWAL bool) {
	if f, ok := f.(vfs.FilePersistWAL); ok {
		f.SetPersistWAL(keepWAL)
	}
}

// WrapPowersafeOverwrite helps wrap [vfs.FilePowersafeOverwrite].
func WrapPowersafeOverwrite(f vfs.File) bool {
	if f, ok := f.(vfs.FilePowersafeOverwrite); ok {
		return f.PowersafeOverwrite()
	}
	return false
}

// WrapSetPowersafeOverwrite helps wrap [vfs.FilePowersafeOverwrite].
func WrapSetPowersafeOverwrite(f vfs.File, psow bool) {
	if f, ok := f.(vfs.FilePowersafeOverwrite); ok {
		f.SetPowersafeOverwrite(psow)
	}
}

// WrapChunkSize helps wrap [vfs.FileChunkSize].
func WrapChunkSize(f vfs.File, size int) {
	if f, ok := f.(vfs.FileChunkSize); ok {
		f.ChunkSize(size)
	}
}

// WrapSizeHint helps wrap [vfs.FileSizeHint].
func WrapSizeHint(f vfs.File, size int64) error {
	if f, ok := f.(vfs.FileSizeHint); ok {
		return f.SizeHint(size)
	}
	return sqlite3.NOTFOUND
}

// WrapHasMoved helps wrap [vfs.FileHasMoved].
func WrapHasMoved(f vfs.File) (bool, error) {
	if f, ok := f.(vfs.FileHasMoved); ok {
		return f.HasMoved()
	}
	return false, sqlite3.NOTFOUND
}

// WrapOverwrite helps wrap [vfs.FileOverwrite].
func WrapOverwrite(f vfs.File) error {
	if f, ok := f.(vfs.FileOverwrite); ok {
		return f.Overwrite()
	}
	return sqlite3.NOTFOUND
}

// WrapSyncSuper helps wrap [vfs.FileSync].
func WrapSyncSuper(f vfs.File, super string) error {
	if f, ok := f.(vfs.FileSync); ok {
		return f.SyncSuper(super)
	}
	return sqlite3.NOTFOUND
}

// WrapCommitPhaseTwo helps wrap [vfs.FileCommitPhaseTwo].
func WrapCommitPhaseTwo(f vfs.File) error {
	if f, ok := f.(vfs.FileCommitPhaseTwo); ok {
		return f.CommitPhaseTwo()
	}
	return sqlite3.NOTFOUND
}

// WrapBeginAtomicWrite helps wrap [vfs.FileBatchAtomicWrite].
func WrapBeginAtomicWrite(f vfs.File) error {
	if f, ok := f.(vfs.FileBatchAtomicWrite); ok {
		return f.BeginAtomicWrite()
	}
	return sqlite3.NOTFOUND
}

// WrapCommitAtomicWrite helps wrap [vfs.FileBatchAtomicWrite].
func WrapCommitAtomicWrite(f vfs.File) error {
	if f, ok := f.(vfs.FileBatchAtomicWrite); ok {
		return f.CommitAtomicWrite()
	}
	return sqlite3.NOTFOUND
}

// WrapRollbackAtomicWrite helps wrap [vfs.FileBatchAtomicWrite].
func WrapRollbackAtomicWrite(f vfs.File) error {
	if f, ok := f.(vfs.FileBatchAtomicWrite); ok {
		return f.RollbackAtomicWrite()
	}
	return sqlite3.NOTFOUND
}

// WrapCheckpointStart helps wrap [vfs.FileCheckpoint].
func WrapCheckpointStart(f vfs.File) {
	if f, ok := f.(vfs.FileCheckpoint); ok {
		f.CheckpointStart()
	}
}

// WrapCheckpointDone helps wrap [vfs.FileCheckpoint].
func WrapCheckpointDone(f vfs.File) {
	if f, ok := f.(vfs.FileCheckpoint); ok {
		f.CheckpointDone()
	}
}

// WrapPragma helps wrap [vfs.FilePragma].
func WrapPragma(f vfs.File, name, value string) (string, error) {
	if f, ok := f.(vfs.FilePragma); ok {
		return f.Pragma(name, value)
	}
	return "", sqlite3.NOTFOUND
}

// WrapBusyHandler helps wrap [vfs.FilePragma].
func WrapBusyHandler(f vfs.File, handler func() bool) {
	if f, ok := f.(vfs.FileBusyHandler); ok {
		f.BusyHandler(handler)
	}
}

// WrapSharedMemory helps wrap [vfs.FileSharedMemory].
func WrapSharedMemory(f vfs.File) vfs.SharedMemory {
	if f, ok := f.(vfs.FileSharedMemory); ok {
		return f.SharedMemory()
	}
	return nil
}