|
|
|
|
|
|
|
|
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
|
|
Company |
Products |
Services |
Partners |
Media |
|
|
USA: 301-220-1919 Canada
& International: 905-513-8888 |
|||||