/* ** Title: Strings ** SCCSid: %W% %E% %U% ** CCid: %W% %E% %U% ** Author: Informix Software, Inc. ** Created: 06/11/1998 14:51 ** Description: This is the generated 'C' file for the Strings DataBlade. ** Comments: Generated for project Strings.3.6 */ /* ** The following is placed here to insure ** that name "mangling" does not occur. */ #ifdef __cplusplus extern "C" { #endif /* Standard library includes. */ #include #include #include #include /* Used by Informix GLS routines. */ #include /* Include when accessing the Informix API. */ #include /* This is the project include file. */ #include "Strings.h" #ifdef max #undef max #endif #define max(a,b) (((a) > (b)) ? (a) : (b)) #ifdef min #undef min #endif #define min(a,b) (((a) < (b)) ? (a) : (b)) /* Headers used by the compression routines. */ #include "lobitio.h" #include "errhand.h" /* Function prototypes. */ mi_integer Len( mi_lvarchar * String1, MI_FPARAM * Gen_fparam ); mi_lvarchar * LTrim( mi_lvarchar * String1, MI_FPARAM * Gen_fparam ); mi_lvarchar * Mid( mi_lvarchar * String1, mi_integer Start, mi_integer Len, MI_FPARAM * Gen_fparam ); mi_lvarchar * RTrim( mi_lvarchar * String1, MI_FPARAM * Gen_fparam ); void CompressStr( char * input, BIT_FILE * output, long ); void ExpandStr( BIT_FILE * input, char * output ); /* {{FUNCTION(a9e91f59-f895-11d0-8885-00a0c9255cf3) (MergeSection) */ /**************************************************************** ** ** Function name: ** ** CompressedStrAssign ** ** Description: ** ** This function is called when rows are inserted into the a table. ** You can provide special handling for the CompressedStr type here. ** Since the CompressedStr type contains an MI_LO_HANDLE attribute, code is ** supplied here to maintain its reference count. This insures ** that the large object is not dropped while a record in the ** database stores a pointer to it. ** ** The assign and destroy functions must be present if the input ** or output functions are used. Missing this function will cause ** SmartBlob error 12059. ** ** Special Comments: ** ** Support routine for opaque type CompressedStr returns CompressedStr. ** ** Parameters: ** ** CompressedStr * Gen_param1; Pointer to the input text. ** MI_FPARAM * Gen_fparam; Standard info - see DBDK docs. ** ** Return value: ** ** CompressedStr * The constructed UDT value. ** ** History: ** ** 06/11/1998 - Generated by BladeSmith Version 3.60.TC1B1. ** ** Identification: ** ** Warning: Do not remove or modify this comment: ** CompressedStrAssign FunctionId: a9e91f59-f895-11d0-8885-00a0c9255cf3 ** ***************************************************************** */ CompressedStr * CompressedStrAssign ( CompressedStr * Gen_param1, /* The UDT value. */ MI_FPARAM * Gen_fparam /* Standard info - see DBDK docs. */ ) { MI_CONNECTION * Gen_Con; /* The current connection. */ CompressedStr * Gen_InData; /* The input UDT value. */ /* Get the current connection handle. */ Gen_Con = mi_open( NULL, NULL, NULL ); /* Verify that the connection has been established. */ if( Gen_Con == 0 ) { /* ** Opening the current connection has failed ** so issue the following message and quit. ** ** "Connection has failed in CompressedStrAssign." */ DBDK_TRACE_ERROR( "CompressedStrAssign", ERRORMESG1, 10 ); /* not reached */ } /* Point to the input data. */ Gen_InData = Gen_param1; /* If the LO is valid ... */ if( mi_lo_validate( Gen_Con, &Gen_InData->StringFilename ) == 0 ) { /* ... increment its reference count. */ mi_lo_increfcount( Gen_Con, &Gen_InData->StringFilename ); } /* Close the connection. */ mi_close( Gen_Con ); return Gen_InData; } /* }}FUNCTION (#U3VUK9ON) */ /* {{FUNCTION(a9e91f5a-f895-11d0-8885-00a0c9255cf3) (MergeSection) */ /**************************************************************** ** ** Function name: ** ** CompressedStrDestroy ** ** Description: ** ** This function is called when rows are removed from the a table. ** You can provide special handling for the CompressedStr type here. ** Since the CompressedStr type contains a MI_LO_HANDLE attribute, code is ** supplied here to maintain its reference count. This insures ** that the large object is not dropped while a record in the ** database stores a pointer to it. ** ** The assign and destroy functions must be present if the input ** or output functions are used. Missing this function will cause ** SmartBlob error 12059. ** ** Special Comments: ** ** Support routine for opaque type CompressedStr returns void. ** ** Parameters: ** ** CompressedStr * Gen_param1; Pointer to the input text. ** MI_FPARAM * Gen_fparam; Standard info - see DBDK docs. ** ** Return value: ** ** CompressedStr * The constructed UDT value. ** ** History: ** ** 06/11/1998 - Generated by BladeSmith Version 3.60.TC1B1. ** ** Identification: ** ** Warning: Do not remove or modify this comment: ** CompressedStrDestroy FunctionId: a9e91f5a-f895-11d0-8885-00a0c9255cf3 ** ***************************************************************** */ void CompressedStrDestroy ( CompressedStr * Gen_param1, /* The UDT value. */ MI_FPARAM * Gen_fparam /* Standard info - see DBDK docs. */ ) { MI_CONNECTION * Gen_Con; /* The current connection. */ CompressedStr * Gen_InData; /* The input UDT value. */ /* Get the current connection handle. */ Gen_Con = mi_open( NULL, NULL, NULL ); /* Verify that the connection has been established. */ if( Gen_Con == 0 ) { /* ** Opening the current connection has failed ** so issue the following message and quit. ** ** "Connection has failed in CompressedStrDestroy." */ DBDK_TRACE_ERROR( "CompressedStrDestroy", ERRORMESG1, 10 ); /* not reached */ } /* Point to the input data. */ Gen_InData = Gen_param1; /* If the LO is valid ... */ if( mi_lo_validate( Gen_Con, &Gen_InData->StringFilename ) == 0 ) { /* ... decrement its reference count. */ mi_lo_decrefcount( Gen_Con, &Gen_InData->StringFilename ); } /* Close the connection. */ mi_close( Gen_Con ); } /* }}FUNCTION (#OFATPKPF) */ /* {{FUNCTION(a9e91f5b-f895-11d0-8885-00a0c9255cf3) (MergeSection) */ /**************************************************************** ** ** Function name: ** ** CompressedStrLOhandles ** ** Description: ** ** Special Comments: ** ** Support routine for opaque type CompressedStr returns mi_bitvarying. ** ** Parameters: ** ** CompressedStr * Gen_param1; Pointer to the input text. ** MI_FPARAM * Gen_fparam; Standard info - see DBDK docs. ** ** Return value: ** ** mi_bitvarying * The constructed UDT value. ** ** History: ** ** 06/11/1998 - Generated by BladeSmith Version 3.60.TC1B1. ** ** Identification: ** ** Warning: Do not remove or modify this comment: ** CompressedStrLOhandles FunctionId: a9e91f5b-f895-11d0-8885-00a0c9255cf3 ** ***************************************************************** */ mi_bitvarying * CompressedStrLOhandles ( CompressedStr * Gen_param1, /* The UDT value. */ MI_FPARAM * Gen_fparam /* Standard info - see DBDK docs. */ ) { MI_CONNECTION * Gen_Con; /* The current connection. */ CompressedStr * Gen_InData; /* The UDT value. */ MI_LO_LIST * Gen_OutData; /* Point to the output table. */ mi_integer Gen_nLOs; /* Number of LOs in UDT. */ mi_integer Gen_LOno; /* Index into the table. */ mi_bitvarying * Gen_RetVal; /* "Array" of LO handles. */ /* Get the current connection handle. */ Gen_Con = mi_open( NULL, NULL, NULL ); /* Verify that the connection has been established. */ if( Gen_Con == 0 ) { /* ** Opening the current connection has failed ** so issue the following message and quit. ** ** "Connection has failed in CompressedStrLOhandles." */ DBDK_TRACE_ERROR( "CompressedStrLOhandles", ERRORMESG1, 10 ); /* not reached */ } /* Point to the input data. */ Gen_InData = Gen_param1; /* Initialize the number of LO handles that are valid. */ Gen_LOno = Gen_nLOs = 0; /* ** Validate any LO before using it. LOs ** with invalid handles are simply ignored. */ /* If the LO is valid ... */ if( mi_lo_validate( Gen_Con, &Gen_InData->StringFilename ) == 0 ) { /* Add it to the count. */ Gen_nLOs++; } /* ** If there are any large objects, ** add them to the return array. */ if( Gen_nLOs ) { /* ** Allocate the return array. This will be a variable ** length array of large object handles. */ Gen_RetVal = (mi_bitvarying *)mi_new_var( sizeof(mi_integer) + Gen_nLOs * DBDK_LOHSIZE ); if( Gen_RetVal == 0 ) { /* ** Memory allocation has failed so issue ** the following message and quit. ** ** "Memory allocation has failed in CompressedStrLOhandles." */ DBDK_TRACE_ERROR( "CompressedStrLOhandles", ERRORMESG2, 10 ); /* not reached */ } /* Point to the output LO table. */ Gen_OutData = (MI_LO_LIST *)mi_get_vardata( (mi_lvarchar *)Gen_RetVal ); /* ** Validate any LO before using it. LOs ** with invalid handles are simply ignored. */ /* If the LO is valid ... */ if( mi_lo_validate( Gen_Con, &Gen_InData->StringFilename ) == 0 ) { /* Save it. */ memcpy( &Gen_OutData->lol_handles[Gen_LOno++], &Gen_InData->StringFilename, DBDK_LOHSIZE ); } /* Save the number of LOs in the return structure. */ Gen_OutData->lol_cnt = Gen_LOno; /* Close the connection. */ mi_close( Gen_Con ); /* Return the array of LO handles. */ return Gen_RetVal; } else { /* Close the connection. */ mi_close( Gen_Con ); /* Return failure. */ return 0; } } /* }}FUNCTION (#L8GATGII) */ /* {{FUNCTION(a9e91f53-f895-11d0-8885-00a0c9255cf3) (MergeSection) */ /**************************************************************** ** ** Function name: ** ** CompressedStrInput ** ** Description: ** ** This function converts from the external representation of the ** UDT type CompressedStr to its internal representation. The external ** representation is a blank-separated list of values and the ** internal representation is a 'C' structure of type CompressedStr as ** defined in the header file. ** ** Data may be inserted into a table using an SQL insert statement: ** ** insert into tablename values ( 'value-list' ); ** ** value-list is a space-delimited list of values. ** ** Values for large objects are the large object's file name. ** The file name must be enclosed in double quotes (i.e., "). ** ** Special Comments: ** ** Support routine for opaque type CompressedStr returns CompressedStr. ** ** Parameters: ** ** mi_lvarchar * Gen_param1; Pointer to the input text. ** MI_FPARAM * Gen_fparam; Standard info - see DBDK docs. ** ** Return value: ** ** CompressedStr * The constructed UDT value. ** ** History: ** ** Jul 09, 1997 - Generated by BladeSmith Version 3.50.626. ** ** Identification: ** ** Warning: Do not remove or modify this comment: ** CompressedStrInput FunctionId: a9e91f53-f895-11d0-8885-00a0c9255cf3 ** ***************************************************************** */ CompressedStr * CompressedStrInput ( mi_lvarchar * Gen_param1, /* Pointer to the input text. */ MI_FPARAM * Gen_fparam /* Standard info - see DBDK docs. */ ) { MI_CONNECTION * Gen_Con; /* The current connection. */ gl_mchar_t * Gen_InData; /* Pointer to the input data. */ CompressedStr * Gen_OutData; /* Pointer to the output data. */ mi_integer Gen_DataLen; /* Length of the data in bytes. */ CompressedStr * Gen_RetVal; /* The return value. */ char Gen_LOFile[FILENAME_MAX];/* Store the file name here. */ MI_LODESC Gen_LoDesc; /* Large object descriptor. */ MI_LOSTAT * mi_stat; mi_int8 FileStart; long Size; mi_lvarchar * InFile; mi_lvarchar * OutFile; BIT_FILE * OutFd; BIT_FILE * InFd; /* Get the current connection handle. */ Gen_Con = mi_open( NULL, NULL, NULL ); /* Verify that the connection has been established. */ if( Gen_Con == 0 ) { /* ** Opening the current connection has failed ** so issue the following message and quit. ** ** "Connection has failed in CompressedStrInput." */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG1, 10 ); /* not reached */ } /* ** Write to the trace file indicating ** that CompressedStrInput has been called. */ DBDK_TRACE_ENTER( "CompressedStrInput" ); /* Allocate memory room to build the UDT in. */ Gen_RetVal = (CompressedStr *)mi_alloc( sizeof( CompressedStr ) ); if( Gen_RetVal == 0 ) { /* ** Memory allocation has failed so issue ** the following message and quit. ** ** "Memory allocation has failed in CompressedStrInput." */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 10 ); /* not reached */ } /* Point to the input data. */ Gen_InData = (gl_mchar_t *)mi_get_vardata( Gen_param1 ); /* Point to the output data. */ Gen_OutData = (CompressedStr *)Gen_RetVal; /* Get the length of the input string. */ Gen_DataLen = mi_get_varlen( Gen_param1 ); /* Get the data value for Gen_OutData->StringFilename. */ Gen_InData = Gen_sscanf( Gen_Con, "CompressedStrInput", Gen_InData, mi_get_varlen( Gen_param1 ), sizeof(Gen_LOFile)-1, "%s %n", Gen_LOFile ); /* Load the large object from the file. */ Gen_LoadLOFromFile( Gen_Con, "CompressedStrInput", Gen_LOFile, &Gen_OutData->StringFilename ); /* ** Now we'll start the process of compressing the large object. ** The idea here is to open the LO, copy it into memory, compress ** the memory, and then write the compressed memory back over ** the existing uncompressed LO. This process is not the ** most efficient since it calls for an extra write and read of ** the large object but the code is significantly simplified. */ /* Open the large object's handle. */ Gen_LoDesc = mi_lo_open( Gen_Con, &Gen_OutData->StringFilename, MI_LO_RDWR ); if( Gen_LoDesc == MI_ERROR ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* ** Determine the size, in bytes, of the large object. ** This size is used to allocate memory for reading the ** LO into memory. */ mi_stat = mi_large_object_stat( Gen_Con, Gen_LoDesc ); if( mi_stat == NULL ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } Size = mi_stat->mist_size; /* ** Save the original size of the large object. ** We'll need to know this value when the LO ** is expanded later. */ Gen_OutData->InitialSize = Size; /* ** Allocate memory to copy the large object to. ** Reading the large object into allocated memory ** and compressing from there is significantly ** faster than reading byte for byte from the ** large object. */ InFile = mi_new_var( Size ); /* Read the large object. */ if( mi_large_object_read( Gen_Con, Gen_LoDesc, (char *)mi_get_vardata( InFile ), Size ) == MI_ERROR ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "ImageInput", "CompressedStrInput", 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* ** Allocate memory for the compressed version ** of the large object. The amount of memory ** required for compression is the size of the ** LO plus memory required for storing the ** Huffman encryption table. */ OutFile = mi_new_var( Size + 2000 ); /* Open the two memory areas for compression input/output. */ InFd = OpenInputBitFile((char *) InFile ); OutFd = OpenOutputBitFile((char *) OutFile ); /* Compress the large object. */ CompressStr( mi_get_vardata( InFile ), OutFd, Size ); /* Close the input/output to flush the final bits. */ CloseInputBitFile( InFd ); CloseOutputBitFile( OutFd ); /* Truncate the existing LO and write the compressed version. */ ifx_int8cvasc( "0", 1, (ifx_int8_t *)&FileStart ); mi_lo_truncate( Gen_Con, Gen_LoDesc, &FileStart ); /* ** Truncating does not reset the descriptor so explicitly ** position to the start of the LO. */ mi_large_object_seek( Gen_Con, Gen_LoDesc, 0, MI_LO_SEEK_SET ); /* Write the compressed LO. */ if( mi_large_object_write( Gen_Con, Gen_LoDesc, mi_get_vardata( OutFile ), BitFileTell( OutFd ) ) == MI_ERROR ) { /* ** An error has occurred while processing the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* ** Close the LO. The compressed version of the LO has now ** been written. The only remaining task is to cleanup. */ if( mi_large_object_close( Gen_Con, Gen_LoDesc ) == MI_ERROR ) { /* ** An error has occurred while processing the large object. */ DBDK_TRACE_ERROR( "ImageInput", "CompressedStrInput", 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* Close and free temporary memory. */ mi_var_free( InFile ); mi_var_free( OutFile ); /* ** Write to the trace file indicating ** that CompressedStrInput has successfully exited. */ DBDK_TRACE_EXIT( "CompressedStrInput" ); /* Close the connection. */ mi_close( Gen_Con ); /* Return the UDT value. */ return Gen_RetVal; } /* }}FUNCTION (#UCLSATPQ) */ /* {{FUNCTION(a9e91f54-f895-11d0-8885-00a0c9255cf3) (MergeSection) */ /**************************************************************** ** ** Function name: ** ** CompressedStrOutput ** ** Description: ** ** This function converts from the internal representation of the ** UDT type CompressedStr to its external representation. The external ** representation is a blank-separated list of values and the ** internal representation is a 'C' structure of type CompressedStr as ** defined in the header file. ** ** Data may be retrieved from a table using an SQL select statement: ** ** select * from tablename; ** ** Selecting a large object will cause the large object to be written ** to a file and the value returned for the large object will be its ** file name. ** ** Special Comments: ** ** Support routine for opaque type CompressedStr returns lvarchar. ** ** Parameters: ** ** CompressedStr * Gen_param1; Pointer to the input text. ** MI_FPARAM * Gen_fparam; Standard info - see DBDK docs. ** ** Return value: ** ** mi_lvarchar * The constructed UDT value. ** ** History: ** ** Jul 09, 1997 - Generated by BladeSmith Version 3.50.626 . ** ** Identification: ** ** Warning: Do not remove or modify this comment: ** CompressedStrOutput FunctionId: a9e91f54-f895-11d0-8885-00a0c9255cf3 ** ***************************************************************** */ mi_lvarchar * CompressedStrOutput ( CompressedStr * Gen_param1, /* The UDT value. */ MI_FPARAM * Gen_fparam /* Standard info - see DBDK docs. */ ) { MI_CONNECTION * Gen_Con; /* The current connection. */ mi_integer Gen_CharLen; /* Estimate maximum length. */ CompressedStr * Gen_InData; /* Pointer to the input data. */ char * Gen_OutData; /* Pointer to the output data. */ mi_lvarchar * Gen_RetVal; /* The return result. */ mi_integer Gen_DataLen; /* The data length. */ long Size; MI_LODESC Gen_LoDesc; /* Large object descriptor. */ MI_LOSTAT * mi_stat; mi_lvarchar * InFile; mi_lvarchar * OutFile; BIT_FILE * OutFd; BIT_FILE * InFd; MI_LOHANDLE * hLO; char Gen_LOFile[FILENAME_MAX]; /* The LO output file name. */ /* Get the current connection handle. */ Gen_Con = mi_open( NULL, NULL, NULL ); /* Verify that the connection has been established. */ if( Gen_Con == 0 ) { /* ** Opening the current connection has failed ** so issue the following message and quit. ** ** "Connection has failed in CompressedStrOutput." */ DBDK_TRACE_ERROR( "CompressedStrOutput", ERRORMESG1, 10 ); /* not reached */ } /* ** Write to the trace file indicating ** that CompressedStrOutput has been called. */ DBDK_TRACE_ENTER( "CompressedStrOutput" ); /* Compute the maximum length of the text representation. */ Gen_CharLen = 1; /* Leave room for the NULL terminator. */ Gen_CharLen += 261; /* Add the length for Gen_OutData->StringFilename. */ /* Allocate room for the output string. */ Gen_RetVal = mi_new_var( Gen_CharLen ); if( Gen_RetVal == 0 ) { /* ** Memory allocation has failed so issue ** the following message and quit. ** ** "Memory allocation has failed in CompressedStrOutput." */ DBDK_TRACE_ERROR( "CompressedStrOutput", ERRORMESG2, 10 ); /* not reached */ } /* Point to the input data. */ Gen_InData = Gen_param1; /* Point to the output data. */ Gen_OutData = mi_get_vardata( Gen_RetVal ); /* Open the large object's handle and read it. */ Gen_LoDesc = mi_large_object_open( Gen_Con, &Gen_InData->StringFilename, MI_LO_RDONLY ); /* ** Determine the size, in bytes, of the large object. ** This size is used to allocate memory for reading the ** LO into memory. */ mi_stat = mi_large_object_stat( Gen_Con, Gen_LoDesc ); if( mi_stat == NULL ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } Size = mi_stat->mist_size; /* ** Allocate memory to copy the large object to. ** Reading the large object into allocated memory ** and compressing from there is significantly ** faster than reading byte for byte from the ** large object. */ InFile = mi_new_var( Size ); /* Read the large object. */ if( mi_large_object_read( Gen_Con, Gen_LoDesc, (char *)mi_get_vardata( InFile ), Size ) == MI_ERROR ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "ImageInput", "CompressedStrInput", 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* Allocate memory for the expanded LO. */ OutFile = mi_new_var( Gen_param1->InitialSize + 10000 ); InFd = OpenInputBitFile((char*) InFile ); OutFd = OpenOutputBitFile((char*) OutFile ); /* Format the attribute value into the output string. */ ExpandStr( InFd, mi_get_vardata( OutFile ) ); /* Create a temporary LO and write the expanded LO to it. */ hLO = mi_large_object_create( Gen_Con, NULL, MI_LO_INTERNAL_LO, NULL, MI_LO_DEFAULT_SMGR, MI_LO_DEFAULT_SMGR ); /* Open the LO for writing. */ Gen_LoDesc = mi_lo_open( Gen_Con, hLO, MI_LO_WRONLY ); if( Gen_LoDesc == MI_ERROR ) { /* ** An error has occurred while reading the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* Write the compressed LO. */ if( mi_large_object_write( Gen_Con, Gen_LoDesc, mi_get_vardata( OutFile ), Gen_param1->InitialSize ) == MI_ERROR ) { /* ** An error has occurred while processing the large object. */ DBDK_TRACE_ERROR( "CompressedStrInput", ERRORMESG2, 0 ); mi_fp_setreturnisnull( Gen_fparam, 0, MI_TRUE ); return (0); } /* Save the large object to disk. */ strcpy( Gen_LOFile, LO_FN_MASK ); Gen_StoreLOToFile( Gen_Con, "CompressedStrOutput", Gen_LOFile, hLO ); /* Construct the return value: the LO's file name. */ sprintf( Gen_OutData, "\"%s\" ", Gen_LOFile ); /* Advance past the formatted data. */ Gen_OutData += strlen( Gen_OutData ); /* ** Compute the length of the data and ** place it in the return structure. */ Gen_DataLen = (mi_integer)(Gen_OutData - mi_get_vardata( Gen_RetVal )); mi_set_varlen ( Gen_RetVal, Gen_DataLen ); /* ** Write to the trace file indicating ** that CompressedStrOutput has successfully exited. */ DBDK_TRACE_EXIT( "CompressedStrOutput" ); /* Close the connection. */ mi_close( Gen_Con ); return Gen_RetVal; } /* }}FUNCTION (#1MB3C9PN) */ #ifdef __cplusplus } #endif