|
  |
  |
  |
  |
    |
|
|   |
|
           
Extreme 5   Adding Hexadecimal Conversion Functionality IntroductionThe purpose of this technical note is two-fold:
This technical note will guide user through the steps that are needed to create one new function that will allow user to:
The respective function, built by using Empress SQL Persistent Stored
Module (PSM) technology, is named: id: -2147483647 TO_HEX(id): 80000001 data: SMALL INTEGER TO_HEX(data): 534d414c4c20494e5445474552 id: 2147483647 TO_HEX(id): 7fffffff data: BIG INTEGER TO_HEX(data): 42494720494e5445474552 ImplementationThe basic algorithm is as follows:
APPENDIXThe following script can be executed with EMPRESS RDBMS V8.62 installed on a UNIX system in order to acquire the above described functionality. #!/bin/sh
if [ -z $EMPRESSPATH ]
then
echo " This demo requires that EMPRESSPATH is set." exit 1
fi
cat > ./module.c < < EOM
#include < mscc.h> #include < usrfns.h> #include < stdio.h> #include < string.h> /*
*
* Par1: input: character data
* Par2: output: hexadecimal string
* Par3: control variable for input/output parameter 1
* Par4: control variable for output parameter 1
* Par5: status variable [whether or not function was alright, maxlength = 5]
* Par6: runtime name [filled in by Empress]
* Par7: external name of function [filled in by Empress]
* Par8: error message [maxlength is 256]
*/
GLOBAL_SHARED_FUNC void to_hex_char (
char* input_str,
char** out,
long* in_ctrl1,
long* out_ctrl1,
char* sqlstate,
char* rtname,
char* extname,
char* errmsg
)
{
char* buf int len int i int j /* Set the output to be null */
*out_ctrl1 = -1L *out = (char) 0 /* input_str should not be zero, but check just in case */
if (input_str == 0 & & *in_ctrl1 > = 0)
{
strcpy (sqlstate, " INPUT" ) strcpy (errmsg,
" Problem: INPUT string is null" ) return }
/* If the first parameter is null, just return null */
if (*in_ctrl1 == -1L)
{
strcpy (sqlstate, " INPUT" ) strcpy (errmsg,
" Problem: INPUT string is null" ) return }
/* We want to allocate enough space for hexadecimal string
* one input byte = 2 output bytes (ie: 5 = 05 ) */
len = strlen (input_str) buf = (char*) mspsm_malloc ((len *2) +1) *out_ctrl1 = 0L for (i = 0, j=0 i < len i++, j+=2)
{
sprintf (buf +j, " %2.2x" , *(input_str +i)) }
*out = buf }
/*
*
* Par1: input: integer data
* Par2: output: hexadecimal string
* Par3: control variable for input/output parameter 1
* Par4: control variable for output parameter 1
* Par5: status variable [whether or not function was okay, maxlength = 5]
* Par6: runtime name [filled in by Empress]
* Par7: external name of function [filled in by Empress]
* Par8: error message [maxlength is 256]
*/
GLOBAL_SHARED_FUNC void to_hex_int (
gen_integer input_num,
char** out,
long* in_ctrl1,
long* out_ctrl1,
char* sqlstate,
char* rtname,
char* extname,
char* errmsg
)
{
char* buf /* Set the output to be null */
*out_ctrl1 = -1L *out = (char) 0 /* If the first parameter is null, just return null */
if (*in_ctrl1 == -1L)
{
strcpy (sqlstate, " INPUT" ) strcpy (errmsg,
" Problem: INPUT integer is null" ) return }
/* one input byte = 2 output bytes (ie: 5 = 05 ) */
buf = (char*) mspsm_malloc ((sizeof(gen_integer) *2) +1) *out_ctrl1 = 0L if (input_num < = (unsigned long) 0xff)
sprintf (buf, " %2.2lx" , input_num) elif (input_num < = (unsigned long) 0xffff)
sprintf (buf, " %4.4lx" , input_num) elif (input_num < = (unsigned long) 0xffffff)
sprintf (buf, " %6.6lx" , input_num) elif (input_num < = (unsigned long) 0xffffffff)
sprintf (buf, " %8.8lx" , input_num) else
{
*out_ctrl1 = -1L buf[0] = '\0' }
*out = buf }
EOM
echo " Creating the shared object 'module.dll'." emppsmcc -o module.dll module.c
if [ -d db ]
then
echo " Removing 'db'" emprmdb db
fi
echo " Creating 'db'" empmkdb db
empbatch db < < EOM
!echo " Creating and defining module 'Hexadecimal'." CREATE MODULE Hexadecimal
FUNCTION to_hex (GENERIC CHAR)
RETURNS GENERIC CHAR
EXTERNAL NAME to_hex_char
PARAMETER STYLE SQL FUNCTION to_hex (GENERIC INTEGER)
RETURNS GENERIC CHAR
EXTERNAL NAME to_hex_int
PARAMETER STYLE SQL END MODULE CREATE TABLE t1 (id longinteger, data nlstext(80,1024,1024,1)) INSERT INTO t1 VALUES (
-2147483647, " SMALL INTEGER" ,
2147483647, " BIG INTEGER" ) UPDATE MODULE Hexadecimal FROM './module.dll' SELECT to_hex(id), id, to_hex(data), data FROM t1 LIST EOM
rm module.c module.dll
  |