move open_id from recording_playback to recording

I want to be able to use it in etags without having to do a full scan of the
recording_playback in advance, which would greatly increase time to first
byte. I probably will even use it in urls to ensure the segments they point to
are stable. I haven't actually done this yet - it will wait until I implement
serving unflushed recordings - but I want to get the schema set up properly.
This commit is contained in:
Scott Lamb 2018-02-28 20:52:43 -08:00
parent fb4d88d3e2
commit fbe1231af0
4 changed files with 37 additions and 33 deletions

View File

@ -38,17 +38,19 @@ use rusqlite;
use std::ops::Range; use std::ops::Range;
const INSERT_RECORDING_SQL: &'static str = r#" const INSERT_RECORDING_SQL: &'static str = r#"
insert into recording (composite_id, stream_id, run_offset, flags, sample_file_bytes, insert into recording (composite_id, stream_id, open_id, run_offset, flags,
start_time_90k, duration_90k, local_time_delta_90k, video_samples, sample_file_bytes, start_time_90k, duration_90k,
video_sync_samples, video_sample_entry_id) local_time_delta_90k, video_samples, video_sync_samples,
values (:composite_id, :stream_id, :run_offset, :flags, :sample_file_bytes, video_sample_entry_id)
:start_time_90k, :duration_90k, :local_time_delta_90k, values (:composite_id, :stream_id, :open_id, :run_offset, :flags,
:video_samples, :video_sync_samples, :video_sample_entry_id) :sample_file_bytes, :start_time_90k, :duration_90k,
:local_time_delta_90k, :video_samples, :video_sync_samples,
:video_sample_entry_id)
"#; "#;
const INSERT_RECORDING_PLAYBACK_SQL: &'static str = r#" const INSERT_RECORDING_PLAYBACK_SQL: &'static str = r#"
insert into recording_playback (composite_id, open_id, sample_file_sha1, video_index) insert into recording_playback (composite_id, sample_file_sha1, video_index)
values (:composite_id, :open_id, :sample_file_sha1, :video_index) values (:composite_id, :sample_file_sha1, :video_index)
"#; "#;
const STREAM_MIN_START_SQL: &'static str = r#" const STREAM_MIN_START_SQL: &'static str = r#"
@ -98,6 +100,7 @@ pub(crate) fn insert_recording(tx: &rusqlite::Transaction, o: &db::Open, id: Com
stmt.execute_named(&[ stmt.execute_named(&[
(":composite_id", &id.0), (":composite_id", &id.0),
(":stream_id", &(id.stream() as i64)), (":stream_id", &(id.stream() as i64)),
(":open_id", &o.id),
(":run_offset", &r.run_offset), (":run_offset", &r.run_offset),
(":flags", &r.flags), (":flags", &r.flags),
(":sample_file_bytes", &r.sample_file_bytes), (":sample_file_bytes", &r.sample_file_bytes),
@ -113,7 +116,6 @@ pub(crate) fn insert_recording(tx: &rusqlite::Transaction, o: &db::Open, id: Com
let sha1 = &r.sample_file_sha1[..]; let sha1 = &r.sample_file_sha1[..];
stmt.execute_named(&[ stmt.execute_named(&[
(":composite_id", &id.0), (":composite_id", &id.0),
(":open_id", &o.id),
(":sample_file_sha1", &sha1), (":sample_file_sha1", &sha1),
(":video_index", &r.video_index), (":video_index", &r.video_index),
])?; ])?;

View File

@ -134,6 +134,12 @@ create table recording (
-- recording_cover rows (which match this id format) are typically 1--5 KiB. -- recording_cover rows (which match this id format) are typically 1--5 KiB.
composite_id integer primary key, composite_id integer primary key,
-- The open in which this was committed to the database. For a given
-- composite_id, only one recording will ever be committed to the database,
-- but in-memory state may reflect a recording which never gets committed.
-- This field allows disambiguation in etags and such.
open_id integer not null references open (id),
-- This field is redundant with id above, but used to enforce the reference -- This field is redundant with id above, but used to enforce the reference
-- constraint and to structure the recording_start_time index. -- constraint and to structure the recording_start_time index.
stream_id integer not null references stream (id), stream_id integer not null references stream (id),
@ -184,6 +190,7 @@ create index recording_cover on recording (
-- These fields are not used for ordering; they cover most queries so -- These fields are not used for ordering; they cover most queries so
-- that only database verification and actual viewing of recordings need -- that only database verification and actual viewing of recordings need
-- to consult the underlying row. -- to consult the underlying row.
open_id,
duration_90k, duration_90k,
video_samples, video_samples,
video_sync_samples, video_sync_samples,
@ -202,12 +209,6 @@ create table recording_playback (
-- See description on recording table. -- See description on recording table.
composite_id integer primary key references recording (composite_id), composite_id integer primary key references recording (composite_id),
-- The open in which this was committed to the database. For a given
-- composite_id, only one recording will ever be committed to the database,
-- but in-memory state may reflect a recording which never gets committed.
-- This field allows disambiguation in etags and such.
open_id integer not null references open (id),
-- The sha1 hash of the contents of the sample file. -- The sha1 hash of the contents of the sample file.
sample_file_sha1 blob not null check (length(sample_file_sha1) = 20), sample_file_sha1 blob not null check (length(sample_file_sha1) = 20),

View File

@ -167,6 +167,7 @@ impl<'a> super::Upgrader for U<'a> {
create table recording ( create table recording (
composite_id integer primary key, composite_id integer primary key,
stream_id integer not null references stream (id), stream_id integer not null references stream (id),
open_id integer not null,
run_offset integer not null, run_offset integer not null,
flags integer not null, flags integer not null,
sample_file_bytes integer not null check (sample_file_bytes > 0), sample_file_bytes integer not null check (sample_file_bytes > 0),
@ -183,6 +184,7 @@ impl<'a> super::Upgrader for U<'a> {
create index recording_cover on recording ( create index recording_cover on recording (
stream_id, stream_id,
start_time_90k, start_time_90k,
open_id,
duration_90k, duration_90k,
video_samples, video_samples,
video_sync_samples, video_sync_samples,
@ -252,19 +254,20 @@ impl<'a> super::Upgrader for U<'a> {
insert into recording insert into recording
select select
composite_id, r.composite_id,
camera_id, r.camera_id,
run_offset, o.open_id,
flags, r.run_offset,
sample_file_bytes, r.flags,
start_time_90k, r.sample_file_bytes,
duration_90k, r.start_time_90k,
local_time_delta_90k, r.duration_90k,
video_samples, r.local_time_delta_90k,
video_sync_samples, r.video_samples,
video_sample_entry_id r.video_sync_samples,
r.video_sample_entry_id
from from
old_recording; old_recording r cross join open o;
"#)?; "#)?;
fix_video_sample_entry(tx)?; fix_video_sample_entry(tx)?;

View File

@ -148,18 +148,16 @@ impl super::Upgrader for U {
alter table recording_playback rename to old_recording_playback; alter table recording_playback rename to old_recording_playback;
create table recording_playback ( create table recording_playback (
composite_id integer primary key references recording (composite_id), composite_id integer primary key references recording (composite_id),
open_id integer not null references open (id),
sample_file_sha1 blob not null check (length(sample_file_sha1) = 20), sample_file_sha1 blob not null check (length(sample_file_sha1) = 20),
video_index blob not null check (length(video_index) > 0) video_index blob not null check (length(video_index) > 0)
); );
insert into recording_playback insert into recording_playback
select select
p.composite_id, composite_id,
o.id, sample_file_sha1,
p.sample_file_sha1, video_index
p.video_index
from from
old_recording_playback p cross join open o; old_recording_playback;
drop table old_recording_playback; drop table old_recording_playback;
"#)?; "#)?;
Ok(()) Ok(())