MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/rdbms/admin/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/rdbms/admin/wpgdocb.sql

Rem
Rem $Header: wwg_src_1/admin/owa/wpgdocb.sql /main/14 2015/04/13 15:41:00 vtropash Exp $
Rem
Rem wpgdocb.sql
Rem
Rem Copyright (c) 1998, 2015, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem     wpgdocb.sql - PL/SQL Gateway Document upload/download package Body
Rem
Rem    NOTES
Rem     This file is used to implement document upload and download
Rem     features in the PL/SQL Gateway.
Rem    **IMPORTANT**
Rem     When making changes to this file, please remember to update
Rem     the v7 version of this file (wpgdocb7.sql) as well.
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem     vtropash   06/18/14 - co bug 17892420
Rem     akatti     03/22/05 - fix bug#3119039 define get_download_file_raw 
Rem     ehlee      08/31/04 - Increase filename length to 256 (bug#3840547)
Rem     pkapasi    11/06/01 - Fix latch contention (bug#2086519). Detabify
Rem     ehlee      02/08/01 - Fix NLS download problem (bug#1584353)
Rem     gcook      12/08/00 - Fixed cache file download bug (bug#1493770)
Rem     ehlee      09/06/00 - Fix last-modified date (bug#1398250) 
Rem     ehlee      08/31/00 - Fix for freeing temporary blobs (bug#1377860)
Rem     kmuthukk   04/19/00 - schema qualify dbms_sql calls since
Rem                           this package may be installed in OWA_PUBLIC.
Rem     rdecker    02/14/00 - fix for handling old listeners
Rem     kmuthukk   01/20/99 - update name/comments above.
Rem     rdecker    11/19/99 - fix null blob download bug
Rem     rdecker    11/18/99 - add bfile download support
Rem     rdecker    11/16/99 - add blob download support
Rem     rdecker    10/13/99 - fix parts table
Rem     rdecker    10/11/99 - enable/disable browser caching
Rem     rdecker    09/30/99 - http 1.1 browser caching support
Rem     rdecker    09/22/99 - phase 2 blob upload support
Rem     rdecker    09/14/99 - Created
Rem

CREATE OR replace PACKAGE BODY wpg_docload
AS 
 
  --
  -- Private types and global variables                       
  --
  -- Warning: If you change the constraint values of any of the
  -- following global variables, be sure to make the corresponding
  -- change in pgdocs.sql
  v_filename VARCHAR2(256);
  v_bcaching BOOLEAN;
  v_blob     blob;
  v_bfile    bfile;

  --
  -- PROCEDURE:
  --   download_file
  -- DESCRIPTION:
  --   Set the name of the file to be downloaded
  -- PARAMS:
  --   p_filename     IN: name of the file to be downloaded
  --   p_bcaching     IN: browser caching enabled?
  --
  PROCEDURE download_file(p_filename IN VARCHAR2, p_bcaching IN BOOLEAN)
  IS 
  BEGIN 
     v_blob := NULL;
     v_bfile := NULL;
     v_filename := p_filename;
     v_bcaching := p_bcaching;
  END download_file;
  
  --
  -- PROCEDURE:
  --   download_file
  -- DESCRIPTION:
  --   Set the blob to be downloaded
  -- PARAMS:
  --   p_filename     IN: the blob to be downloaded
  -- NOTES: Because downloading BLOBs is more of a "self-service" operation,
  --        automatic browser caching is not a feature, like it is for
  --        document table downloads, therefore, no p_bcaching parameter.
  --
  PROCEDURE download_file(p_blob IN OUT NOCOPY blob)
  IS 
     e_invalid_lobloc EXCEPTION;
     PRAGMA EXCEPTION_INIT(e_invalid_lobloc, -22275);
  BEGIN 
     IF (p_blob IS NULL)
     THEN
       RAISE e_invalid_lobloc;
     END IF;

     v_blob := p_blob;
     v_bfile := NULL;
     v_filename := NULL;
     v_bcaching := NULL;
  END download_file;
  
  --
  -- PROCEDURE:
  --   download_file
  -- DESCRIPTION:
  --   Set the bfile to be downloaded
  -- PARAMS:
  --   p_filename     IN: the bfile to be downloaded
  -- NOTES: Because downloading BFILEs is more of a "self-service" operation,
  --        automatic browser caching is not a feature, like it is for
  --        document table downloads, therefore, no p_bcaching parameter.
  --
  PROCEDURE download_file(p_bfile IN OUT bfile)
  IS 
     dir_alias VARCHAR2(30) := NULL;
     fname VARCHAR2(2000) := NULL;
     len pls_integer;
  BEGIN 
     dbms_lob.fileopen(p_bfile);
     v_bfile := p_bfile;
     v_blob := NULL;
     v_filename := NULL;
     v_bcaching := NULL;
  EXCEPTION
     WHEN OTHERS
     THEN
       v_bfile := NULL;
       v_blob := NULL;
       v_filename := NULL;
       v_bcaching := NULL;
       RAISE;
  END download_file;

  --
  -- FUNCTION:
  --   encode_parameter
  -- DESCRIPTION:
  --   Endcode the given parameters to be decoded by the gateway
  -- PARAMS:
  --   p_encode_param           IN: parameter to encode
  -- RETURN:
  --   encoded parameter string
  FUNCTION encode_parameter(p_encode_param IN VARCHAR2)
               RETURN VARCHAR2
  IS
     param_size pls_integer;
  BEGIN
     param_size := LENGTHB(p_encode_param);
     IF (param_size IS NULL) THEN
      param_size := 0;
     END IF;
     RETURN param_size||'X'||p_encode_param||'X';

  END encode_parameter;
  
  --
  -- PROCEDURE:
  --   get_content_length
  -- DESCRIPTION:
  --   Return the length of a lob to be downloaded
  -- PARAMS: 
  --   none.
  -- RETURN:
  --   lob length
  --
  FUNCTION get_content_length
    RETURN pls_integer
  IS 
  BEGIN
     IF (v_blob IS NOT NULL)
     THEN
        RETURN dbms_lob.getlength(v_blob);
     ELSIF (v_bfile IS NOT NULL)
     THEN
        RETURN dbms_lob.getlength(v_bfile);
     ELSE 
        RETURN NULL;
     END IF;
  END;
  
  --
  -- PROCEDURE:
  --   get_download_blob
  -- DESCRIPTION:
  --   Return a BLOB to be downloaded to a browser.
  -- PARAMS: 
  --   p_blob   OUT: The blob to be downloaded
  --
  PROCEDURE get_download_blob(p_blob OUT NOCOPY blob)
  IS 
  BEGIN
     p_blob := v_blob;
     IF dbms_lob.istemporary(v_blob) = 1 THEN
        dbms_lob.freetemporary(v_blob); 
     END IF;
     v_blob := NULL;
  END;
  
    --
  -- PROCEDURE:
  --   get_download_bfile
  -- DESCRIPTION:
  --   Return a BFILE to be downloaded to a browser.
  -- PARAMS: 
  --   p_blob   OUT: The bfile to be downloaded
  --
  PROCEDURE get_download_bfile(p_bfile OUT bfile)
  IS 
  BEGIN
     p_bfile := v_bfile;
     v_bfile := NULL;
  END;

  --
  -- PROCEDURE:
  --   get_download_file
  -- DESCRIPTION:
  --   Get the name,mimetype,etc. of the file to be downloaded.
  --   For BLOB downloads, p_doc_info is just set to 'B'.
  -- PARAMS:
  --   p_doc_info  OUT: encoded string containing:
  --                    filename, last_updated,mime_type,content_type,
  --                    dad_charset and doc_size for document table docs.
  --                    For BLOB downloads, it is set to 'B'.
  --
  PROCEDURE get_download_file(p_doc_info OUT VARCHAR2)
  IS 
    e_missing_column EXCEPTION;
    PRAGMA exception_init(e_missing_column, -904);
    cursor_handle INTEGER;
    retval INTEGER;
    sql_stmt VARCHAR2(1024);
    new_cols VARCHAR2(60);
    old_cols VARCHAR2(25);
    last_updated DATE; 
    mime_type VARCHAR2(48);
    content_type VARCHAR2(128);
    dad_charset VARCHAR2(256);
    doc_size NUMBER;
    mod_date DATE;
    mod_since VARCHAR2(256);
    pos pls_integer;
    lpos pls_integer;
    mod_len pls_integer;
    last_updated_str VARCHAR2(128);
    p_doctable VARCHAR2(316);
    
  BEGIN 
    -- If we are being called by an old listener, just return the filename
    IF (owa_util.get_cgi_env('GATEWAY_IVERSION') IS NULL)
    THEN
       p_doc_info := v_filename;
       RETURN;
    END IF;

    -- For blob downloads, all we need to do is set p_doc_info to 'B'
    IF (v_blob IS NOT NULL)
    THEN
       p_doc_info := 'B';
       RETURN;
    -- For bfile downloads, p_doc_info is set to 'F'
    ELSIF (v_bfile IS NOT NULL)
    THEN
       p_doc_info := 'F';
       RETURN;
    END IF;
    
    new_cols := 'LAST_UPDATED,MIME_TYPE,CONTENT_TYPE,DAD_CHARSET,DOC_SIZE';
    old_cols := 'MIME_TYPE,DOC_SIZE';

    cursor_handle := sys.dbms_sql.open_cursor;
    
    p_doctable := owa_util.get_cgi_env('DOCUMENT_TABLE');
    IF (p_doctable IS NULL) THEN
       p_doctable := 'wwv_document';
    END IF;
    
    sql_stmt := 'select '||new_cols||' from '||dbms_assert.qualified_sql_name(p_doctable)||
      ' where NAME=:docname';

    sys.dbms_sql.parse(cursor_handle, sql_stmt, dbms_sql.v7);

    sys.dbms_sql.define_column(cursor_handle, 1, last_updated);
    sys.dbms_sql.define_column(cursor_handle, 2, mime_type, 48);
    sys.dbms_sql.define_column(cursor_handle, 3, content_type, 128);
    sys.dbms_sql.define_column(cursor_handle, 4, dad_charset, 256);
    sys.dbms_sql.define_column(cursor_handle, 5, doc_size);
    sys.dbms_sql.bind_variable(cursor_handle, ':docname', v_filename);

    retval := sys.dbms_sql.execute_and_fetch(cursor_handle,TRUE);

    sys.dbms_sql.column_value(cursor_handle, 1, last_updated);
    sys.dbms_sql.column_value(cursor_handle, 2, mime_type);
    sys.dbms_sql.column_value(cursor_handle, 3, content_type);
    sys.dbms_sql.column_value(cursor_handle, 4, dad_charset);
    sys.dbms_sql.column_value(cursor_handle, 5, doc_size);
    
    sys.dbms_sql.close_cursor(cursor_handle);
    

    -- Determine if document has been modified
    mod_since := owa_util.get_cgi_env('HTTP_IF_MODIFIED_SINCE');
    
    IF (mod_since IS NOT NULL AND v_bcaching = true) THEN 
       pos := instr(mod_since, ';');
       IF (pos > 0) THEN 
          lpos := instr(substr(mod_since,pos), 'length=');
          IF (lpos > 0) THEN 
             mod_len := substr(mod_since,lpos+pos+6);
          END IF; 
          mod_since := substr(mod_since,1,pos-1);
       END IF;

       BEGIN
          mod_date := to_date(mod_since, 'Dy, DD Mon YYYY HH24:MI:SS "GMT"');
       EXCEPTION 
         WHEN OTHERS THEN 
         BEGIN 
            mod_date := to_date(mod_since, 'Day, DD-Mon-YY HH24:MI:SS "GMT"');
            EXCEPTION
               WHEN OTHERS THEN 
               BEGIN
                  mod_date := to_date(mod_since, 'Day Mon DD HH24:MI:SS YYYY');
                  EXCEPTION
                     WHEN OTHERS THEN
                  NULL;
               END;
            END;
       END;
  
       IF (mod_date = last_updated) THEN
         IF (mod_len IS NULL OR mod_len = doc_size) THEN
            last_updated_str := 'NOT_MODIFIED';
         ELSE
            last_updated_str := to_char(last_updated,
               'Dy, DD Mon YYYY HH24:MI:SS "GMT"',
               'NLS_DATE_LANGUAGE = American');
         END IF;
       ELSE
         last_updated_str := to_char(last_updated,
            'Dy, DD Mon YYYY HH24:MI:SS "GMT"',
            'NLS_DATE_LANGUAGE = American');
       END IF;
    ELSE 
       IF (v_bcaching = TRUE) THEN
         last_updated_str := to_char(last_updated,
             'Dy, DD Mon YYYY HH24:MI:SS "GMT"',
         'NLS_DATE_LANGUAGE = American');
       ELSE
         last_updated_str := NULL;
       END IF;
    END IF;
    

    -- Set the doc_info string
    p_doc_info := encode_parameter(v_filename);
    p_doc_info := p_doc_info||encode_parameter(last_updated_str);
    p_doc_info := p_doc_info||encode_parameter(mime_type);
    p_doc_info := p_doc_info||encode_parameter(content_type);
    p_doc_info := p_doc_info||encode_parameter(dad_charset);
    p_doc_info := p_doc_info||encode_parameter(doc_size);
    
    -- Clear the filename
    v_filename := NULL;

  EXCEPTION
     -- looks like we have an old style document table
     WHEN e_missing_column THEN
       last_updated := NULL;
       content_type := NULL;
       dad_charset := NULL;

       sql_stmt := 'select '||old_cols||' from '|| 
            dbms_assert.qualified_sql_name(p_doctable) ||
            ' where NAME=:docname';
       sys.dbms_sql.parse(cursor_handle, sql_stmt, dbms_sql.v7);

       sys.dbms_sql.define_column(cursor_handle, 1, mime_type, 48);
       sys.dbms_sql.define_column(cursor_handle, 2, doc_size);
       sys.dbms_sql.bind_variable(cursor_handle, ':docname', v_filename);

       retval := sys.dbms_sql.execute_and_fetch(cursor_handle,TRUE);
       sys.dbms_sql.column_value(cursor_handle, 1, mime_type);
       sys.dbms_sql.column_value(cursor_handle, 2, doc_size);
    
       sys.dbms_sql.close_cursor(cursor_handle);
       
       -- Set the doc_info string
       p_doc_info := encode_parameter(v_filename);
       p_doc_info := p_doc_info||encode_parameter(last_updated);
       p_doc_info := p_doc_info||encode_parameter(mime_type);
       p_doc_info := p_doc_info||encode_parameter(content_type);
       p_doc_info := p_doc_info||encode_parameter(dad_charset);
       p_doc_info := p_doc_info||encode_parameter(doc_size);
    
       -- Clear the filename
       v_filename := NULL;

     WHEN OTHERS THEN
      v_filename := NULL;
      p_doc_info := NULL;
      sys.dbms_sql.close_cursor(cursor_handle);

  END get_download_file;

  --
  -- PROCEDURE:
  --   get_download_file_raw
  -- DESCRIPTION:
  --   Bug 3119039 This API is used to return doc_info as RAW type
  --   to bypass any character set conversion.
  --   Get the name,mimetype,etc. of the file to be downloaded.
  --   For BLOB downloads, p_doc_info is just set to 'B'.
  -- PARAMS:
  --   p_doc_info  OUT: encoded string containing:
  --                    filename, last_updated,mime_type,content_type,
  --                    dad_charset and doc_size for document table docs.
  --                    For BLOB downloads, it is set to 'B'.
  --
  PROCEDURE get_download_file_raw(p_doc_info OUT raw)
  IS 
    t_doc_info VARCHAR2(4000);
    
  BEGIN 
    get_download_file(t_doc_info);

    p_doc_info := UTL_RAW.CAST_TO_RAW(t_doc_info);

  END get_download_file_raw;

  --
  -- FUNCTION:
  --   is_file_download
  -- DESCRIPTION:
  --   Is there a file to download?
  -- PARAMS:
  --   none.
  -- RETURNS:
  --   TRUE if there is a pending file download, FALSE otherwise.
  --
  FUNCTION is_file_download 
    RETURN  BOOLEAN 
  IS 
  BEGIN 
     RETURN v_filename IS NOT NULL OR v_blob IS NOT NULL OR
       v_bfile IS NOT NULL;
  END is_file_download;

END wpg_docload;
/

show errors

OHA YOOOO