/* @(#)File: $RCSfile: jtypes.c,v $ @(#)Version: $Revision: 2008.1 $ @(#)Last changed: $Date: 2008/03/09 03:09:10 $ @(#)Purpose: Substitute for RTYPALIGN and RTYPMSIZE @(#)Author: J Leffler @(#)Copyright: (C) JLSS 1995,1997-98,2001,2003,2005,2007-08 @(#)Product: IBM Informix Database Driver for Perl DBI Version 2011.0612 (2011-06-12) */ /*TABSTOP=4*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ /* DO_NOT_USE_STDERR_H is primarily for Perl + DBI + DBD::Informix */ #include #ifndef DO_NOT_USE_STDERR_H #include "stderr.h" #endif /* DO_NOT_USE_STDERR_H */ #include "esqlc.h" #include "esqlutil.h" #ifndef lint /* Prevent over-aggressive optimizers from eliminating ID string */ const char jlss_id_jtypes_c[] = "@(#)$Id: jtypes.c,v 2008.1 2008/03/09 03:09:10 jleffler Exp $"; #endif /* lint */ /* Return memory size for type */ int jtypmsize(int type, int len) { int size; switch (type) { #ifdef SQLLVARCHAR case SQLLVARCHAR: case SQLSET: case SQLMULTISET: case SQLLIST: case SQLROW: case CLVCHARPTRTYPE: size = sizeof(void *); break; #endif /* SQLLVARCHAR */ #ifdef SQLNCHAR case SQLNCHAR: #endif /* SQLNCHAR */ case CFIXCHARTYPE: case SQLCHAR: case CCHARTYPE: case CSTRINGTYPE: size = len + 1; break; #ifdef SQLNVCHAR case SQLNVCHAR: #endif /* SQLNVCHAR */ case SQLVCHAR: case CVCHARTYPE: size = VCMAX(len) + 1; break; case SQLSMINT: case CSHORTTYPE: size = sizeof(ixInt2); break; case SQLDATE: case SQLINT: case SQLSERIAL: case CLONGTYPE: case CDATETYPE: size = sizeof(ixInt4); break; case SQLSMFLOAT: case CFLOATTYPE: size = sizeof(float); break; case SQLFLOAT: case CDOUBLETYPE: size = sizeof(double); break; case SQLMONEY: case SQLDECIMAL: case CDECIMALTYPE: case CMONEYTYPE: size = sizeof(Decimal); break; case CINTTYPE: size = sizeof(ixMint); break; case SQLDTIME: case CDTIMETYPE: size = sizeof(Datetime); break; case SQLINTERVAL: case CINVTYPE: size = sizeof(Interval); break; case SQLBYTES: case SQLTEXT: case CLOCATORTYPE: case CFILETYPE: size = sizeof(Blob); break; #ifdef ESQLC_IUSTYPES case SQLINT8: case SQLSERIAL8: case CINT8TYPE: size = sizeof(ifx_int8_t); break; #endif /* ESQLC_IUSTYPES */ #ifdef ESQLC_BIGINT case SQLINFXBIGINT: case SQLBIGSERIAL: case CBIGINTTYPE: size = sizeof(ixInt8); break; #endif /* ESQLC_BIGINT */ default: #ifndef DO_NOT_USE_STDERR_H err_remark("jtypsize: unknown type number %d (assume zero size)\n", type); #endif /* DO_NOT_USE_STDERR_H */ size = 0; break; } return(size); } /* Return get proper byte alignment for various types */ int jtypalign(int offset, int type) { int align; struct /* SMALLINT */ { char ic; ixInt2 i2; } i; struct /* Machine int */ { char ic; ixMint i2; } mi; struct /* INTEGER, DATE */ { char lc; ixInt4 l2; } l; struct /* SMALLFLOAT */ { char fc; float f2; } f; struct /* FLOAT */ { char dc; double d2; } d; struct /* DECIMAL, MONEY */ { char nc; Decimal n2; } n; struct /* DATETIME */ { char dtc; Datetime dt2; } dt; struct /* INTERVAL */ { char inc; Interval in2; } in; struct /* BYTE or TEXT blob */ { char blc; Blob bl2; } bl; struct /* LVARCHAR - or BLOB or CLOB */ { char lvc; void *lv2; } lv; #ifdef ESQLC_IUSTYPES struct /* INT8 */ { char i8c; ifx_int8_t i82; } i8; #endif /* ESQLC_IUSTYPES */ #ifdef ESQLC_BIGINT struct /* BIGINT */ { char bic; bigint bi2; } bi; #endif /* ESQLC_BIGINT */ switch (type) { case SQLSMINT: case CSHORTTYPE: align = ((char *)&i.i2) - &i.ic; break; case CINTTYPE: align = ((char *)&mi.i2) - &mi.ic; break; case SQLINT: case SQLSERIAL: case SQLDATE: case CLONGTYPE: case CDATETYPE: align = ((char *)&l.l2) - &l.lc; break; #ifdef ESQLC_IUSTYPES case SQLINT8: case SQLSERIAL8: case CINT8TYPE: align = ((char *)&i8.i82) - &i8.i8c; break; #endif /* ESQLC_IUSTYPES */ #ifdef ESQLC_BIGINT case SQLINFXBIGINT: case SQLBIGSERIAL: case CBIGINTTYPE: align = ((char *)&bi.bi2) - &bi.bic; break; #endif /* ESQLC_BIGINT */ case SQLSMFLOAT: case CFLOATTYPE: align = ((char *)&f.f2) - &f.fc; break; case SQLFLOAT: case CDOUBLETYPE: align = ((char *)&d.d2) - &d.dc; break; case SQLDTIME: case CDTIMETYPE: align = ((char *)&dt.dt2) - &dt.dtc; break; case SQLINTERVAL: case CINVTYPE: align = ((char *)&in.in2) - &in.inc; break; case SQLMONEY: case SQLDECIMAL: case CDECIMALTYPE: case CMONEYTYPE: align = ((char *)&n.n2) - &n.nc; break; case CLOCATORTYPE: case SQLBYTES: case SQLTEXT: case CFILETYPE: align = ((char *)&bl.bl2) - &bl.blc; break; #ifdef SQLLVARCHAR case SQLLVARCHAR: case SQLSET: case SQLMULTISET: case SQLLIST: case SQLROW: case CLVCHARPTRTYPE: align = ((char *)&lv.lv2) - &lv.lvc; break; #endif /* SQLLVARCHAR */ case CCHARTYPE: case CFIXCHARTYPE: case CSTRINGTYPE: case SQLCHAR: case CVCHARTYPE: case SQLVCHAR: #ifdef SQLNCHAR case SQLNCHAR: #endif /* SQLNCHAR */ #ifdef SQLNVCHAR case SQLNVCHAR: #endif /* SQLNVCHAR */ align = 1; break; default: #ifndef DO_NOT_USE_STDERR_H err_remark("jtypalign: unknown type number %d (assume 'double' alignment)\n", type); #endif /* DO_NOT_USE_STDERR_H */ align = ((char *)&d.d2) - &d.dc; break; } --align; return((offset + align) & ~align); }