doc/fuse_db.sql
changeset 38 1fd4da071575
parent 37 c3880f3b4de8
child 40 03017f5f0087
equal deleted inserted replaced
37:c3880f3b4de8 38:1fd4da071575
    14 );
    14 );
    15 
    15 
    16 CREATE TABLE file_tree (
    16 CREATE TABLE file_tree (
    17     "offset" serial4 primary key, 
    17     "offset" serial4 primary key, 
    18     name varchar(256), 
    18     name varchar(256), 
    19     ino int4 references inodes(ino) NOT NULL UNIQUE,
    19     ino int4 references inodes(ino) NOT NULL,
    20     parent int4 references file_tree(ino)
    20     ino_dir int4 references inodes(ino),
       
    21     parent int4,
       
    22 
       
    23     CONSTRAINT file_tree_uniq_direntry UNIQUE (parent, name),
       
    24     CONSTRAINT file_tree_uniq_dir_ino UNIQUE (ino_dir),
       
    25     CONSTRAINT file_tree_exist_parent FOREIGN KEY (parent) REFERENCES file_tree(ino_dir)
    21 );
    26 );
    22 
    27 
    23 INSERT INTO inodes (ino, type, mode, data) VALUES 
    28 INSERT INTO inodes (ino, type, mode, data) VALUES 
    24     (1, 'DIR', 365, NULL),
    29     (1, 'DIR', 365, NULL),
    25     (2, 'REG', 292, lo_create(0));
    30     (2, 'REG', 292, lo_create(0));
    26 
    31 
    27 INSERT INTO file_tree (name, parent, ino) VALUES 
    32 INSERT INTO file_tree (name, parent, ino, ino_dir) VALUES 
    28     (NULL,  NULL,   1   ),
    33     (NULL,  NULL,   1,  1       ),
    29     ('foo', 1,      2   );
    34     ('foo', 1,      2,  NULL    );
    30 
    35 
    31 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);';
    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);';
    32 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);';
    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);';
    33 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);';
    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);';
    34 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;';
    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;';
    38         WHEN 'LNK' THEN char_length($3) 
    43         WHEN 'LNK' THEN char_length($3) 
    39         WHEN 'REG' THEN lo_size($2) 
    44         WHEN 'REG' THEN lo_size($2) 
    40         ELSE 0 
    45         ELSE 0 
    41     END;
    46     END;
    42 $$;
    47 $$;
       
    48 
       
    49 CREATE OR REPLACE FUNCTION dbfs_link (
       
    50     IN ino int4, IN new_parent int4, IN new_name varchar, 
       
    51     OUT ino int4, OUT type char(3), OUT mode int2, OUT size int4, OUT nlink int8
       
    52 ) LANGUAGE SQL VOLATILE AS $$
       
    53     INSERT INTO file_tree (name, ino, parent) VALUES ($3, $1, $2);
       
    54     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
       
    55      FROM inodes WHERE ino = $1;
       
    56 $$;