doc/fuse_db.sql
changeset 62 07c14d83c698
parent 61 9f7ecf7bf699
child 63 76a782abddca
equal deleted inserted replaced
61:9f7ecf7bf699 62:07c14d83c698
     1 
       
     2 DROP TABLE IF EXISTS file_tree;
       
     3 DROP TABLE IF EXISTS inodes;
       
     4 DROP SEQUENCE IF EXISTS ino_seq;
       
     5 
       
     6 CREATE SEQUENCE ino_seq START 64;
       
     7 
       
     8 -- inodes
       
     9 CREATE TABLE inodes (
       
    10     ino int4 primary key DEFAULT nextval('ino_seq'::regclass), 
       
    11     type char(3) NOT NULL, 
       
    12     mode int2 NOT NULL, 
       
    13     data oid,
       
    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')
       
    19 );
       
    20 
       
    21 -- filesystem layout
       
    22 CREATE TABLE file_tree (
       
    23     "offset" serial4 primary key, 
       
    24     name varchar(256), 
       
    25     ino int4 references inodes(ino) NOT NULL,
       
    26     ino_dir int4 references inodes(ino),
       
    27     parent int4,
       
    28     
       
    29     -- structure
       
    30     CONSTRAINT file_tree_uniq_direntry UNIQUE (parent, name),
       
    31     CONSTRAINT file_tree_uniq_dir_ino UNIQUE (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)
       
    37 );
       
    38 
       
    39 INSERT INTO inodes (ino, type, mode, data) VALUES 
       
    40     (1, 'DIR', 365, NULL),
       
    41     (2, 'REG', 292, lo_create(0));
       
    42 
       
    43 INSERT INTO file_tree (name, parent, ino, ino_dir) VALUES 
       
    44     (NULL,  NULL,   1,  1       ),
       
    45     ('foo', 1,      2,  NULL    );
       
    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;';
       
    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);';
       
    53 CREATE OR REPLACE FUNCTION dbfs_size (type char, oid, link varchar) RETURNS int4 LANGUAGE SQL STABLE AS $$
       
    54     SELECT CASE $1 
       
    55         WHEN 'LNK' THEN char_length($3) 
       
    56         WHEN 'REG' THEN lo_size($2) 
       
    57         ELSE 0 
       
    58     END;
       
    59 $$;
       
    60 
       
    61 CREATE OR REPLACE FUNCTION dbfs_link (
       
    62     IN ino int4, IN new_parent int4, IN new_name varchar, 
       
    63     OUT ino int4, OUT type char(3), OUT mode int2, OUT size int4, OUT nlink int8
       
    64 ) LANGUAGE SQL VOLATILE AS $$
       
    65     INSERT INTO file_tree (name, ino, parent) VALUES ($3, $1, $2);
       
    66     SELECT ino, type, mode, dbfs_size(type, data, link_path) AS size, (SELECT COUNT(*) FROM inodes i LEFT JOIN file_tree ft ON (i.ino = ft.ino) WHERE i.ino = inodes.ino) AS nlink
       
    67      FROM inodes WHERE ino = $1;
       
    68 $$;