diff options
author | Andrejs Kozlovs <andrejs.kozlovs@zabbix.com> | 2020-11-06 16:43:56 +0300 |
---|---|---|
committer | Andrejs Kozlovs <andrejs.kozlovs@zabbix.com> | 2021-01-13 18:04:33 +0300 |
commit | d5227f7e35e40671d7f8ee4e5be4355cd0c23c4e (patch) | |
tree | 1cb9f34743023b69fbfded142d3ce6081c424da7 /misc | |
parent | d11e920cd7733444e962320ae236df85a5e65f47 (diff) |
....I..... [ZBXNEXT-6285] code review rework
Diffstat (limited to 'misc')
-rw-r--r-- | misc/images/images_oracle_end.txt | 2 | ||||
-rw-r--r-- | misc/images/images_oracle_start.txt | 79 | ||||
-rwxr-xr-x | misc/images/png_to_sql.sh | 18 |
3 files changed, 50 insertions, 49 deletions
diff --git a/misc/images/images_oracle_end.txt b/misc/images/images_oracle_end.txt index 6301f37e6d7..c8fe184512a 100644 --- a/misc/images/images_oracle_end.txt +++ b/misc/images/images_oracle_end.txt @@ -1,3 +1,3 @@ END; / -DROP FUNCTION base64decode; +DROP FUNCTION base64_decode; diff --git a/misc/images/images_oracle_start.txt b/misc/images/images_oracle_start.txt index 58815b8ee20..1c4308a242b 100644 --- a/misc/images/images_oracle_start.txt +++ b/misc/images/images_oracle_start.txt @@ -1,48 +1,49 @@ -CREATE OR REPLACE FUNCTION base64decode(p_clob CLOB) RETURN BLOB - IS - C_CHUNK_SIZE CONSTANT INTEGER := 12000; -- should be a multiple of 4 - C_NON_BASE64_SYM_PATTERN CONSTANT VARCHAR2(20) := '[^A-Za-z0-9+/]'; - l_chunk_buf VARCHAR2(12000); - l_chunk_b64_buf RAW(9000); - l_chunk_offset INTEGER := 1; - l_chunk_size INTEGER; - l_blob BLOB; +-- this function is taken from https://stackoverflow.com/questions/19539408/error-when-decoding-base-64-to-blob +CREATE OR REPLACE FUNCTION base64_decode(p_content CLOB) RETURN BLOB + IS + C_CHUNK_SIZE CONSTANT INTEGER := 12000; -- should be a multiple of 4 + C_NON_BASE64_SYM_PATTERN CONSTANT VARCHAR2(20) := '[^A-Za-z0-9+/]'; + l_chunk_buf VARCHAR2(12000); + l_chunk_b64_buf RAW(9000); + l_chunk_offset INTEGER := 1; + l_chunk_size INTEGER; + l_res BLOB; - FUNCTION get_next_full_base64_chunk(l_data CLOB, p_cur_pos IN OUT INTEGER, p_desired_size INTEGER, p_cur_size IN OUT INTEGER) RETURN VARCHAR2 IS - l_res VARCHAR2(12000); - l_tail_desired_size INTEGER; - BEGIN - l_res := dbms_lob.substr(l_data, p_desired_size, p_cur_pos); - p_cur_pos := p_cur_pos + p_desired_size; - IF l_res IS NULL THEN - RETURN NULL; - END IF; + FUNCTION get_next_full_base64_chunk(l_data CLOB, p_cur_pos IN OUT INTEGER, p_desired_size INTEGER, p_cur_size IN OUT INTEGER) RETURN VARCHAR2 IS + l_res VARCHAR2(12000); + l_tail_desired_size INTEGER; + BEGIN + l_res := dbms_lob.substr(l_data, p_desired_size, p_cur_pos); + p_cur_pos := p_cur_pos + p_desired_size; + IF l_res IS NULL THEN + RETURN NULL; + END IF; - l_res := regexp_replace(l_res, C_NON_BASE64_SYM_PATTERN, ''); - p_cur_size := p_cur_size + length(l_res); + l_res := regexp_replace(l_res, C_NON_BASE64_SYM_PATTERN, ''); + p_cur_size := p_cur_size + length(l_res); - l_tail_desired_size := 4 - mod(p_cur_size, 4); - IF l_tail_desired_size = 4 THEN - RETURN l_res; - ELSE - RETURN l_res || get_next_full_base64_chunk(l_data, p_cur_pos, l_tail_desired_size, p_cur_size); - END IF; - END; + l_tail_desired_size := 4 - mod(p_cur_size, 4); + IF l_tail_desired_size = 4 THEN + RETURN l_res; + ELSE + RETURN l_res || get_next_full_base64_chunk(l_data, p_cur_pos, l_tail_desired_size, p_cur_size); + END IF; + END; - BEGIN - dbms_lob.createtemporary(l_blob, false); + BEGIN + dbms_lob.createtemporary(l_res, false); - WHILE true - LOOP - l_chunk_size := 0; - l_chunk_buf := get_next_full_base64_chunk(p_clob, l_chunk_offset, C_CHUNK_SIZE, l_chunk_size); - EXIT WHEN l_chunk_buf IS NULL; - l_chunk_b64_buf := utl_encode.base64_decode(utl_raw.cast_to_raw(l_chunk_buf)); - dbms_lob.writeappend(l_blob, utl_raw.length(l_chunk_b64_buf), l_chunk_b64_buf); - END LOOP; + WHILE true + LOOP + l_chunk_size := 0; + l_chunk_buf := get_next_full_base64_chunk(p_content, l_chunk_offset, C_CHUNK_SIZE, l_chunk_size); + EXIT WHEN l_chunk_buf IS NULL; + l_chunk_b64_buf := utl_encode.base64_decode(utl_raw.cast_to_raw(l_chunk_buf)); + dbms_lob.writeappend(l_res, utl_raw.length(l_chunk_b64_buf), l_chunk_b64_buf); + END LOOP; - RETURN l_blob; - END; + RETURN l_res; + END; / DECLARE l_clob CLOB; diff --git a/misc/images/png_to_sql.sh b/misc/images/png_to_sql.sh index ddaa239a91f..ab2d53e8873 100755 --- a/misc/images/png_to_sql.sh +++ b/misc/images/png_to_sql.sh @@ -1,7 +1,7 @@ #!/bin/bash # A script to generate SQL from PNG images -# depends on hexdump +# depends on hexdump and base64 scriptdir="$(dirname $0)" pngdir="${1:-png_modern}" @@ -13,9 +13,9 @@ imagefile_pgsql="$sqlbasedir/postgresql/$imagefile" imagefile_sqlite3="$sqlbasedir/sqlite3/$imagefile" imagefile_oracle="$sqlbasedir/oracle/$imagefile" -oracle_sring_max=2048 +oracle_string_max=2048 oracle_line_max=15 -base64tmp=tmp_b64 +oracle_base64tmp=tmp_b64 for imagefile in "$imagefile_mysql" "$imagefile_pgsql" "$imagefile_sqlite3" "$imagefile_oracle"; do [[ -s "$imagefile" ]] && { @@ -36,22 +36,22 @@ for imagefile in $pngdir/*.png; do ((imagesdone++)) imagename="$(basename "${imagefile%.png}")" image_data=$(hexdump -ve '"" 1/1 "%02X"' "$imagefile") - base64 -w$oracle_sring_max "$imagefile" > $base64tmp - split -l$oracle_line_max $base64tmp $base64tmp - rm -rf $base64tmp # ----- MySQL echo "INSERT INTO \`images\` (\`imageid\`,\`imagetype\`,\`name\`,\`image\`) VALUES ($imagesdone,1,'$imagename',0x$image_data);" >> "$imagefile_mysql" # ----- PostgreSQL echo "INSERT INTO images (imageid,imagetype,name,image) VALUES ($imagesdone,1,'$imagename',decode('$image_data','hex'));" >> "$imagefile_pgsql" # ----- Oracle + base64 -w$oracle_string_max "$imagefile" > $oracle_base64tmp + split -l$oracle_line_max $oracle_base64tmp $oracle_base64tmp + rm -f $oracle_base64tmp echo -e "\tl_clob := EMPTY_CLOB();" >> "$imagefile_oracle" - for oracle_imagefile in $base64tmp*; do - image_data_oracle=$(cat "$oracle_imagefile") + for oracle_imagefile in $oracle_base64tmp*; do + image_data_oracle=$(grep "" "$oracle_imagefile") echo -e "\tl_clob := l_clob || '$image_data_oracle';" >> "$imagefile_oracle" rm -rf $oracle_imagefile done - echo -e "\tINSERT INTO images VALUES ($imagesdone,1,'$imagename',base64decode(l_clob));" >> "$imagefile_oracle" + echo -e "\tINSERT INTO images VALUES ($imagesdone,1,'$imagename',base64_decode(l_clob));" >> "$imagefile_oracle" # ----- SQLite echo "INSERT INTO images (imageid,imagetype,name,image) VALUES ($imagesdone,1,'$imagename','$image_data');" >> "$imagefile_sqlite3" |