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 $$; |