source: TI01-discovery/branches/ingestAutomation-upgrade/database/ingest_procedures.sql @ 3860

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery/branches/ingestAutomation-upgrade/database/ingest_procedures.sql@3860
Revision 3860, 4.8 KB checked in by cbyrom, 13 years ago (diff)

Add new function, escapeSpecialCharacters() to PostgresRecord? to correct
the input docs and moles docs - so that they don't feature exposed
apostrophes - to avoid errors when running the PL/SQL stuff.

Line 
1/*
2 * Procedures used by the DB code as part of the ingest process
3 *
4 * C Byrom Apr 08
5 *
6 */
7DROP FUNCTION add_document_to_history() CASCADE;
8CREATE FUNCTION add_document_to_history() RETURNS TRIGGER AS 
9$$
10    BEGIN
11        -- This inserts the currently stored information
12        -- into the original_document_history table
13                -- NB, only do this when we are not just incrementing the harvest count
14                IF OLD.harvest_count=NEW.harvest_count THEN
15                INSERT INTO original_document_history
16                SELECT * FROM original_document WHERE original_document_id=NEW.original_document_id;
17                END IF;
18                RETURN NEW;
19     END;
20$$ LANGUAGE 'plpgsql';
21
22DROP FUNCTION create_document(filename_in varchar(255), discovery_id_in varchar(255), 
23        doc_type_in text, original_document_in text) CASCADE;
24CREATE FUNCTION create_document(filename_in varchar(255), discovery_id_in varchar(255), 
25        doc_type_in text, original_document_in text) RETURNS integer AS 
26$$
27        DECLARE
28                db_id integer;
29    BEGIN
30        -- This inserts a new document into the DB
31        INSERT INTO ORIGINAL_DOCUMENT (original_document_id, original_document_filename, 
32            discovery_id, original_format, original_document, ts_vector, create_date, 
33                        harvest_count, scn) VALUES (
34            DEFAULT, filename_in, discovery_id_in, doc_type_in, original_document_in, 
35                        to_tsvector('english', original_document_in), current_timestamp, 1, 1);
36
37                SELECT original_document_id INTO db_id FROM ORIGINAL_DOCUMENT WHERE discovery_id = discovery_id_in;
38                RETURN db_id;
39     END;
40$$ LANGUAGE 'plpgsql';
41
42
43DROP FUNCTION update_document(original_document_id_in int, filename_in varchar(255), 
44        discovery_id_in varchar(255), doc_type_in text, original_document_in text, scn_in int) CASCADE;
45CREATE FUNCTION update_document(original_document_id_in int, filename_in varchar(255), 
46        discovery_id_in varchar(255), doc_type_in text, original_document_in text, scn_in int) 
47        RETURNS VOID AS 
48$$
49        DECLARE
50                scn_current integer;
51    BEGIN
52        -- This updates an existing document
53
54                -- check the scn is valid before an update is done
55                SELECT scn INTO scn_current FROM ORIGINAL_DOCUMENT WHERE 
56                        original_document_id = original_document_id_in;
57                IF scn_in <> scn_current THEN
58                        RAISE EXCEPTION 'Invalid SCN specified (current scn=%, specified scn=%) -
59                                implies record has been changed during update - exiting...', scn_current, scn_in;
60                END IF;
61
62        UPDATE ORIGINAL_DOCUMENT SET
63                        original_document_filename = filename_in,
64            discovery_id = discovery_id_in,
65                        original_format = doc_type_in,
66                        original_document = original_document_in,
67            ts_vector = to_tsvector('english', original_document_in),
68            update_date = current_timestamp, 
69                        harvest_count = 1,
70                        scn = scn_in + 1
71                        WHERE original_document_id = original_document_id_in;
72     END;
73$$ LANGUAGE 'plpgsql';
74
75
76DROP FUNCTION add_spatiotemporal_row(original_document_id_in int, north_in real, 
77        south_in real, west_in real, east_in real, start_time_in timestamp, 
78        end_time_in timestamp) CASCADE;
79CREATE FUNCTION add_spatiotemporal_row(original_document_id_in int, north_in real, 
80        south_in real, west_in real, east_in real, start_time_in timestamp, 
81        end_time_in timestamp) RETURNS void AS 
82$$
83        DECLARE
84                spatial_db_id integer := null;
85                temporal_db_id integer := null;
86                cmdStr text;
87
88    BEGIN
89        -- This inserts a new row in the spatial data table, if required
90                IF west_in is not null AND east_in is not null AND
91                        north_in is not null AND south_in is not null THEN
92
93                        cmdStr := 'INSERT INTO SPATIAL_DATA (spatial_data_id, geometry, create_date)
94                                VALUES (DEFAULT,
95                                SetSRID(''BOX3D(' || west_in || ' ' || south_in || ', ' || east_in || ' ' || 
96                                        north_in || ')''::box3d,4326),
97                                current_timestamp)'; 
98       
99                -- For debugging only
100                        --raise notice 'cmdStr is: %', cmdStr;
101
102                EXECUTE cmdStr;
103
104                        SELECT MAX(spatial_data_id) INTO spatial_db_id FROM SPATIAL_DATA;
105                        --RAISE NOTICE 'Spatial data added - with ID: %', spatial_db_id;
106                END IF;
107
108        -- This inserts a new row in the temporal data table, if required
109        IF start_time_in is not null OR end_time_in is not null THEN
110                INSERT INTO TEMPORAL_DATA (temporal_data_id, start_time, end_time, create_date) 
111                                VALUES (DEFAULT, start_time_in, end_time_in, current_timestamp);
112
113                        SELECT MAX(temporal_data_id) INTO temporal_db_id FROM TEMPORAL_DATA;
114                        --RAISE NOTICE 'Temporal data added - with ID: %', temporal_db_id;
115                END IF;
116
117                -- Now create row in link table
118                INSERT INTO SPATIAL_TEMPORAL_DATA (spatial_temporal_data_id, original_record_id,
119                        spatial_data_id, temporal_data_id, create_date) VALUES
120                        (DEFAULT, original_document_id_in, spatial_db_id, temporal_db_id, current_timestamp);
121               
122     END;
123$$ LANGUAGE 'plpgsql';
Note: See TracBrowser for help on using the repository browser.