mirror of
				https://github.com/scottlamb/moonfire-nvr.git
				synced 2025-10-29 15:55:01 -04:00 
			
		
		
		
	style: use rusqlite's {named_,}params! everywhere
This commit is contained in:
		
							parent
							
								
									9d6dec2565
								
							
						
					
					
						commit
						066c086050
					
				
							
								
								
									
										24
									
								
								db/auth.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								db/auth.rs
									
									
									
									
									
								
							| @ -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)?; | ||||
|  | ||||
							
								
								
									
										14
									
								
								db/check.rs
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								db/check.rs
									
									
									
									
									
								
							| @ -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
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								db/db.rs
									
									
									
									
									
								
							| @ -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, | ||||
|  | ||||
							
								
								
									
										97
									
								
								db/raw.rs
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								db/raw.rs
									
									
									
									
									
								
							| @ -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)?), | ||||
|  | ||||
| @ -537,7 +537,7 @@ impl State { | ||||
|                     ])?; | ||||
|                 }, | ||||
|                 Entry::Vacant(_) => { | ||||
|                     d_stmt.execute(&[t.0])?; | ||||
|                     d_stmt.execute(params![t.0])?; | ||||
|                 }, | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -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()?; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -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(&[ | ||||
|  | ||||
| @ -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)?; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user