///|
fn main {
// 可运行的供页协议示例;异步宿主可在每次 NeedPage 事件中 await 范围读取。
let bytes = b"SQLite format 3\x00\x02\x00\x01\x01\x00\x40\x20\x20" +
Bytes::make(76, 0) +
b"\x0d\x00\x00\x00\x00\x02\x00\x00" +
Bytes::make(404, 0)
try {
let source = @sqlite.BytesSource::new(bytes)
let cached = @sqlite.CachedSource::new(source, block_size=512, max_pages=1)
let db = @sqlite.open_range_source(cached)
let scan = db.scan_cursor(1)
while true {
match scan.next() {
@sqlite.NeedPage(number) =>
scan.provide_page(number, db.read_page(number))
@sqlite.RecordReady(record) =>
println("record page=\{record.page_number}")
@sqlite.ScanFinished(summary) => {
if summary.completion != @sqlite.Complete {
abort("示例扫描未完成")
}
println("scan pages=\{summary.pages_read}")
break
}
}
}
let inspection = db.inspection_cursor()
while true {
match inspection.next() {
@sqlite.NeedInspectionPage(number) =>
inspection.provide_page(number, db.read_page(number))
@sqlite.InspectionProgress(_) => ()
@sqlite.InspectionFinished(report) => {
if report.inspection.status != @sqlite.Complete {
abort("示例检查未完成")
}
println(
"claimed pages=\{report.inspection.summarize().claimed_pages}",
)
break
}
}
}
} catch {
@sqlite.Invalid(message)
| @sqlite.Unsupported(message)
| @sqlite.LimitExceeded(message) => abort(message)
}
}