Merge remote-tracking branch 'refs/remotes/mortenbra/master'

This commit is contained in:
eaolson 2016-07-23 15:21:27 -05:00
commit 3bffe1efb8
7 changed files with 110 additions and 93 deletions

View File

@ -522,7 +522,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
l_returnvalue.sequence_number := 1;
l_returnvalue.folder_id := flex_ws_api.parse_xml(l_xml, '//*/t:FolderId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.folder_id := flex_ws_api.parse_xml(l_xml, '//*/t:FolderId/@Id', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.display_name := flex_ws_api.parse_xml(l_xml, '//*/t:DisplayName/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.total_count := to_number(flex_ws_api.parse_xml(l_xml, '//*/t:TotalCount/text()', g_namespace_messages || ' ' || g_namespace_types));
l_returnvalue.child_folder_count := to_number(flex_ws_api.parse_xml(l_xml, '//*/t:ChildFolderCount/text()', g_namespace_messages || ' ' || g_namespace_types));
@ -831,8 +831,8 @@ begin
-- general Item info
l_returnvalue.sequence_number := 1;
l_returnvalue.item_id := flex_ws_api.parse_xml(l_xml, '//*/t:ItemId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.change_key := flex_ws_api.parse_xml(l_xml, '//*/t:ItemId/@ChangeKey/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.item_id := flex_ws_api.parse_xml(l_xml, '//*/t:ItemId/@Id', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.change_key := flex_ws_api.parse_xml(l_xml, '//*/t:ItemId/@ChangeKey', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.item_size := to_number(flex_ws_api.parse_xml(l_xml, '//*/t:Size/text()', g_namespace_messages || ' ' || g_namespace_types));
l_returnvalue.subject := flex_ws_api.parse_xml(l_xml, '//*/t:Subject/text()', g_namespace_messages || ' ' || g_namespace_types);
@ -1209,7 +1209,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
-- TODO: verify that ID is returned/parsed...
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:CalendarItem/t:ItemId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:CalendarItem/t:ItemId/@Id', g_namespace_messages || ' ' || g_namespace_types);
return l_returnvalue;
@ -1278,7 +1278,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
-- TODO: verify that ID is returned/parsed...
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:Task/t:ItemId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:Task/t:ItemId/@Id', g_namespace_messages || ' ' || g_namespace_types);
return l_returnvalue;
@ -1376,7 +1376,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
-- TODO: verify that ID is returned/parsed...
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:Message/t:ItemId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Items/t:Message/t:ItemId/@Id', g_namespace_messages || ' ' || g_namespace_types);
return l_returnvalue;
@ -1633,7 +1633,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
l_returnvalue.attachment_id := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:AttachmentId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.attachment_id := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:AttachmentId/@Id', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.name := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:Name/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.content_type := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:ContentType/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue.content_id := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:ContentId/text()', g_namespace_messages || ' ' || g_namespace_types);
@ -1706,7 +1706,7 @@ begin
l_xml := make_request (l_soap_action, get_request_envelope);
-- TODO: verify that value is returned...
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:AttachmentId/@Id/text()', g_namespace_messages || ' ' || g_namespace_types);
l_returnvalue := flex_ws_api.parse_xml(l_xml, '//*/m:Attachments/t:FileAttachment/t:AttachmentId/@Id', g_namespace_messages || ' ' || g_namespace_types);
return l_returnvalue;

View File

@ -58,6 +58,44 @@ begin
end get_xml;
function get_worksheets_list( p_xlsx in blob ) return t_xlsx_sheet_properties
as
l_returnvalue t_xlsx_sheet_properties;
l_xml xmltype;
begin
/*
Purpose: get an array of the worksheets in the workbook
Remarks:
Who Date Description
------ ---------- --------------------------------
JMW 02.03.2016 Created
*/
l_xml := get_xml( p_xlsx, 'xl/workbook.xml' );
select xml.r_id, xml.sheetid, xml.name
bulk collect into l_returnvalue
from xmltable( xmlnamespaces( default 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
'http://schemas.openxmlformats.org/officeDocument/2006/relationships' AS "r" ),
'/workbook/sheets/sheet'
passing l_xml
columns
r_id varchar2(255) path '@r:id',
sheetid number path '@sheetId',
name varchar2(31) path '@name' ) xml
where xml.r_id is not null
order by xml.sheetid;
return l_returnvalue;
end get_worksheets_list;
function get_docx_properties (p_docx in blob) return t_docx_properties
as
l_returnvalue t_docx_properties;
@ -208,7 +246,9 @@ begin
l_blob := zip_util_pkg.get_file (p_template, l_file_list(i));
if l_file_list(i) in ('word/document.xml', 'word/footer1.xml', 'xl/sharedStrings.xml') or (l_file_list(i) like 'ppt/slides/slide%.xml') then
if l_file_list(i) in ('word/document.xml', 'word/footer1.xml', 'xl/sharedStrings.xml')
or (l_file_list(i) like 'ppt/slides/slide%.xml')
or (l_file_list(i) like 'ppt/notesSlides/notesSlide%.xml') then
l_clob := sql_util_pkg.blob_to_clob (l_blob);
l_clob := string_util_pkg.multi_replace (l_clob, p_names, p_values);

View File

@ -77,7 +77,18 @@ as
);
type t_xlsx_sheet is table of t_xlsx_cell index by varchar2(20);
type t_xlsx_sheet_attributes is record (
r_id varchar2(255),
sheetid number,
name varchar2(31)
);
type t_xlsx_sheet_properties is table of t_xlsx_sheet_attributes index by pls_integer;
-- get list of xlsx worksheets
function get_worksheets_list( p_xlsx in blob ) return t_xlsx_sheet_properties;
-- get docx properties
function get_docx_properties (p_docx in blob) return t_docx_properties;

View File

@ -16,7 +16,7 @@ as
g_exp_bind_vars constant varchar2(255) := ':\w+';
g_exp_hyperlinks constant varchar2(255) := '<a href="[^"]+">[^<]+</a>';
g_exp_ip_addresses constant varchar2(255) := '(\d{1,3}\.){3}\d{1,3}';
g_exp_email_addresses constant varchar2(255) := '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}';
g_exp_email_addresses constant varchar2(255) := '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$';
g_exp_email_address_list constant varchar2(255) := '^((\s*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}\s*[,;:]){1,100}?)?(\s*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})*$';
g_exp_double_words constant varchar2(255) := ' ([A-Za-z]+) \1';
g_exp_cc_visa constant varchar2(255) := '^4[0-9]{12}(?:[0-9]{3})?$';

View File

@ -12,59 +12,9 @@ as
MBR 23.10.2011 Created
*/
function is_valid_email (p_value in varchar2) return boolean
as
l_dot_pos number;
l_at_pos number;
l_str_length number;
l_returnvalue boolean := true;
begin
/*
Purpose: returns true if value is valid email address
Remarks: Written by Anil Passi, see http://oracle.anilpassi.com/validate-email-pl-sql-2.html
Who Date Description
------ ---------- --------------------------------
MBR 23.10.2011 Created
MBR 26.10.2011 Added check against multiple at signs
*/
if p_value is null then
l_returnvalue := false;
else
l_dot_pos := instr(p_value, '.');
l_at_pos := instr(p_value, '@');
l_str_length := length(p_value);
if ((l_dot_pos = 0) or (l_at_pos = 0) or (l_dot_pos = l_at_pos + 1) or (l_at_pos = 1) or (l_at_pos = l_str_length) or (l_dot_pos = l_str_length)) then
l_returnvalue := false;
end if;
if instr(substr(p_value, l_at_pos), '.') = 0 then
l_returnvalue := false;
end if;
if instr(substr(p_value, l_at_pos + 1), '@') > 0 then
l_returnvalue := false;
end if;
end if;
return l_returnvalue;
end is_valid_email;
function is_valid_email2 (p_value in varchar2) return boolean
as
l_value varchar2(32000);
l_returnvalue boolean;
@ -79,19 +29,31 @@ begin
Who Date Description
------ ---------- --------------------------------
MBR 23.10.2011 Created
Tim N 01.04.2016 Enhancements
*/
if p_value is null then
l_returnvalue := false;
else
l_returnvalue := regexp_replace(p_value, regexp_util_pkg.g_exp_email_addresses, null) is null;
end if;
l_returnvalue := regexp_like(p_value, regexp_util_pkg.g_exp_email_addresses);
return l_returnvalue;
end is_valid_email;
function is_valid_email2 (p_value in varchar2) return boolean
as
begin
/*
Purpose: backward compatibility only
*/
return is_valid_email(p_value);
end is_valid_email2;
function is_valid_email_list (p_value in varchar2) return boolean
as
@ -107,17 +69,14 @@ begin
Who Date Description
------ ---------- --------------------------------
MBR 23.10.2011 Created
Tim N 01.04.2016 Enhancements
*/
if p_value is null then
l_returnvalue := false;
else
l_returnvalue := regexp_replace(p_value, regexp_util_pkg.g_exp_email_address_list, null) is null;
end if;
l_returnvalue := regexp_like(p_value, regexp_util_pkg.g_exp_email_address_list);
return l_returnvalue;
end is_valid_email_list;

View File

@ -19,7 +19,7 @@ as
-- returns true if value is valid email address
function is_valid_email2 (p_value in varchar2) return boolean;
-- returns true if value is valid email address list
function is_valid_email_list (p_value in varchar2) return boolean;

View File

@ -774,22 +774,29 @@ as
workbook.sheets( t_sheet ).autofilters( t_ind ).row_end := p_row_end;
end;
--
procedure add1xml
( p_excel in out nocopy blob
, p_filename varchar2
, p_xml clob
)
is
procedure add1xml
( p_excel in out nocopy blob
, p_filename varchar2
, p_xml clob
)
is
t_tmp blob;
begin
l_count binary_integer;
begin
dbms_lob.createtemporary( t_tmp, true );
for i in 0 .. trunc( length( p_xml ) / 4000 )
loop
dbms_lob.append( t_tmp, utl_i18n.string_to_raw( substr( p_xml, i * 4000 + 1, 4000 ), 'AL32UTF8' ) );
end loop;
add1file( p_excel, p_filename, t_tmp );
dbms_lob.freetemporary( t_tmp );
end;
l_count := trunc( length( p_xml ) / 4000 );
if mod( length( p_xml ), 4000 ) = 0 then
l_count := greatest(l_count - 1, 0);
end if;
for i in 0 .. l_count
loop
dbms_lob.append( t_tmp, utl_i18n.string_to_raw( substr( p_xml, i * 4000 + 1, 4000 ), 'AL32UTF8') );
end loop;
add1file( p_excel, p_filename, t_tmp );
dbms_lob.freetemporary( t_tmp );
end;
--
function finish
return blob