update rusqlite

The big difference here is query_named and execute_named have gone
away. Fair number of lines changes but straightforward.
This commit is contained in:
Scott Lamb 2021-05-17 10:50:12 -07:00
parent dc1c9afa73
commit f922afaa26
11 changed files with 144 additions and 117 deletions

45
server/Cargo.lock generated
View File

@ -32,6 +32,17 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "ahash"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f200cbb1e856866d9eade941cf3aa0c5d7dd36f74311c4273b494f4ef036957"
dependencies = [
"getrandom 0.2.2",
"once_cell",
"version_check",
]
[[package]] [[package]]
name = "ansi_term" name = "ansi_term"
version = "0.9.0" version = "0.9.0"
@ -805,13 +816,31 @@ dependencies = [
"ahash 0.4.7", "ahash 0.4.7",
] ]
[[package]]
name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash 0.7.2",
]
[[package]] [[package]]
name = "hashlink" name = "hashlink"
version = "0.6.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8" checksum = "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8"
dependencies = [ dependencies = [
"hashbrown", "hashbrown 0.9.1",
]
[[package]]
name = "hashlink"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
dependencies = [
"hashbrown 0.11.2",
] ]
[[package]] [[package]]
@ -947,7 +976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"hashbrown", "hashbrown 0.9.1",
] ]
[[package]] [[package]]
@ -1045,9 +1074,9 @@ dependencies = [
[[package]] [[package]]
name = "libsqlite3-sys" name = "libsqlite3-sys"
version = "0.20.1" version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64d31059f22935e6c31830db5249ba2b7ecd54fd73a9909286f0a67aa55c2fbd" checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d"
dependencies = [ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",
@ -1170,7 +1199,7 @@ dependencies = [
"failure", "failure",
"fnv", "fnv",
"h264-reader", "h264-reader",
"hashlink", "hashlink 0.6.0",
"itertools", "itertools",
"lazy_static", "lazy_static",
"libc", "libc",
@ -1931,14 +1960,14 @@ dependencies = [
[[package]] [[package]]
name = "rusqlite" name = "rusqlite"
version = "0.24.2" version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5f38ee71cbab2c827ec0ac24e76f82eca723cee92c509a65f67dee393c25112" checksum = "57adcf67c8faaf96f3248c2a7b419a0dbc52ebe36ba83dd57fe83827c1ea4eb3"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"fallible-iterator", "fallible-iterator",
"fallible-streaming-iterator", "fallible-streaming-iterator",
"hashlink", "hashlink 0.7.0",
"libsqlite3-sys", "libsqlite3-sys",
"memchr", "memchr",
"smallvec", "smallvec",

View File

@ -50,7 +50,7 @@ parking_lot = { version = "0.11.1", features = [] }
protobuf = { git = "https://github.com/stepancheg/rust-protobuf" } protobuf = { git = "https://github.com/stepancheg/rust-protobuf" }
reffers = "0.6.0" reffers = "0.6.0"
ring = "0.16.2" ring = "0.16.2"
rusqlite = "0.24.1" rusqlite = "0.25.3"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
smallvec = "1.0" smallvec = "1.0"

View File

@ -34,7 +34,7 @@ pretty-hex = "0.2.1"
prettydiff = "0.4.0" prettydiff = "0.4.0"
protobuf = { git = "https://github.com/stepancheg/rust-protobuf" } protobuf = { git = "https://github.com/stepancheg/rust-protobuf" }
ring = "0.16.2" ring = "0.16.2"
rusqlite = "0.24.1" rusqlite = "0.25.3"
smallvec = "1.0" smallvec = "1.0"
tempdir = "0.3" tempdir = "0.3"
time = "0.1" time = "0.1"

View File

@ -14,7 +14,7 @@ use log::info;
use parking_lot::Mutex; use parking_lot::Mutex;
use protobuf::Message; use protobuf::Message;
use ring::rand::{SecureRandom, SystemRandom}; use ring::rand::{SecureRandom, SystemRandom};
use rusqlite::{params, Connection, Transaction}; use rusqlite::{named_params, params, Connection, Transaction};
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fmt; use std::fmt;
use std::net::IpAddr; use std::net::IpAddr;
@ -374,7 +374,7 @@ impl State {
let id = row.get(0)?; let id = row.get(0)?;
let name: String = row.get(1)?; let name: String = row.get(1)?;
let mut permissions = Permissions::new(); let mut permissions = Permissions::new();
permissions.merge_from_bytes(row.get_raw_checked(7)?.as_blob()?)?; permissions.merge_from_bytes(row.get_ref(7)?.as_blob()?)?;
state.users_by_id.insert( state.users_by_id.insert(
id, id,
User { User {
@ -444,16 +444,16 @@ impl State {
.permissions .permissions
.write_to_bytes() .write_to_bytes()
.expect("proto3->vec is infallible"); .expect("proto3->vec is infallible");
stmt.execute_named(&[ stmt.execute(named_params! {
(":username", &&change.username[..]), ":username": &change.username[..],
(":password_hash", phash), ":password_hash": phash,
(":password_id", &pid), ":password_id": &pid,
(":password_failure_count", &pcount), ":password_failure_count": &pcount,
(":flags", &change.flags), ":flags": &change.flags,
(":unix_uid", &change.unix_uid), ":unix_uid": &change.unix_uid,
(":id", &id), ":id": &id,
(":permissions", &permissions), ":permissions": &permissions,
])?; })?;
} }
let u = e.into_mut(); let u = e.into_mut();
u.username = change.username; u.username = change.username;
@ -480,13 +480,13 @@ impl State {
.permissions .permissions
.write_to_bytes() .write_to_bytes()
.expect("proto3->vec is infallible"); .expect("proto3->vec is infallible");
stmt.execute_named(&[ stmt.execute(named_params! {
(":username", &&change.username[..]), ":username": &change.username[..],
(":password_hash", &password_hash), ":password_hash": &password_hash,
(":flags", &change.flags), ":flags": &change.flags,
(":unix_uid", &change.unix_uid), ":unix_uid": &change.unix_uid,
(":permissions", &permissions), ":permissions": &permissions,
])?; })?;
let id = conn.last_insert_rowid() as i32; let id = conn.last_insert_rowid() as i32;
self.users_by_name.insert(change.username.clone(), id); self.users_by_name.insert(change.username.clone(), id);
let e = self.users_by_id.entry(id); let e = self.users_by_id.entry(id);
@ -647,18 +647,18 @@ impl State {
let permissions_blob = permissions let permissions_blob = permissions
.write_to_bytes() .write_to_bytes()
.expect("proto3->vec is infallible"); .expect("proto3->vec is infallible");
stmt.execute_named(&[ stmt.execute(named_params! {
(":session_id_hash", &&hash.0[..]), ":session_id_hash": &hash.0[..],
(":user_id", &user.id), ":user_id": &user.id,
(":seed", &&seed[..]), ":seed": &seed[..],
(":flags", &flags), ":flags": &flags,
(":domain", &domain), ":domain": &domain,
(":creation_password_id", &creation_password_id), ":creation_password_id": &creation_password_id,
(":creation_time_sec", &creation.when_sec), ":creation_time_sec": &creation.when_sec,
(":creation_user_agent", &creation.user_agent), ":creation_user_agent": &creation.user_agent,
(":creation_peer_addr", &addr), ":creation_peer_addr": &addr,
(":permissions", &permissions_blob), ":permissions": &permissions_blob,
])?; })?;
let e = match sessions.entry(hash) { let e = match sessions.entry(hash) {
::std::collections::hash_map::Entry::Occupied(_) => panic!("duplicate session hash!"), ::std::collections::hash_map::Entry::Occupied(_) => panic!("duplicate session hash!"),
::std::collections::hash_map::Entry::Vacant(e) => e, ::std::collections::hash_map::Entry::Vacant(e) => e,
@ -787,11 +787,11 @@ impl State {
"flushing user with hash: {}", "flushing user with hash: {}",
u.password_hash.as_ref().unwrap() u.password_hash.as_ref().unwrap()
); );
u_stmt.execute_named(&[ u_stmt.execute(named_params! {
(":password_failure_count", &u.password_failure_count), ":password_failure_count": &u.password_failure_count,
(":password_hash", &u.password_hash), ":password_hash": &u.password_hash,
(":id", &id), ":id": &id,
])?; })?;
} }
for (_, s) in &self.sessions { for (_, s) in &self.sessions {
if !s.dirty { if !s.dirty {
@ -799,12 +799,12 @@ impl State {
} }
let addr = s.last_use.addr_buf(); let addr = s.last_use.addr_buf();
let addr: Option<&[u8]> = addr.as_ref().map(|a| a.as_ref()); let addr: Option<&[u8]> = addr.as_ref().map(|a| a.as_ref());
s_stmt.execute_named(&[ s_stmt.execute(named_params! {
(":last_use_time_sec", &s.last_use.when_sec), ":last_use_time_sec": &s.last_use.when_sec,
(":last_use_user_agent", &s.last_use.user_agent), ":last_use_user_agent": &s.last_use.user_agent,
(":last_use_peer_addr", &addr), ":last_use_peer_addr": &addr,
(":use_count", &s.use_count), ":use_count": &s.use_count,
])?; })?;
} }
Ok(()) Ok(())
} }
@ -866,7 +866,7 @@ fn lookup_session(conn: &Connection, hash: &SessionHash) -> Result<Session, base
let mut permissions = Permissions::new(); let mut permissions = Permissions::new();
permissions permissions
.merge_from_bytes( .merge_from_bytes(
row.get_raw_checked(18) row.get_ref(18)
.err_kind(ErrorKind::Internal)? .err_kind(ErrorKind::Internal)?
.as_blob() .as_blob()
.err_kind(ErrorKind::Internal)?, .err_kind(ErrorKind::Internal)?,

View File

@ -558,7 +558,7 @@ fn init_recordings(
stream_id = :stream_id stream_id = :stream_id
"#, "#,
)?; )?;
let mut rows = stmt.query_named(named_params! {":stream_id": stream_id})?; let mut rows = stmt.query(named_params! {":stream_id": stream_id})?;
let mut i = 0; let mut i = 0;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let start = recording::Time(row.get(0)?); let start = recording::Time(row.get(0)?);
@ -697,7 +697,7 @@ impl StreamStateChanger {
id = :id id = :id
"#, "#,
)?; )?;
let rows = stmt.execute_named(named_params! { let rows = stmt.execute(named_params! {
":rtsp_url": &sc.rtsp_url, ":rtsp_url": &sc.rtsp_url,
":record": sc.record, ":record": sc.record,
":flush_if_sec": sc.flush_if_sec, ":flush_if_sec": sc.flush_if_sec,
@ -727,7 +727,7 @@ impl StreamStateChanger {
0, 0) 0, 0)
"#, "#,
)?; )?;
stmt.execute_named(named_params! { stmt.execute(named_params! {
":camera_id": camera_id, ":camera_id": camera_id,
":sample_file_dir_id": sc.sample_file_dir_id, ":sample_file_dir_id": sc.sample_file_dir_id,
":type": type_.as_str(), ":type": type_.as_str(),
@ -974,7 +974,7 @@ impl LockedDatabase {
} }
if s.synced_recordings > 0 { if s.synced_recordings > 0 {
new_ranges.entry(stream_id).or_insert(None); new_ranges.entry(stream_id).or_insert(None);
stmt.execute_named(named_params! { stmt.execute(named_params! {
":stream_id": stream_id, ":stream_id": stream_id,
":cum_recordings": s.cum_recordings + s.synced_recordings as i32, ":cum_recordings": s.cum_recordings + s.synced_recordings as i32,
":cum_media_duration_90k": s.cum_media_duration.0 + new_duration, ":cum_media_duration_90k": s.cum_media_duration.0 + new_duration,
@ -1444,7 +1444,7 @@ impl LockedDatabase {
RawEntryMut::Vacant(vacant) => { RawEntryMut::Vacant(vacant) => {
trace!("cache miss for recording {}", id); trace!("cache miss for recording {}", id);
let mut stmt = self.conn.prepare_cached(GET_RECORDING_PLAYBACK_SQL)?; let mut stmt = self.conn.prepare_cached(GET_RECORDING_PLAYBACK_SQL)?;
let mut rows = stmt.query_named(named_params! {":composite_id": id.0})?; let mut rows = stmt.query(named_params! {":composite_id": id.0})?;
if let Some(row) = rows.next()? { if let Some(row) = rows.next()? {
let video_index: VideoIndex = row.get(0)?; let video_index: VideoIndex = row.get(0)?;
let result = f(&RecordingPlayback { let result = f(&RecordingPlayback {
@ -1715,7 +1715,7 @@ impl LockedDatabase {
} }
let mut stmt = self.conn.prepare_cached(INSERT_VIDEO_SAMPLE_ENTRY_SQL)?; let mut stmt = self.conn.prepare_cached(INSERT_VIDEO_SAMPLE_ENTRY_SQL)?;
stmt.execute_named(named_params! { stmt.execute(named_params! {
":width": i32::from(entry.width), ":width": i32::from(entry.width),
":height": i32::from(entry.height), ":height": i32::from(entry.height),
":pasp_h_spacing": i32::from(entry.pasp_h_spacing), ":pasp_h_spacing": i32::from(entry.pasp_h_spacing),
@ -1851,7 +1851,7 @@ impl LockedDatabase {
:password) :password)
"#, "#,
)?; )?;
stmt.execute_named(named_params! { stmt.execute(named_params! {
":uuid": uuid_bytes, ":uuid": uuid_bytes,
":short_name": &camera.short_name, ":short_name": &camera.short_name,
":description": &camera.description, ":description": &camera.description,
@ -1905,7 +1905,7 @@ impl LockedDatabase {
id = :id id = :id
"#, "#,
)?; )?;
let rows = stmt.execute_named(named_params! { let rows = stmt.execute(named_params! {
":id": camera_id, ":id": camera_id,
":short_name": &camera.short_name, ":short_name": &camera.short_name,
":description": &camera.description, ":description": &camera.description,
@ -1945,14 +1945,14 @@ impl LockedDatabase {
if stream.range.is_some() { if stream.range.is_some() {
bail!("Can't remove camera {}; has recordings.", id); bail!("Can't remove camera {}; has recordings.", id);
} }
let rows = stream_stmt.execute_named(named_params! {":id": stream_id})?; let rows = stream_stmt.execute(named_params! {":id": stream_id})?;
if rows != 1 { if rows != 1 {
bail!("Stream {} missing from database", id); bail!("Stream {} missing from database", id);
} }
streams_to_delete.push(*stream_id); streams_to_delete.push(*stream_id);
} }
let mut cam_stmt = tx.prepare_cached(r"delete from camera where id = :id")?; let mut cam_stmt = tx.prepare_cached(r"delete from camera where id = :id")?;
let rows = cam_stmt.execute_named(named_params! {":id": id})?; let rows = cam_stmt.execute(named_params! {":id": id})?;
if rows != 1 { if rows != 1 {
bail!("Camera {} missing from database", id); bail!("Camera {} missing from database", id);
} }
@ -1987,7 +1987,7 @@ impl LockedDatabase {
c.new_limit c.new_limit
); );
} }
let rows = stmt.execute_named(named_params! { let rows = stmt.execute(named_params! {
":record": c.new_record, ":record": c.new_record,
":retain": c.new_limit, ":retain": c.new_limit,
":id": c.stream_id, ":id": c.stream_id,

View File

@ -106,7 +106,7 @@ pub(crate) fn list_recordings_by_time(
f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>, f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_TIME_SQL)?; let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_TIME_SQL)?;
let rows = stmt.query_named(named_params! { let rows = stmt.query(named_params! {
":stream_id": stream_id, ":stream_id": stream_id,
":start_time_90k": desired_time.start.0, ":start_time_90k": desired_time.start.0,
":end_time_90k": desired_time.end.0, ":end_time_90k": desired_time.end.0,
@ -122,7 +122,7 @@ pub(crate) fn list_recordings_by_id(
f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>, f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_ID_SQL)?; let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_ID_SQL)?;
let rows = stmt.query_named(named_params! { let rows = stmt.query(named_params! {
":start": CompositeId::new(stream_id, desired_ids.start).0, ":start": CompositeId::new(stream_id, desired_ids.start).0,
":end": CompositeId::new(stream_id, desired_ids.end).0, ":end": CompositeId::new(stream_id, desired_ids.end).0,
})?; })?;
@ -190,7 +190,7 @@ pub(crate) fn insert_recording(
"#, "#,
) )
.with_context(|e| format!("can't prepare recording insert: {}", e))?; .with_context(|e| format!("can't prepare recording insert: {}", e))?;
stmt.execute_named(named_params! { stmt.execute(named_params! {
":composite_id": id.0, ":composite_id": id.0,
":stream_id": i64::from(id.stream()), ":stream_id": i64::from(id.stream()),
":open_id": o.id, ":open_id": o.id,
@ -228,7 +228,7 @@ pub(crate) fn insert_recording(
0 => None, 0 => None,
_ => Some(r.local_time_delta.0), _ => Some(r.local_time_delta.0),
}; };
stmt.execute_named(named_params! { stmt.execute(named_params! {
":composite_id": id.0, ":composite_id": id.0,
":local_time_delta_90k": delta, ":local_time_delta_90k": delta,
":sample_file_blake3": blake3, ":sample_file_blake3": blake3,
@ -243,7 +243,7 @@ pub(crate) fn insert_recording(
"#, "#,
) )
.with_context(|e| format!("can't prepare recording_playback insert: {}", e))?; .with_context(|e| format!("can't prepare recording_playback insert: {}", e))?;
stmt.execute_named(named_params! { stmt.execute(named_params! {
":composite_id": id.0, ":composite_id": id.0,
":video_index": &r.video_index, ":video_index": &r.video_index,
}) })
@ -298,7 +298,7 @@ pub(crate) fn delete_recordings(
composite_id < :end composite_id < :end
"#, "#,
)?; )?;
let n = insert.execute_named(named_params! { let n = insert.execute(named_params! {
":sample_file_dir_id": sample_file_dir_id, ":sample_file_dir_id": sample_file_dir_id,
":start": ids.start.0, ":start": ids.start.0,
":end": ids.end.0, ":end": ids.end.0,
@ -307,7 +307,7 @@ pub(crate) fn delete_recordings(
":start": ids.start.0, ":start": ids.start.0,
":end": ids.end.0, ":end": ids.end.0,
}; };
let n_playback = del_playback.execute_named(p)?; let n_playback = del_playback.execute(p)?;
if n_playback != n { if n_playback != n {
bail!( bail!(
"inserted {} garbage rows but deleted {} recording_playback rows!", "inserted {} garbage rows but deleted {} recording_playback rows!",
@ -315,7 +315,7 @@ pub(crate) fn delete_recordings(
n_playback n_playback
); );
} }
let n_integrity = del_integrity.execute_named(p)?; let n_integrity = del_integrity.execute(p)?;
if n_integrity > n { if n_integrity > n {
// fewer is okay; recording_integrity is optional. // fewer is okay; recording_integrity is optional.
bail!( bail!(
@ -324,7 +324,7 @@ pub(crate) fn delete_recordings(
n_integrity n_integrity
); );
} }
let n_main = del_main.execute_named(p)?; let n_main = del_main.execute(p)?;
if n_main != n { if n_main != n {
bail!( bail!(
"inserted {} garbage rows but deleted {} recording rows!", "inserted {} garbage rows but deleted {} recording rows!",
@ -367,7 +367,7 @@ pub(crate) fn get_range(
) -> Result<Option<Range<recording::Time>>, Error> { ) -> Result<Option<Range<recording::Time>>, Error> {
// The minimum is straightforward, taking advantage of the start_time_90k index. // The minimum is straightforward, taking advantage of the start_time_90k index.
let mut stmt = conn.prepare_cached(STREAM_MIN_START_SQL)?; let mut stmt = conn.prepare_cached(STREAM_MIN_START_SQL)?;
let mut rows = stmt.query_named(named_params! {":stream_id": stream_id})?; let mut rows = stmt.query(named_params! {":stream_id": stream_id})?;
let min_start = match rows.next()? { let min_start = match rows.next()? {
Some(row) => recording::Time(row.get(0)?), Some(row) => recording::Time(row.get(0)?),
None => return Ok(None), None => return Ok(None),
@ -378,7 +378,7 @@ pub(crate) fn get_range(
// last MAX_RECORDING_DURATION must be examined in order to take advantage of the // last MAX_RECORDING_DURATION must be examined in order to take advantage of the
// start_time_90k index. // start_time_90k index.
let mut stmt = conn.prepare_cached(STREAM_MAX_START_SQL)?; let mut stmt = conn.prepare_cached(STREAM_MAX_START_SQL)?;
let mut rows = stmt.query_named(named_params! {":stream_id": stream_id})?; let mut rows = stmt.query(named_params! {":stream_id": stream_id})?;
let mut maxes_opt = None; let mut maxes_opt = None;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let row_start = recording::Time(row.get(0)?); let row_start = recording::Time(row.get(0)?);
@ -427,7 +427,7 @@ pub(crate) fn list_oldest_recordings(
f: &mut dyn FnMut(db::ListOldestRecordingsRow) -> bool, f: &mut dyn FnMut(db::ListOldestRecordingsRow) -> bool,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_OLDEST_RECORDINGS_SQL)?; let mut stmt = conn.prepare_cached(LIST_OLDEST_RECORDINGS_SQL)?;
let mut rows = stmt.query_named(named_params! { let mut rows = stmt.query(named_params! {
":start": start.0, ":start": start.0,
":end": CompositeId::new(start.stream() + 1, 0).0, ":end": CompositeId::new(start.stream() + 1, 0).0,
})?; })?;

View File

@ -722,7 +722,7 @@ impl State {
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let time_90k = recording::Time(row.get(0)?); let time_90k = recording::Time(row.get(0)?);
let changes = row.get_raw_checked(1)?.as_blob()?; let changes = row.get_ref(1)?.as_blob()?;
let before = cur.clone(); let before = cur.clone();
let mut it = PointDataIterator::new(changes); let mut it = PointDataIterator::new(changes);
while let Some((signal, state)) = it.next()? { while let Some((signal, state)) = it.next()? {

View File

@ -7,7 +7,7 @@ use crate::db;
use crate::recording; use crate::recording;
use failure::Error; use failure::Error;
use log::warn; use log::warn;
use rusqlite::params; use rusqlite::{named_params, params};
use std::collections::HashMap; use std::collections::HashMap;
pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error> { pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error> {
@ -179,32 +179,30 @@ fn fill_recording(tx: &rusqlite::Transaction) -> Result<HashMap<i32, CameraState
Some((run_id, expected_start)) if expected_start == start_time_90k => run_id, Some((run_id, expected_start)) if expected_start == start_time_90k => run_id,
_ => composite_id, _ => composite_id,
}; };
insert1.execute_named(&[ insert1.execute(named_params! {
(":composite_id", &composite_id), ":composite_id": &composite_id,
(":camera_id", &camera_id), ":camera_id": &camera_id,
(":run_offset", &(composite_id - run_id)), ":run_offset": &(composite_id - run_id),
( ":flags": &(
":flags", if trailing_zero {
&(if trailing_zero {
db::RecordingFlags::TrailingZero as i32 db::RecordingFlags::TrailingZero as i32
} else { } else {
0 0
}), }),
), ":sample_file_bytes": &sample_file_bytes,
(":sample_file_bytes", &sample_file_bytes), ":start_time_90k": &start_time_90k,
(":start_time_90k", &start_time_90k), ":duration_90k": &duration_90k,
(":duration_90k", &duration_90k), ":local_time_delta_90k": &local_time_delta_90k,
(":local_time_delta_90k", &local_time_delta_90k), ":video_samples": &video_samples,
(":video_samples", &video_samples), ":video_sync_samples": &video_sync_samples,
(":video_sync_samples", &video_sync_samples), ":video_sample_entry_id": &video_sample_entry_id,
(":video_sample_entry_id", &video_sample_entry_id), })?;
])?; insert2.execute(named_params! {
insert2.execute_named(&[ ":composite_id": &composite_id,
(":composite_id", &composite_id), ":sample_file_uuid": &sample_file_uuid.0.as_bytes()[..],
(":sample_file_uuid", &&sample_file_uuid.0.as_bytes()[..]), ":sample_file_sha1": &sample_file_sha1,
(":sample_file_sha1", &sample_file_sha1), ":video_index": &video_index,
(":video_index", &video_index), })?;
])?;
camera_state.current_run = if trailing_zero { camera_state.current_run = if trailing_zero {
None None
} else { } else {
@ -224,10 +222,10 @@ fn update_camera(
"#, "#,
)?; )?;
for (ref id, ref state) in &camera_state { for (ref id, ref state) in &camera_state {
stmt.execute_named(&[ stmt.execute(named_params! {
(":id", &id), ":id": &id,
(":next_recording_id", &state.next_recording_id), ":next_recording_id": &state.next_recording_id,
])?; })?;
} }
Ok(()) Ok(())
} }

View File

@ -8,7 +8,7 @@ use crate::schema::DirMeta;
use failure::{bail, format_err, Error}; use failure::{bail, format_err, Error};
use nix::fcntl::{FlockArg, OFlag}; use nix::fcntl::{FlockArg, OFlag};
use nix::sys::stat::Mode; use nix::sys::stat::Mode;
use rusqlite::params; use rusqlite::{named_params, params};
use std::os::unix::io::AsRawFd; use std::os::unix::io::AsRawFd;
use uuid::Uuid; use uuid::Uuid;
@ -397,14 +397,14 @@ fn fix_video_sample_entry(tx: &rusqlite::Transaction) -> Result<(), Error> {
let mut rows = select.query(params![])?; let mut rows = select.query(params![])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let data: Vec<u8> = row.get(4)?; let data: Vec<u8> = row.get(4)?;
insert.execute_named(&[ insert.execute(named_params! {
(":id", &row.get::<_, i32>(0)?), ":id": &row.get::<_, i32>(0)?,
(":sha1", &row.get::<_, Vec<u8>>(1)?), ":sha1": &row.get::<_, Vec<u8>>(1)?,
(":width", &row.get::<_, i32>(2)?), ":width": &row.get::<_, i32>(2)?,
(":height", &row.get::<_, i32>(3)?), ":height": &row.get::<_, i32>(3)?,
(":rfc6381_codec", &rfc6381_codec_from_sample_entry(&data)?), ":rfc6381_codec": &rfc6381_codec_from_sample_entry(&data)?,
(":data", &data), ":data": &data,
])?; })?;
} }
Ok(()) Ok(())
} }

View File

@ -126,7 +126,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
)?; )?;
let mut rows = stmt.query(params![])?; let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let path = row.get_raw_checked(0)?.as_str()?; let path = row.get_ref(0)?.as_str()?;
info!("path: {}", path); info!("path: {}", path);
let dir_uuid: FromSqlUuid = row.get(1)?; let dir_uuid: FromSqlUuid = row.get(1)?;
let open_id: Option<u32> = row.get(2)?; let open_id: Option<u32> = row.get(2)?;

View File

@ -102,7 +102,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
let id: i32 = row.get(0)?; let id: i32 = row.get(0)?;
let width: u16 = row.get::<_, i32>(1)?.try_into()?; let width: u16 = row.get::<_, i32>(1)?.try_into()?;
let height: u16 = row.get::<_, i32>(2)?.try_into()?; let height: u16 = row.get::<_, i32>(2)?.try_into()?;
let rfc6381_codec: &str = row.get_raw_checked(3)?.as_str()?; let rfc6381_codec: &str = row.get_ref(3)?.as_str()?;
let mut data: Vec<u8> = row.get(4)?; let mut data: Vec<u8> = row.get(4)?;
let avcc = parse(&data)?; let avcc = parse(&data)?;
if avcc.num_of_sequence_parameter_sets() != 1 { if avcc.num_of_sequence_parameter_sets() != 1 {
@ -132,7 +132,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
BigEndian::write_u32(&mut data[0..4], u32::try_from(len)?); BigEndian::write_u32(&mut data[0..4], u32::try_from(len)?);
} }
insert.execute_named(named_params! { insert.execute(named_params! {
":id": id, ":id": id,
":width": width, ":width": width,
":height": height, ":height": height,
@ -253,7 +253,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
cur_stream_id = Some(stream_id); cur_stream_id = Some(stream_id);
} }
insert insert
.execute_named(named_params! { .execute(named_params! {
":composite_id": composite_id, ":composite_id": composite_id,
":open_id": open_id, ":open_id": open_id,
":stream_id": stream_id, ":stream_id": stream_id,