[Home] [Help]
PACKAGE BODY: SYSTEM.WPG_DOCLOAD
Source
1 PACKAGE BODY wpg_docload
2 AS
3
4 --
5 -- Private types and global variables
6 --
7 -- Warning: If you change the constraint values of any of the
8 -- following global variables, be sure to make the corresponding
9 -- change in pgdocs.sql
10 v_filename VARCHAR2(64);
11 v_bcaching BOOLEAN;
12 v_blob blob;
13 v_bfile bfile;
14
15
16 --
17 -- PROCEDURE:
18 -- download_file
19 -- DESCRIPTION:
20 -- Set the name of the file to be downloaded
21 -- PARAMS:
22 -- p_filename IN: name of the file to be downloaded
23 -- p_bcaching IN: browser caching enabled?
24 --
25 PROCEDURE download_file(p_filename IN VARCHAR2, p_bcaching IN BOOLEAN)
26 IS
27 BEGIN
28 v_blob := NULL;
29 v_bfile := NULL;
30 v_filename := p_filename;
31 v_bcaching := p_bcaching;
32 END download_file;
33
34 --
35 -- PROCEDURE:
36 -- download_file
37 -- DESCRIPTION:
38 -- Set the blob to be downloaded
39 -- PARAMS:
40 -- p_filename IN: the blob to be downloaded
41 -- NOTES: Because downloading BLOBs is more of a "self-service" operation,
42 -- automatic browser caching is not a feature, like it is for
43 -- document table downloads, therefore, no p_bcaching parameter.
44 --
45 PROCEDURE download_file(p_blob IN blob)
46 IS
47 e_invalid_lobloc EXCEPTION;
48 PRAGMA EXCEPTION_INIT(e_invalid_lobloc, -22275);
49 BEGIN
50 IF (p_blob IS NULL)
51 THEN
52 RAISE e_invalid_lobloc;
53 END IF;
54
55 v_blob := p_blob;
56 v_bfile := NULL;
57 v_filename := NULL;
58 v_bcaching := NULL;
59 END download_file;
60
61 --
62 -- PROCEDURE:
63 -- download_file
64 -- DESCRIPTION:
65 -- Set the bfile to be downloaded
66 -- PARAMS:
67 -- p_filename IN: the bfile to be downloaded
68 -- NOTES: Because downloading BFILEs is more of a "self-service" operation,
69 -- automatic browser caching is not a feature, like it is for
70 -- document table downloads, therefore, no p_bcaching parameter.
71 --
72 PROCEDURE download_file(p_bfile IN OUT bfile)
73 IS
74 dir_alias VARCHAR2(30) := NULL;
75 fname VARCHAR2(2000) := NULL;
76 len pls_integer;
77 BEGIN
78 dbms_lob.fileopen(p_bfile);
79 v_bfile := p_bfile;
80 v_blob := NULL;
81 v_filename := NULL;
82 v_bcaching := NULL;
83 EXCEPTION
84 WHEN OTHERS
85 THEN
86 v_bfile := NULL;
87 v_blob := NULL;
88 v_filename := NULL;
89 v_bcaching := NULL;
90 RAISE;
91 END download_file;
92
93 --
94 -- FUNCTION:
95 -- encode_parameter
96 -- DESCRIPTION:
97 -- Endcode the given parameters to be decoded by the gateway
98 -- PARAMS:
99 -- p_encode_param IN: parameter to encode
100 -- RETURN:
101 -- encoded parameter string
102 FUNCTION encode_parameter(p_encode_param IN VARCHAR2)
103 RETURN VARCHAR2
104 IS
105 param_size pls_integer;
106 BEGIN
107 param_size := LENGTH(p_encode_param);
108 IF (param_size IS NULL) THEN
109 param_size := 0;
110 END IF;
111 RETURN param_size||'X'||p_encode_param||'X';
112
113 END encode_parameter;
114
115 --
116 -- PROCEDURE:
117 -- get_content_length
118 -- DESCRIPTION:
119 -- Return the length of a lob to be downloaded
120 -- PARAMS:
121 -- none.
122 -- RETURN:
123 -- lob length
124 --
125 FUNCTION get_content_length
126 RETURN pls_integer
127 IS
128 BEGIN
129 IF (v_blob IS NOT NULL)
130 THEN
131 RETURN dbms_lob.getlength(v_blob);
132 ELSIF (v_bfile IS NOT NULL)
133 THEN
134 RETURN dbms_lob.getlength(v_bfile);
135 ELSE
136 RETURN NULL;
137 END IF;
138 END;
139
140 --
141 -- PROCEDURE:
142 -- get_download_blob
143 -- DESCRIPTION:
144 -- Return a BLOB to be downloaded to a browser.
145 -- PARAMS:
146 -- p_blob OUT: The blob to be downloaded
147 --
148 PROCEDURE get_download_blob(p_blob OUT blob)
149 IS
150 BEGIN
151 p_blob := v_blob;
152 v_blob := NULL;
153 END;
154
155 --
156 -- PROCEDURE:
157 -- get_download_bfile
158 -- DESCRIPTION:
159 -- Return a BFILE to be downloaded to a browser.
160 -- PARAMS:
161 -- p_blob OUT: The bfile to be downloaded
162 --
163 PROCEDURE get_download_bfile(p_bfile OUT bfile)
164 IS
165 BEGIN
166 p_bfile := v_bfile;
167 v_bfile := NULL;
168 END;
169
170 --
171 -- PROCEDURE:
172 -- get_download_file
173 -- DESCRIPTION:
174 -- Get the name,mimetype,etc. of the file to be downloaded.
175 -- For BLOB downloads, p_doc_info is just set to 'B'.
176 -- PARAMS:
177 -- p_doc_info OUT: encoded string containing:
178 -- filename, last_updated,mime_type,content_type,
179 -- dad_charset and doc_size for document table docs.
180 -- For BLOB downloads, it is set to 'B'.
181 --
182 PROCEDURE get_download_file(p_doc_info OUT VARCHAR2)
183 IS
184 e_missing_column EXCEPTION;
185 PRAGMA exception_init(e_missing_column, -904);
186 cursor_handle INTEGER;
187 retval INTEGER;
188 sql_stmt VARCHAR2(1024);
189 new_cols VARCHAR2(60);
190 old_cols VARCHAR2(25);
191 last_updated DATE;
192 mime_type VARCHAR2(48);
193 content_type VARCHAR2(128);
194 dad_charset VARCHAR2(256);
195 doc_size NUMBER;
196 mod_date DATE;
197 mod_since VARCHAR2(256);
198 pos pls_integer;
199 lpos pls_integer;
200 mod_len pls_integer;
201 last_updated_str VARCHAR2(128);
202 p_doctable VARCHAR2(316);
203
204 BEGIN
205 -- If we are being called by an old listener, just return the filename
206 IF (owa_util.get_cgi_env('GATEWAY_IVERSION') IS NULL)
207 THEN
208 p_doc_info := v_filename;
209 RETURN;
210 END IF;
211
212 -- For blob downloads, all we need to do is set p_doc_info to 'B'
213 IF (v_blob IS NOT NULL)
214 THEN
215 p_doc_info := 'B';
216 RETURN;
217 -- For bfile downloads, p_doc_info is set to 'F'
218 ELSIF (v_bfile IS NOT NULL)
219 THEN
220 p_doc_info := 'F';
221 RETURN;
222 END IF;
223
224 new_cols := 'LAST_UPDATED,MIME_TYPE,CONTENT_TYPE,DAD_CHARSET,DOC_SIZE';
225 old_cols := 'MIME_TYPE,DOC_SIZE';
226
227 cursor_handle := dbms_sys_sql.open_cursor;
228
229 p_doctable := owa_util.get_cgi_env('DOCUMENT_TABLE');
230 IF (p_doctable IS NULL) THEN
231 p_doctable := 'wwv_document';
232 END IF;
233
234 sql_stmt := 'select '||new_cols||' from '||p_doctable||
235 ' where NAME='''||v_filename||'''';
236 dbms_sys_sql.parse_as_user(cursor_handle, sql_stmt, dbms_sql.v7);
237
238 dbms_sys_sql.define_column(cursor_handle, 1, last_updated);
239 dbms_sys_sql.define_column(cursor_handle, 2, mime_type, 48);
240 dbms_sys_sql.define_column(cursor_handle, 3, content_type, 128);
241 dbms_sys_sql.define_column(cursor_handle, 4, dad_charset, 256);
242 dbms_sys_sql.define_column(cursor_handle, 5, doc_size);
243
244 retval := dbms_sys_sql.execute_and_fetch(cursor_handle,TRUE);
245
246 dbms_sys_sql.column_value(cursor_handle, 1, last_updated);
247 dbms_sys_sql.column_value(cursor_handle, 2, mime_type);
248 dbms_sys_sql.column_value(cursor_handle, 3, content_type);
249 dbms_sys_sql.column_value(cursor_handle, 4, dad_charset);
250 dbms_sys_sql.column_value(cursor_handle, 5, doc_size);
251
252 dbms_sys_sql.close_cursor(cursor_handle);
253
254 -- Determine if document has been modified
255 mod_since := owa_util.get_cgi_env('HTTP_IF_MODIFIED_SINCE');
256
257 IF (mod_since IS NOT NULL AND v_bcaching = true) THEN
258 pos := instr(mod_since, ';');
259 IF (pos > 0) THEN
260 lpos := instr(substr(mod_since,pos), 'length=');
261 IF (lpos > 0) THEN
262 mod_len := substr(mod_since,lpos+pos+6);
263 END IF;
264 mod_since := substr(mod_since,1,pos-1);
265 END IF;
266
267 BEGIN
268 mod_date := to_date(mod_since, 'Dy, DD Mon YYYY HH24:MI:SS "GMT"');
269 EXCEPTION
270 WHEN OTHERS THEN
271 BEGIN
272 mod_date := to_date(mod_since, 'Day, DD-Mon-YY HH24:MI:SS "GMT"');
273 EXCEPTION
274 WHEN OTHERS THEN
275 BEGIN
276 mod_date := to_date(mod_since, 'Day Mon DD HH24:MI:SS YYYY');
277 EXCEPTION
278 WHEN OTHERS THEN
279 NULL;
280 END;
281 END;
282 END;
283
284 IF (mod_date = last_updated) THEN
285 IF (mod_len IS NULL OR mod_len = doc_size) THEN
286 last_updated_str := 'NOT_MODIFIED';
287 ELSE
288 last_updated_str := to_char(last_updated,
289 'Dy, DD Mon YYYY HH24:MI:SS "GMT"');
290 END IF;
291 ELSE
292 last_updated_str := to_char(last_updated,
293 'Dy, DD Mon YYYY HH24:MI:SS "GMT"');
294 END IF;
295 ELSE
296 last_updated_str := to_char(last_updated,
297 'Dy, DD Mon YYYY HH24:MI:SS "GMT"');
298 END IF;
299
300
301 -- Set the doc_info string
302 p_doc_info := encode_parameter(v_filename);
303 p_doc_info := p_doc_info||encode_parameter(last_updated_str);
304 p_doc_info := p_doc_info||encode_parameter(mime_type);
305 p_doc_info := p_doc_info||encode_parameter(content_type);
306 p_doc_info := p_doc_info||encode_parameter(dad_charset);
307 p_doc_info := p_doc_info||encode_parameter(doc_size);
308
309 -- Clear the filename
310 v_filename := NULL;
311
312 EXCEPTION
313 -- looks like we have an old style document table
314 WHEN e_missing_column THEN
315 last_updated := NULL;
316 content_type := NULL;
317 dad_charset := NULL;
318
319 sql_stmt := 'select '||old_cols||' from '||p_doctable||
320 ' where NAME='''||v_filename||'''';
321 dbms_sys_sql.parse_as_user(cursor_handle, sql_stmt, dbms_sql.v7);
322
323 dbms_sys_sql.define_column(cursor_handle, 1, mime_type, 48);
324 dbms_sys_sql.define_column(cursor_handle, 2, doc_size);
325
326 retval := dbms_sys_sql.execute_and_fetch(cursor_handle,TRUE);
327 dbms_sys_sql.column_value(cursor_handle, 1, mime_type);
328 dbms_sys_sql.column_value(cursor_handle, 2, doc_size);
329
330 dbms_sys_sql.close_cursor(cursor_handle);
331
332 -- Set the doc_info string
333 p_doc_info := encode_parameter(v_filename);
334 p_doc_info := p_doc_info||encode_parameter(last_updated);
335 p_doc_info := p_doc_info||encode_parameter(mime_type);
336 p_doc_info := p_doc_info||encode_parameter(content_type);
337 p_doc_info := p_doc_info||encode_parameter(dad_charset);
338 p_doc_info := p_doc_info||encode_parameter(doc_size);
339
340 -- Clear the filename
341 v_filename := NULL;
342
343 WHEN OTHERS THEN
344 v_filename := NULL;
345 p_doc_info := NULL;
346 dbms_sys_sql.close_cursor(cursor_handle);
347
348 END get_download_file;
349
350 --
351 -- FUNCTION:
352 -- is_file_download
353 -- DESCRIPTION:
354 -- Is there a file to download?
355 -- PARAMS:
356 -- none.
357 -- RETURNS:
358 -- TRUE if there is a pending file download, FALSE otherwise.
359 --
360 FUNCTION is_file_download
361 RETURN BOOLEAN
362 IS
363 BEGIN
364 RETURN v_filename IS NOT NULL OR v_blob IS NOT NULL OR
365 v_bfile IS NOT NULL;
366 END is_file_download;
367
368 END wpg_docload;