style: use rusqlite's {named_,}params! everywhere

This commit is contained in:
Scott Lamb 2020-03-19 20:46:25 -07:00
parent 9d6dec2565
commit 066c086050
8 changed files with 155 additions and 154 deletions

View File

@ -38,7 +38,7 @@ use lazy_static::lazy_static;
use libpasta;
use parking_lot::Mutex;
use protobuf::Message;
use rusqlite::{Connection, Transaction, types::ToSql};
use rusqlite::{Connection, Transaction, params};
use std::collections::BTreeMap;
use std::fmt;
use std::net::IpAddr;
@ -355,7 +355,7 @@ impl State {
from
user
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = row.get(0)?;
let name: String = row.get(1)?;
@ -476,10 +476,10 @@ impl State {
pub fn delete_user(&mut self, conn: &mut Connection, id: i32) -> Result<(), Error> {
let tx = conn.transaction()?;
tx.execute("delete from user_session where user_id = ?", &[&id])?;
tx.execute("delete from user_session where user_id = ?", params![id])?;
{
let mut user_stmt = tx.prepare_cached("delete from user where id = ?")?;
if user_stmt.execute(&[&id])? != 1 {
if user_stmt.execute(params![id])? != 1 {
bail!("user {} not found", id);
}
}
@ -636,13 +636,13 @@ impl State {
"#)?;
let addr = req.addr_buf();
let addr: Option<&[u8]> = addr.as_ref().map(|a| a.as_ref());
stmt.execute(&[
&req.when_sec as &dyn ToSql,
&req.user_agent,
&addr,
&(reason as i32),
&detail,
&&hash.0[..],
stmt.execute(params![
req.when_sec,
req.user_agent,
addr,
reason as i32,
detail,
&hash.0[..],
])?;
s.revocation = req;
s.revocation_reason = Some(reason as i32);
@ -740,7 +740,7 @@ fn lookup_session(conn: &Connection, hash: &SessionHash) -> Result<Session, Erro
where
session_id_hash = ?
"#)?;
let mut rows = stmt.query(&[&&hash.0[..]])?;
let mut rows = stmt.query(params![&hash.0[..]])?;
let row = rows.next()?.ok_or_else(|| format_err!("no such session"))?;
let creation_addr: FromSqlIpAddr = row.get(8)?;
let revocation_addr: FromSqlIpAddr = row.get(11)?;

View File

@ -40,7 +40,7 @@ use fnv::FnvHashMap;
use log::error;
use nix::fcntl::AtFlags;
use protobuf::prelude::MessageField;
use rusqlite::types::ToSql;
use rusqlite::params;
use crate::schema;
use std::os::unix::io::AsRawFd;
@ -69,7 +69,7 @@ pub fn run(conn: &rusqlite::Connection, opts: &Options) -> Result<(), Error> {
"#)?;
let mut garbage_stmt = conn.prepare_cached(
"select composite_id from garbage where sample_file_dir_id = ?")?;
let mut rows = dir_stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = dir_stmt.query(params![])?;
while let Some(row) = rows.next()? {
let mut meta = schema::DirMeta::default();
let dir_id: i32 = row.get(0)?;
@ -88,7 +88,7 @@ pub fn run(conn: &rusqlite::Connection, opts: &Options) -> Result<(), Error> {
// Open the directory (checking its metadata) and hold it open (for the lock).
let dir = dir::SampleFileDir::open(&dir_path, &meta)?;
let mut streams = read_dir(&dir, opts)?;
let mut rows = garbage_stmt.query(&[&dir_id])?;
let mut rows = garbage_stmt.query(params![dir_id])?;
while let Some(row) = rows.next()? {
let id = CompositeId(row.get(0)?);
let s = streams.entry(id.stream()).or_insert_with(Stream::default);
@ -103,7 +103,7 @@ pub fn run(conn: &rusqlite::Connection, opts: &Options) -> Result<(), Error> {
let mut stmt = conn.prepare(r#"
select id, sample_file_dir_id from stream where sample_file_dir_id is not null
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let stream_id = row.get(0)?;
let dir_id = row.get(1)?;
@ -234,7 +234,7 @@ fn compare_stream(conn: &rusqlite::Connection, stream_id: i32, opts: &Options,
where
composite_id between ? and ?
"#)?;
let mut rows = stmt.query(&[&start.0, &end.0])?;
let mut rows = stmt.query(params![start.0, end.0])?;
while let Some(row) = rows.next()? {
let id = CompositeId(row.get(0)?);
let s = RecordingSummary {
@ -261,7 +261,7 @@ fn compare_stream(conn: &rusqlite::Connection, stream_id: i32, opts: &Options,
where
composite_id between ? and ?
"#)?;
let mut rows = stmt.query(&[&start.0, &end.0])?;
let mut rows = stmt.query(params![start.0, end.0])?;
while let Some(row) = rows.next()? {
let id = CompositeId(row.get(0)?);
let video_index: Vec<u8> = row.get(1)?;
@ -288,7 +288,7 @@ fn compare_stream(conn: &rusqlite::Connection, stream_id: i32, opts: &Options,
where
composite_id between ? and ?
"#)?;
let mut rows = stmt.query(&[&start.0, &end.0])?;
let mut rows = stmt.query(params![start.0, end.0])?;
while let Some(row) = rows.next()? {
let id = CompositeId(row.get(0)?);
stream.entry(id.recording())

148
db/db.rs
View File

@ -68,7 +68,7 @@ use lru_cache::LruCache;
use openssl::hash;
use parking_lot::{Mutex,MutexGuard};
use protobuf::prelude::MessageField;
use rusqlite::types::ToSql;
use rusqlite::{named_params, params};
use smallvec::SmallVec;
use std::collections::{BTreeMap, VecDeque};
use std::cell::RefCell;
@ -584,7 +584,7 @@ fn init_recordings(conn: &mut rusqlite::Connection, stream_id: i32, camera: &Cam
where
stream_id = :stream_id
"#)?;
let mut rows = stmt.query_named(&[(":stream_id", &stream_id)])?;
let mut rows = stmt.query_named(named_params!{":stream_id": stream_id})?;
let mut i = 0;
while let Some(row) = rows.next()? {
let start = recording::Time(row.get(0)?);
@ -681,7 +681,7 @@ impl StreamStateChanger {
let mut stmt = tx.prepare_cached(r#"
delete from stream where id = ?
"#)?;
if stmt.execute(&[&sid])? != 1 {
if stmt.execute(params![sid])? != 1 {
bail!("missing stream {}", sid);
}
streams.push((sid, None));
@ -696,13 +696,13 @@ impl StreamStateChanger {
where
id = :id
"#)?;
let rows = stmt.execute_named(&[
(":rtsp_url", &sc.rtsp_url),
(":record", &sc.record),
(":flush_if_sec", &sc.flush_if_sec),
(":sample_file_dir_id", &sc.sample_file_dir_id),
(":id", &sid),
])?;
let rows = stmt.execute_named(named_params!{
":rtsp_url": &sc.rtsp_url,
":record": sc.record,
":flush_if_sec": sc.flush_if_sec,
":sample_file_dir_id": sc.sample_file_dir_id,
":id": sid,
})?;
if rows != 1 {
bail!("missing stream {}", sid);
}
@ -722,14 +722,14 @@ impl StreamStateChanger {
values (:camera_id, :sample_file_dir_id, :type, :rtsp_url, :record,
0, :flush_if_sec, 1)
"#)?;
stmt.execute_named(&[
(":camera_id", &camera_id),
(":sample_file_dir_id", &sc.sample_file_dir_id),
(":type", &type_.as_str()),
(":rtsp_url", &sc.rtsp_url),
(":record", &sc.record),
(":flush_if_sec", &sc.flush_if_sec),
])?;
stmt.execute_named(named_params!{
":camera_id": camera_id,
":sample_file_dir_id": sc.sample_file_dir_id,
":type": type_.as_str(),
":rtsp_url": &sc.rtsp_url,
":record": sc.record,
":flush_if_sec": sc.flush_if_sec,
})?;
let id = tx.last_insert_rowid() as i32;
sids[i] = Some(id);
let sc = mem::replace(*sc, StreamChange::default());
@ -918,10 +918,10 @@ impl LockedDatabase {
}
if s.synced_recordings > 0 {
new_ranges.entry(stream_id).or_insert(None);
stmt.execute_named(&[
(":stream_id", &stream_id),
(":next_recording_id", &(s.next_recording_id + s.synced_recordings as i32)),
])?;
stmt.execute_named(named_params!{
":stream_id": stream_id,
":next_recording_id": s.next_recording_id + s.synced_recordings as i32,
})?;
}
// Process deletions.
@ -955,10 +955,10 @@ impl LockedDatabase {
{
let mut stmt = tx.prepare_cached(
r"update open set duration_90k = ?, end_time_90k = ? where id = ?")?;
let rows = stmt.execute(&[
&(recording::Time::new(clocks.monotonic()) - self.open_monotonic).0 as &dyn ToSql,
&recording::Time::new(clocks.realtime()).0,
&o.id,
let rows = stmt.execute(params![
(recording::Time::new(clocks.monotonic()) - self.open_monotonic).0,
recording::Time::new(clocks.realtime()).0,
o.id,
])?;
if rows != 1 {
bail!("unable to find current open {}", o.id);
@ -1107,7 +1107,7 @@ impl LockedDatabase {
update sample_file_dir set last_complete_open_id = ? where id = ?
"#)?;
for &id in in_progress.keys() {
if stmt.execute(&[&o.id as &dyn ToSql, &id])? != 1 {
if stmt.execute(params![o.id, id])? != 1 {
bail!("unable to update dir {}", id);
}
}
@ -1302,7 +1302,7 @@ impl LockedDatabase {
}
trace!("cache miss for recording {}", id);
let mut stmt = self.conn.prepare_cached(GET_RECORDING_PLAYBACK_SQL)?;
let mut rows = stmt.query_named(&[(":composite_id", &id.0)])?;
let mut rows = stmt.query_named(named_params!{":composite_id": id.0})?;
if let Some(row) = rows.next()? {
let video_index: VideoIndex = row.get(0)?;
let result = f(&RecordingPlayback { video_index: &video_index.0[..] });
@ -1349,7 +1349,7 @@ impl LockedDatabase {
from
video_sample_entry
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = row.get(0)?;
let mut sha1 = [0u8; 20];
@ -1388,7 +1388,7 @@ impl LockedDatabase {
from
sample_file_dir d left join open o on (d.last_complete_open_id = o.id);
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = row.get(0)?;
let dir_uuid: FromSqlUuid = row.get(2)?;
@ -1429,7 +1429,7 @@ impl LockedDatabase {
from
camera;
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = row.get(0)?;
let uuid: FromSqlUuid = row.get(1)?;
@ -1467,7 +1467,7 @@ impl LockedDatabase {
from
stream;
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = row.get(0)?;
let type_: String = row.get(1)?;
@ -1530,13 +1530,13 @@ impl LockedDatabase {
}
let mut stmt = self.conn.prepare_cached(INSERT_VIDEO_SAMPLE_ENTRY_SQL)?;
stmt.execute_named(&[
(":sha1", &&sha1_bytes[..]),
(":width", &(width as i64)),
(":height", &(height as i64)),
(":rfc6381_codec", &rfc6381_codec),
(":data", &data),
])?;
stmt.execute_named(named_params!{
":sha1": &sha1_bytes[..],
":width": i32::from(width),
":height": i32::from(height),
":rfc6381_codec": &rfc6381_codec,
":data": &data,
})?;
let id = self.conn.last_insert_rowid() as i32;
self.video_sample_entries_by_id.insert(id, Arc::new(VideoSampleEntry {
@ -1572,7 +1572,7 @@ impl LockedDatabase {
self.conn.execute(r#"
insert into sample_file_dir (path, uuid, last_complete_open_id)
values (?, ?, ?)
"#, &[&path as &dyn ToSql, &uuid_bytes, &o.id])?;
"#, params![&path, uuid_bytes, o.id])?;
let id = self.conn.last_insert_rowid() as i32;
use ::std::collections::btree_map::Entry;
let e = self.sample_file_dirs_by_id.entry(id);
@ -1624,7 +1624,7 @@ impl LockedDatabase {
meta.in_progress_open = mem::replace(&mut meta.last_complete_open,
::protobuf::SingularPtrField::none());
dir.write_meta(&meta)?;
if self.conn.execute("delete from sample_file_dir where id = ?", &[&dir_id])? != 1 {
if self.conn.execute("delete from sample_file_dir where id = ?", params![dir_id])? != 1 {
bail!("missing database row for dir {}", dir_id);
}
d.remove_entry();
@ -1645,14 +1645,14 @@ impl LockedDatabase {
values (:uuid, :short_name, :description, :onvif_host, :username,
:password)
"#)?;
stmt.execute_named(&[
(":uuid", &uuid_bytes),
(":short_name", &camera.short_name),
(":description", &camera.description),
(":onvif_host", &camera.onvif_host),
(":username", &camera.username),
(":password", &camera.password),
])?;
stmt.execute_named(named_params!{
":uuid": uuid_bytes,
":short_name": &camera.short_name,
":description": &camera.description,
":onvif_host": &camera.onvif_host,
":username": &camera.username,
":password": &camera.password,
})?;
camera_id = tx.last_insert_rowid() as i32;
streams = StreamStateChanger::new(&tx, camera_id, None, &self.streams_by_id,
&mut camera)?;
@ -1694,14 +1694,14 @@ impl LockedDatabase {
where
id = :id
"#)?;
let rows = stmt.execute_named(&[
(":id", &camera_id),
(":short_name", &camera.short_name),
(":description", &camera.description),
(":onvif_host", &camera.onvif_host),
(":username", &camera.username),
(":password", &camera.password),
])?;
let rows = stmt.execute_named(named_params!{
":id": camera_id,
":short_name": &camera.short_name,
":description": &camera.description,
":onvif_host": &camera.onvif_host,
":username": &camera.username,
":password": &camera.password,
})?;
if rows != 1 {
bail!("Camera {} missing from database", camera_id);
}
@ -1730,14 +1730,14 @@ impl LockedDatabase {
if stream.range.is_some() {
bail!("Can't remove camera {}; has recordings.", id);
}
let rows = stream_stmt.execute_named(&[(":id", stream_id)])?;
let rows = stream_stmt.execute_named(named_params!{":id": stream_id})?;
if rows != 1 {
bail!("Stream {} missing from database", id);
}
streams_to_delete.push(*stream_id);
}
let mut cam_stmt = tx.prepare_cached(r"delete from camera where id = :id")?;
let rows = cam_stmt.execute_named(&[(":id", &id)])?;
let rows = cam_stmt.execute_named(named_params!{":id": id})?;
if rows != 1 {
bail!("Camera {} missing from database", id);
}
@ -1767,11 +1767,11 @@ impl LockedDatabase {
bail!("can't set limit for stream {} to {}; must be >= 0",
c.stream_id, c.new_limit);
}
let rows = stmt.execute_named(&[
(":record", &c.new_record),
(":retain", &c.new_limit),
(":id", &c.stream_id),
])?;
let rows = stmt.execute_named(named_params!{
":record": c.new_record,
":retain": c.new_limit,
":id": c.stream_id,
})?;
if rows != 1 {
bail!("no such stream {}", c.stream_id);
}
@ -1845,15 +1845,15 @@ impl LockedDatabase {
/// Note this doesn't set journal options, so that it can be used on in-memory databases for
/// test code.
pub fn init(conn: &mut rusqlite::Connection) -> Result<(), Error> {
conn.execute("pragma foreign_keys = on", &[] as &[&dyn ToSql])?;
conn.execute("pragma fullfsync = on", &[] as &[&dyn ToSql])?;
conn.execute("pragma synchronous = 2", &[] as &[&dyn ToSql])?;
conn.execute("pragma foreign_keys = on", params![])?;
conn.execute("pragma fullfsync = on", params![])?;
conn.execute("pragma synchronous = 2", params![])?;
let tx = conn.transaction()?;
tx.execute_batch(include_str!("schema.sql"))?;
{
let uuid = ::uuid::Uuid::new_v4();
let uuid_bytes = &uuid.as_bytes()[..];
tx.execute("insert into meta (uuid) values (?)", &[&uuid_bytes])?;
tx.execute("insert into meta (uuid) values (?)", params![uuid_bytes])?;
}
tx.commit()?;
Ok(())
@ -1866,11 +1866,11 @@ pub fn init(conn: &mut rusqlite::Connection) -> Result<(), Error> {
pub fn get_schema_version(conn: &rusqlite::Connection) -> Result<Option<i32>, Error> {
let ver_tables: i32 = conn.query_row_and_then(
"select count(*) from sqlite_master where name = 'version'",
&[] as &[&dyn ToSql], |row| row.get(0))?;
params![], |row| row.get(0))?;
if ver_tables == 0 {
return Ok(None);
}
Ok(Some(conn.query_row_and_then("select max(id) from version", &[] as &[&dyn ToSql],
Ok(Some(conn.query_row_and_then("select max(id) from version", params![],
|row| row.get(0))?))
}
@ -1908,9 +1908,9 @@ impl<C: Clocks + Clone> Database<C> {
/// Creates the database from a caller-supplied SQLite connection.
pub fn new(clocks: C, conn: rusqlite::Connection,
read_write: bool) -> Result<Database<C>, Error> {
conn.execute("pragma foreign_keys = on", &[] as &[&dyn ToSql])?;
conn.execute("pragma fullfsync = on", &[] as &[&dyn ToSql])?;
conn.execute("pragma synchronous = 2", &[] as &[&dyn ToSql])?;
conn.execute("pragma foreign_keys = on", params![])?;
conn.execute("pragma fullfsync = on", params![])?;
conn.execute("pragma synchronous = 2", params![])?;
{
let ver = get_schema_version(&conn)?.ok_or_else(|| format_err!(
"no such table: version. \
@ -1940,7 +1940,7 @@ impl<C: Clocks + Clone> Database<C> {
let mut stmt = conn.prepare(" insert into open (uuid, start_time_90k) values (?, ?)")?;
let uuid = Uuid::new_v4();
let uuid_bytes = &uuid.as_bytes()[..];
stmt.execute(&[&uuid_bytes as &dyn ToSql, &real.0])?;
stmt.execute(params![uuid_bytes, real.0])?;
Some(Open {
id: conn.last_insert_rowid() as u32,
uuid,

View File

@ -34,7 +34,7 @@ use crate::db::{self, CompositeId, FromSqlUuid};
use failure::{Error, ResultExt, bail};
use fnv::FnvHashSet;
use crate::recording;
use rusqlite::types::ToSql;
use rusqlite::{named_params, params};
use std::ops::Range;
use uuid::Uuid;
@ -125,10 +125,11 @@ pub(crate) fn list_recordings_by_time(
conn: &rusqlite::Connection, stream_id: i32, desired_time: Range<recording::Time>,
f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>) -> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_TIME_SQL)?;
let rows = stmt.query_named(&[
(":stream_id", &stream_id),
(":start_time_90k", &desired_time.start.0),
(":end_time_90k", &desired_time.end.0)])?;
let rows = stmt.query_named(named_params!{
":stream_id": stream_id,
":start_time_90k": desired_time.start.0,
":end_time_90k": desired_time.end.0,
})?;
list_recordings_inner(rows, f)
}
@ -137,10 +138,10 @@ pub(crate) fn list_recordings_by_id(
conn: &rusqlite::Connection, stream_id: i32, desired_ids: Range<i32>,
f: &mut dyn FnMut(db::ListRecordingsRow) -> Result<(), Error>) -> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_RECORDINGS_BY_ID_SQL)?;
let rows = stmt.query_named(&[
(":start", &CompositeId::new(stream_id, desired_ids.start).0),
(":end", &CompositeId::new(stream_id, desired_ids.end).0),
])?;
let rows = stmt.query_named(named_params!{
":start": CompositeId::new(stream_id, desired_ids.start).0,
":end": CompositeId::new(stream_id, desired_ids.end).0,
})?;
list_recordings_inner(rows, f)
}
@ -165,7 +166,7 @@ fn list_recordings_inner(mut rows: rusqlite::Rows,
}
pub(crate) fn get_db_uuid(conn: &rusqlite::Connection) -> Result<Uuid, Error> {
Ok(conn.query_row("select uuid from meta", &[] as &[&dyn ToSql], |row| -> rusqlite::Result<Uuid> {
Ok(conn.query_row("select uuid from meta", params![], |row| -> rusqlite::Result<Uuid> {
let uuid: FromSqlUuid = row.get(0)?;
Ok(uuid.0)
})?)
@ -183,19 +184,19 @@ pub(crate) fn insert_recording(tx: &rusqlite::Transaction, o: &db::Open, id: Com
:video_samples, :video_sync_samples,
:video_sample_entry_id)
"#).with_context(|e| format!("can't prepare recording insert: {}", e))?;
stmt.execute_named(&[
(":composite_id", &id.0),
(":stream_id", &(id.stream() as i64)),
(":open_id", &o.id),
(":run_offset", &r.run_offset),
(":flags", &r.flags),
(":sample_file_bytes", &r.sample_file_bytes),
(":start_time_90k", &r.start.0),
(":duration_90k", &r.duration_90k),
(":video_samples", &r.video_samples),
(":video_sync_samples", &r.video_sync_samples),
(":video_sample_entry_id", &r.video_sample_entry_id),
]).with_context(|e| format!("unable to insert recording for recording {} {:#?}: {}",
stmt.execute_named(named_params!{
":composite_id": id.0,
":stream_id": i64::from(id.stream()),
":open_id": o.id,
":run_offset": r.run_offset,
":flags": r.flags,
":sample_file_bytes": r.sample_file_bytes,
":start_time_90k": r.start.0,
":duration_90k": r.duration_90k,
":video_samples": r.video_samples,
":video_sync_samples": r.video_sync_samples,
":video_sample_entry_id": r.video_sample_entry_id,
}).with_context(|e| format!("unable to insert recording for recording {} {:#?}: {}",
id, r, e))?;
let mut stmt = tx.prepare_cached(r#"
@ -207,20 +208,20 @@ pub(crate) fn insert_recording(tx: &rusqlite::Transaction, o: &db::Open, id: Com
0 => None,
_ => Some(r.local_time_delta.0),
};
stmt.execute_named(&[
(":composite_id", &id.0),
(":local_time_delta_90k", &delta),
(":sample_file_sha1", &sha1),
]).with_context(|e| format!("unable to insert recording_integrity for {:#?}: {}", r, e))?;
stmt.execute_named(named_params!{
":composite_id": id.0,
":local_time_delta_90k": delta,
":sample_file_sha1": sha1,
}).with_context(|e| format!("unable to insert recording_integrity for {:#?}: {}", r, e))?;
let mut stmt = tx.prepare_cached(r#"
insert into recording_playback (composite_id, video_index)
values (:composite_id, :video_index)
"#).with_context(|e| format!("can't prepare recording_playback insert: {}", e))?;
stmt.execute_named(&[
(":composite_id", &id.0),
(":video_index", &r.video_index),
]).with_context(|e| format!("unable to insert recording_playback for {:#?}: {}", r, e))?;
stmt.execute_named(named_params!{
":composite_id": id.0,
":video_index": &r.video_index,
}).with_context(|e| format!("unable to insert recording_playback for {:#?}: {}", r, e))?;
Ok(())
}
@ -261,15 +262,15 @@ pub(crate) fn delete_recordings(tx: &rusqlite::Transaction, sample_file_dir_id:
:start <= composite_id and
composite_id < :end
"#)?;
let n = insert.execute_named(&[
(":sample_file_dir_id", &sample_file_dir_id),
(":start", &ids.start.0),
(":end", &ids.end.0),
])?;
let p: &[(&str, &dyn rusqlite::types::ToSql)] = &[
(":start", &ids.start.0),
(":end", &ids.end.0),
];
let n = insert.execute_named(named_params!{
":sample_file_dir_id": sample_file_dir_id,
":start": ids.start.0,
":end": ids.end.0,
})?;
let p = named_params!{
":start": ids.start.0,
":end": ids.end.0,
};
let n1 = del1.execute_named(p)?;
if n1 != n {
bail!("inserted {} garbage rows but deleted {} recording_playback rows!", n, n1);
@ -292,7 +293,7 @@ pub(crate) fn mark_sample_files_deleted(tx: &rusqlite::Transaction, ids: &[Compo
if ids.is_empty() { return Ok(()); }
let mut stmt = tx.prepare_cached("delete from garbage where composite_id = ?")?;
for &id in ids {
let changes = stmt.execute(&[&id.0])?;
let changes = stmt.execute(params![id.0])?;
if changes != 1 {
// panic rather than return error. Errors get retried indefinitely, but there's no
// recovery from this condition.
@ -311,7 +312,7 @@ pub(crate) fn get_range(conn: &rusqlite::Connection, stream_id: i32)
-> Result<Option<Range<recording::Time>>, Error> {
// The minimum is straightforward, taking advantage of the start_time_90k index.
let mut stmt = conn.prepare_cached(STREAM_MIN_START_SQL)?;
let mut rows = stmt.query_named(&[(":stream_id", &stream_id)])?;
let mut rows = stmt.query_named(named_params!{":stream_id": stream_id})?;
let min_start = match rows.next()? {
Some(row) => recording::Time(row.get(0)?),
None => return Ok(None),
@ -322,7 +323,7 @@ pub(crate) fn get_range(conn: &rusqlite::Connection, stream_id: i32)
// last MAX_RECORDING_DURATION must be examined in order to take advantage of the
// start_time_90k index.
let mut stmt = conn.prepare_cached(STREAM_MAX_START_SQL)?;
let mut rows = stmt.query_named(&[(":stream_id", &stream_id)])?;
let mut rows = stmt.query_named(named_params!{":stream_id": stream_id})?;
let mut maxes_opt = None;
while let Some(row) = rows.next()? {
let row_start = recording::Time(row.get(0)?);
@ -363,10 +364,10 @@ pub(crate) fn list_oldest_recordings(conn: &rusqlite::Connection, start: Composi
f: &mut dyn FnMut(db::ListOldestRecordingsRow) -> bool)
-> Result<(), Error> {
let mut stmt = conn.prepare_cached(LIST_OLDEST_RECORDINGS_SQL)?;
let mut rows = stmt.query_named(&[
(":start", &start.0),
(":end", &CompositeId::new(start.stream() + 1, 0).0),
])?;
let mut rows = stmt.query_named(named_params!{
":start": start.0,
":end": CompositeId::new(start.stream() + 1, 0).0,
})?;
while let Some(row) = rows.next()? {
let should_continue = f(db::ListOldestRecordingsRow {
id: CompositeId(row.get(0)?),

View File

@ -537,7 +537,7 @@ impl State {
])?;
},
Entry::Vacant(_) => {
d_stmt.execute(&[t.0])?;
d_stmt.execute(params![t.0])?;
},
}
}

View File

@ -94,7 +94,7 @@ fn upgrade(args: &Args, target_ver: i32, conn: &mut rusqlite::Connection) -> Res
tx.execute(r#"
insert into version (id, unix_time, notes)
values (?, cast(strftime('%s', 'now') as int32), ?)
"#, params![&(ver + 1), &UPGRADE_NOTES])?;
"#, params![ver + 1, UPGRADE_NOTES])?;
tx.commit()?;
}
}

View File

@ -35,7 +35,7 @@ use failure::{Error, bail, format_err};
use nix::fcntl::{FlockArg, OFlag};
use nix::sys::stat::Mode;
use protobuf::prelude::MessageField;
use rusqlite::types::ToSql;
use rusqlite::params;
use crate::schema::DirMeta;
use std::os::unix::io::AsRawFd;
use uuid::Uuid;
@ -103,10 +103,10 @@ pub fn run(args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
"#)?;
let db_uuid = ::uuid::Uuid::new_v4();
let db_uuid_bytes = &db_uuid.as_bytes()[..];
tx.execute("insert into meta (uuid) values (?)", &[&db_uuid_bytes])?;
tx.execute("insert into meta (uuid) values (?)", params![db_uuid_bytes])?;
let open_uuid = ::uuid::Uuid::new_v4();
let open_uuid_bytes = &open_uuid.as_bytes()[..];
tx.execute("insert into open (uuid) values (?)", &[&open_uuid_bytes])?;
tx.execute("insert into open (uuid) values (?)", params![open_uuid_bytes])?;
let open_id = tx.last_insert_rowid() as u32;
let dir_uuid = ::uuid::Uuid::new_v4();
let dir_uuid_bytes = &dir_uuid.as_bytes()[..];
@ -125,7 +125,7 @@ pub fn run(args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
tx.execute(r#"
insert into sample_file_dir (path, uuid, last_complete_open_id)
values (?, ?, ?)
"#, &[&sample_file_path as &dyn ToSql, &dir_uuid_bytes, &open_id])?;
"#, params![sample_file_path, dir_uuid_bytes, open_id])?;
tx.execute_batch(r#"
drop table reserved_sample_files;
@ -302,7 +302,7 @@ fn verify_dir_contents(sample_file_path: &str, dir: &mut nix::dir::Dir,
from
(select count(*) as c from recording) a,
(select count(*) as c from reserved_sample_files) b;
"#, &[] as &[&dyn ToSql], |r| r.get(0))?;
"#, params![], |r| r.get(0))?;
let mut files = ::fnv::FnvHashSet::with_capacity_and_hasher(n as usize, Default::default());
for e in dir.iter() {
let e = e?;
@ -333,7 +333,7 @@ fn verify_dir_contents(sample_file_path: &str, dir: &mut nix::dir::Dir,
// Iterate through the database and check that everything has a matching file.
{
let mut stmt = tx.prepare(r"select sample_file_uuid from recording_playback")?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let uuid: crate::db::FromSqlUuid = row.get(0)?;
if !files.remove(&uuid.0) {
@ -343,7 +343,7 @@ fn verify_dir_contents(sample_file_path: &str, dir: &mut nix::dir::Dir,
}
let mut stmt = tx.prepare(r"select uuid from reserved_sample_files")?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let uuid: crate::db::FromSqlUuid = row.get(0)?;
if files.remove(&uuid.0) {
@ -379,7 +379,7 @@ fn fix_video_sample_entry(tx: &rusqlite::Transaction) -> Result<(), Error> {
let mut insert = tx.prepare(r#"
insert into video_sample_entry values (:id, :sha1, :width, :height, :rfc6381_codec, :data)
"#)?;
let mut rows = select.query(&[] as &[&dyn ToSql])?;
let mut rows = select.query(params![])?;
while let Some(row) = rows.next()? {
let data: Vec<u8> = row.get(4)?;
insert.execute_named(&[

View File

@ -37,7 +37,7 @@ use crate::dir;
use failure::Error;
use crate::schema;
use protobuf::prelude::MessageField;
use rusqlite::types::ToSql;
use rusqlite::params;
use std::os::unix::io::AsRawFd;
use std::sync::Arc;
@ -55,7 +55,7 @@ fn open_sample_file_dir(tx: &rusqlite::Transaction) -> Result<Arc<dir::SampleFil
sample_file_dir s
join open o on (s.last_complete_open_id = o.id)
cross join meta m
"#, &[] as &[&dyn ToSql], |row| {
"#, params![], |row| {
Ok((row.get(0)?,
row.get(1)?,
row.get(2)?,
@ -82,7 +82,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
from
recording_playback
"#)?;
let mut rows = stmt.query(&[] as &[&dyn ToSql])?;
let mut rows = stmt.query(params![])?;
while let Some(row) = rows.next()? {
let id = db::CompositeId(row.get(0)?);
let sample_file_uuid: FromSqlUuid = row.get(1)?;