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 |