Posted to tcl by kbk at Sat Sep 19 21:50:13 GMT 2009view pretty
-- In my old notes, I expected that the schema for changes would look -- something lime the following. create table changes ( change_id integer primary key auto_increment, -- arbitrary number for key page_id integer not null, -- page number version integer not null, -- version number change_time timestamp not null, -- timestamp of change who varchar(20), -- user who made the change delta integer, -- total magnitude of the change constraint fk_changes_page foreign key(page_id) references pages(page_id) ); create unique index idx_changes on changes (page_id, version desc); create table diffs{ diff_id integer primary key auto_increment, -- arbitrary number for key change_id integer not null -- what change does this refer to? from_line integer not null, -- position in the NEW page image of change start to_line integer not null, -- position in the NEW page of change_end old_text longvarchar, -- text in the OLD page that was replaced constraint fk_diffs_change foreign key (change_id) references changes(change_id) ); create unique index idx_diffs on diffs (change_id, from_line desc); -- The key query to reconstruct an old version has to go through the changes -- starting from the most recent and go through the lines in reverse order. -- The metakit stuff is arond line 315 of db.tcl. SQL counterpart -- would be something like: select changes.version, diffs.from_line, diffs.to_line, diffs.old_text from changes, diffs where changes.page_id = :page_id and changes.version > :version and diffs.change_id = changes.change_id order by changes.version desc, diffs,from_line desc; -- How best to translate this sort of structure to mk?