1.0 Beta Migration

Use one of the following scripts to migrate from RelStorage 1.0 beta to RelStorage 1.0. Alter the scripts to match the Python default encoding. For example, if ‘import sys; print sys.getdefaultencoding()’ says the encoding is “iso-8859-1”, change all occurrences of ‘UTF-8’ or ‘UTF8’ to ‘ISO-8859-1’.

PostgreSQL 8.3 (using the psql command):

ALTER TABLE transaction
    ALTER username TYPE BYTEA USING (convert_to(username, 'UTF-8')),
    ALTER description TYPE BYTEA USING (convert_to(description, 'UTF-8'));

PostgreSQL 8.2 and below (using the psql command):

ALTER TABLE transaction
    ALTER username TYPE BYTEA USING
        (decode(replace(convert(username, 'UTF-8'), '\\', '\\\\'), 'escape')),
    ALTER description TYPE BYTEA USING
        (decode(replace(convert(description, 'UTF-8'), '\\', '\\\\'), 'escape'));

MySQL (using the mysql command):

ALTER TABLE transaction
    MODIFY username BLOB NOT NULL,
    MODIFY description BLOB NOT NULL;

Oracle (using the sqlplus command):

ALTER TABLE transaction ADD (
    new_username    RAW(500),
    new_description RAW(2000),
    new_extension   RAW(2000));

UPDATE transaction
    SET new_username = UTL_I18N.STRING_TO_RAW(username, 'UTF8'),
        new_description = UTL_I18N.STRING_TO_RAW(description, 'UTF8'),
        new_extension = extension;

ALTER TABLE transaction DROP (username, description, extension);
ALTER TABLE transaction RENAME COLUMN new_username TO username;
ALTER TABLE transaction RENAME COLUMN new_description TO description;
ALTER TABLE transaction RENAME COLUMN new_extension TO extension;

Migration From PGStorage to RelStorage

PostgreSQL:

-- Migration from PGStorage to RelStorage

-- Do all the work in a transaction
BEGIN;

-- Remove the commit_order information (RelStorage has a better solution).
DROP SEQUENCE commit_seq;
ALTER TABLE transaction DROP commit_order;

-- Make the special transaction 0 match RelStorage
UPDATE transaction SET username='system',
  description='special transaction for object creation'
  WHERE tid = 0;

-- Add the MD5 column and some more constraints.
ALTER TABLE object_state
  ADD CONSTRAINT object_state_tid_check CHECK (tid > 0),
  ADD CONSTRAINT object_state_prev_tid_fkey FOREIGN KEY (prev_tid)
      REFERENCES transaction,
  ADD COLUMN md5 CHAR(32);
UPDATE object_state SET md5=md5(state) WHERE state IS NOT NULL;

-- Replace the temporary tables used for packing.
DROP TABLE pack_operation;
DROP TABLE pack_transaction;
DROP TABLE pack_keep;
DROP TABLE pack_garbage;
CREATE TABLE pack_lock ();
CREATE TABLE object_ref (
    zoid        BIGINT NOT NULL,
    tid         BIGINT NOT NULL,
    to_zoid     BIGINT NOT NULL
);
CREATE INDEX object_ref_from ON object_ref (zoid);
CREATE INDEX object_ref_tid ON object_ref (tid);
CREATE INDEX object_ref_to ON object_ref (to_zoid);
CREATE TABLE object_refs_added (
    tid         BIGINT NOT NULL PRIMARY KEY
);
CREATE TABLE pack_object (
    zoid        BIGINT NOT NULL PRIMARY KEY,
    keep        BOOLEAN NOT NULL,
    keep_tid    BIGINT
);
CREATE INDEX pack_object_keep_zoid ON pack_object (keep, zoid);

-- Now commit everything
COMMIT;