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?