doc/fuse_db.sql
changeset 40 03017f5f0087
parent 38 1fd4da071575
equal deleted inserted replaced
39:7e655be2189a 40:03017f5f0087
     3 DROP TABLE IF EXISTS inodes;
     3 DROP TABLE IF EXISTS inodes;
     4 DROP SEQUENCE IF EXISTS ino_seq;
     4 DROP SEQUENCE IF EXISTS ino_seq;
     5 
     5 
     6 CREATE SEQUENCE ino_seq START 64;
     6 CREATE SEQUENCE ino_seq START 64;
     7 
     7 
       
     8 -- inodes
     8 CREATE TABLE inodes (
     9 CREATE TABLE inodes (
     9     ino int4 primary key DEFAULT nextval('ino_seq'::regclass), 
    10     ino int4 primary key DEFAULT nextval('ino_seq'::regclass), 
    10     type char(3) NOT NULL, 
    11     type char(3) NOT NULL, 
    11     mode int2 NOT NULL, 
    12     mode int2 NOT NULL, 
    12     data oid,
    13     data oid,
    13     link_path varchar(512)
    14     link_path varchar(512),
       
    15 
       
    16     -- sanity checks
       
    17     CONSTRAINT inodes_valid_reg CHECK (data IS NULL OR type = 'REG'),
       
    18     CONSTRAINT inodes_valid_lnk CHECK (link_path IS NULL OR type = 'LNK')
    14 );
    19 );
    15 
    20 
       
    21 -- filesystem layout
    16 CREATE TABLE file_tree (
    22 CREATE TABLE file_tree (
    17     "offset" serial4 primary key, 
    23     "offset" serial4 primary key, 
    18     name varchar(256), 
    24     name varchar(256), 
    19     ino int4 references inodes(ino) NOT NULL,
    25     ino int4 references inodes(ino) NOT NULL,
    20     ino_dir int4 references inodes(ino),
    26     ino_dir int4 references inodes(ino),
    21     parent int4,
    27     parent int4,
    22 
    28     
       
    29     -- structure
    23     CONSTRAINT file_tree_uniq_direntry UNIQUE (parent, name),
    30     CONSTRAINT file_tree_uniq_direntry UNIQUE (parent, name),
    24     CONSTRAINT file_tree_uniq_dir_ino UNIQUE (ino_dir),
    31     CONSTRAINT file_tree_uniq_dir_ino UNIQUE (ino_dir),
    25     CONSTRAINT file_tree_exist_parent FOREIGN KEY (parent) REFERENCES file_tree(ino_dir)
    32     CONSTRAINT file_tree_exist_parent FOREIGN KEY (parent) REFERENCES file_tree(ino_dir),
       
    33 
       
    34     -- sanity checks
       
    35     CONSTRAINT file_tree_valid_root CHECK ((parent IS NULL AND name IS NULL AND ino = 1) OR (name IS NOT NULL and parent IS NOT NULL AND ino != 1)),
       
    36     CONSTRAINT file_tree_valid_dir CHECK (ino_dir IS NULL OR ino_dir = ino)
    26 );
    37 );
    27 
    38 
    28 INSERT INTO inodes (ino, type, mode, data) VALUES 
    39 INSERT INTO inodes (ino, type, mode, data) VALUES 
    29     (1, 'DIR', 365, NULL),
    40     (1, 'DIR', 365, NULL),
    30     (2, 'REG', 292, lo_create(0));
    41     (2, 'REG', 292, lo_create(0));
    31 
    42 
    32 INSERT INTO file_tree (name, parent, ino, ino_dir) VALUES 
    43 INSERT INTO file_tree (name, parent, ino, ino_dir) VALUES 
    33     (NULL,  NULL,   1,  1       ),
    44     (NULL,  NULL,   1,  1       ),
    34     ('foo', 1,      2,  NULL    );
    45     ('foo', 1,      2,  NULL    );
    35 
    46 
       
    47 -- not sure how these work, I guess statements in functions aren't their own transactions
       
    48 CREATE OR REPLACE FUNCTION lo_pread_oid (IN obj oid, IN len int4, IN "off" int4) RETURNS bytea LANGUAGE SQL STRICT AS 'select lo_open($1, 393216); select lo_lseek(0, $3, 0); select loread(0, $2);';
       
    49 CREATE OR REPLACE FUNCTION lo_pwrite_oid (IN obj oid, IN buf bytea, IN "off" int4) RETURNS int4 LANGUAGE SQL STRICT AS 'select lo_open($1, 393216); select lo_lseek(0, $3, 0); select lowrite(0, $2);';
       
    50 
       
    51 CREATE OR REPLACE FUNCTION lo_otruncate (IN obj oid, IN len int4) RETURNS oid LANGUAGE SQL STRICT AS 'select lo_truncate(lo_open($1, 393216), $2); select $1;';
    36 CREATE OR REPLACE FUNCTION lo_size (oid) RETURNS int4 LANGUAGE SQL STABLE RETURNS NULL ON NULL INPUT AS 'select lo_lseek(lo_open($1, 262144), 0, 2);';
    52 CREATE OR REPLACE FUNCTION lo_size (oid) RETURNS int4 LANGUAGE SQL STABLE RETURNS NULL ON NULL INPUT AS 'select lo_lseek(lo_open($1, 262144), 0, 2);';
    37 CREATE OR REPLACE FUNCTION lo_pread (IN fd int4, IN len int4, IN "off" int4) RETURNS bytea LANGUAGE SQL STRICT AS 'select lo_lseek($1, $3, 0); select loread($1, $2);';
       
    38 CREATE OR REPLACE FUNCTION lo_pwrite (IN fd int4, IN buf bytea, IN "off" int4) RETURNS int4 LANGUAGE SQL STRICT AS 'select lo_lseek($1, $3, 0); select lowrite($1, $2);';
       
    39 CREATE OR REPLACE FUNCTION lo_otruncate (IN oid, IN len int4) RETURNS oid LANGUAGE SQL STRICT AS 'select lo_truncate(lo_open($1, 393216), $2); select $1;';
       
    40 
       
    41 CREATE OR REPLACE FUNCTION dbfs_size (type char, oid, link varchar) RETURNS int4 LANGUAGE SQL STABLE AS $$
    53 CREATE OR REPLACE FUNCTION dbfs_size (type char, oid, link varchar) RETURNS int4 LANGUAGE SQL STABLE AS $$
    42     SELECT CASE $1 
    54     SELECT CASE $1 
    43         WHEN 'LNK' THEN char_length($3) 
    55         WHEN 'LNK' THEN char_length($3) 
    44         WHEN 'REG' THEN lo_size($2) 
    56         WHEN 'REG' THEN lo_size($2) 
    45         ELSE 0 
    57         ELSE 0