DBA Data[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;