Skip to content

Commit c1e8d57

Browse files
authored
Merge pull request #70 from orbitinghail/copilot/make-locking-vfs-methods-mandatory
Make VFS locking APIs explicit by removing default lock/unlock implementations
2 parents 0660140 + 72b5439 commit c1e8d57

4 files changed

Lines changed: 31 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
All notable changes will be documented in this file.
44

5+
## 0.7.0 (unreleased)
6+
7+
- BREAKING: `Vfs::lock`, `Vfs::unlock`, and `Vfs::check_reserved_lock` no longer have default implementations and must be implemented by every `Vfs`.
8+
59
## 0.6.0 - 2026-02-19
610

711
Added `check_reserved_lock` to Vfs. This method allows you to inform SQLite if any threads or processes currently hold a lock on the specified file. It is recommended to implement this method if you also implement the lock and unlock methods.

examples/memvfs.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ impl Vfs for MemVfs {
129129
Ok(())
130130
}
131131

132+
fn check_reserved_lock(&self, handle: &mut Self::Handle) -> VfsResult<bool> {
133+
log::debug!("check_reserved_lock: file={:?}", handle.name);
134+
Ok(false)
135+
}
136+
132137
fn write(&self, handle: &mut Self::Handle, offset: usize, buf: &[u8]) -> VfsResult<usize> {
133138
log::debug!(
134139
"write: file={:?}, offset={}, len={}",

src/mock.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use alloc::format;
1414
use alloc::sync::Arc;
1515
use parking_lot::{Mutex, MutexGuard};
1616

17-
use crate::flags::{self, AccessFlags, OpenOpts};
17+
use crate::flags::{self, AccessFlags, LockLevel, OpenOpts};
1818
use crate::logger::{SqliteLogLevel, SqliteLogger};
1919
use crate::vars;
2020
use crate::vfs::{
@@ -257,6 +257,24 @@ impl Vfs for MockVfs {
257257
Ok(())
258258
}
259259

260+
fn lock(&self, meta: &mut Self::Handle, level: LockLevel) -> VfsResult<()> {
261+
let state = self.state();
262+
state.log(format_args!("lock: handle={meta:?} level={level:?}"));
263+
Ok(())
264+
}
265+
266+
fn unlock(&self, meta: &mut Self::Handle, level: LockLevel) -> VfsResult<()> {
267+
let state = self.state();
268+
state.log(format_args!("unlock: handle={meta:?} level={level:?}"));
269+
Ok(())
270+
}
271+
272+
fn check_reserved_lock(&self, meta: &mut Self::Handle) -> VfsResult<bool> {
273+
let state = self.state();
274+
state.log(format_args!("check_reserved_lock: handle={meta:?}"));
275+
Ok(false)
276+
}
277+
260278
fn close(&self, meta: Self::Handle) -> VfsResult<()> {
261279
let mut state = self.state();
262280
state.log(format_args!("close: handle={meta:?}"));

src/vfs.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,11 @@ pub trait Vfs: Send + Sync {
158158
fn write(&self, handle: &mut Self::Handle, offset: usize, data: &[u8]) -> VfsResult<usize>;
159159
fn read(&self, handle: &mut Self::Handle, offset: usize, data: &mut [u8]) -> VfsResult<usize>;
160160

161-
fn lock(&self, handle: &mut Self::Handle, level: LockLevel) -> VfsResult<()> {
162-
Ok(())
163-
}
161+
fn lock(&self, handle: &mut Self::Handle, level: LockLevel) -> VfsResult<()>;
164162

165-
fn unlock(&self, handle: &mut Self::Handle, level: LockLevel) -> VfsResult<()> {
166-
Ok(())
167-
}
163+
fn unlock(&self, handle: &mut Self::Handle, level: LockLevel) -> VfsResult<()>;
168164

169-
fn check_reserved_lock(&self, handle: &mut Self::Handle) -> VfsResult<bool> {
170-
Ok(false)
171-
}
165+
fn check_reserved_lock(&self, handle: &mut Self::Handle) -> VfsResult<bool>;
172166

173167
fn sync(&self, handle: &mut Self::Handle) -> VfsResult<()> {
174168
Ok(())

0 commit comments

Comments
 (0)