diff options
Diffstat (limited to 'reladminif/test/testconnect.c')
-rw-r--r-- | reladminif/test/testconnect.c | 395 |
1 files changed, 395 insertions, 0 deletions
diff --git a/reladminif/test/testconnect.c b/reladminif/test/testconnect.c new file mode 100644 index 0000000..70215b7 --- /dev/null +++ b/reladminif/test/testconnect.c @@ -0,0 +1,395 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see <http://www.rasdaman.org> +* or contact Peter Baumann via <baumann@rasdaman.com>. +*/ +#include <sqlhdr.h> +#include <sqliapi.h> +#line 1 "testconnect.ec" +/* testconnect.ec +test connection to Informix database +*/ + +#include <iostream> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <minmax.h> + +/* + * EXEC SQL INCLUDE SQLCA; + */ +#line 11 "testconnect.ec" + +#line 11 "testconnect.ec" +#line 1 "/opt/informix/incl/esql/sqlca.h" +/**************************************************************************** + * + * IBM INC. + * + * PROPRIETARY DATA + * + * Licensed Material - Property Of IBM + * + * "Restricted Materails of IBM" + * + * IBM Informix Client SDK + * + * (c) Copyright IBM Corporation 2002. All rights reserved. + * + * + * Title: sqlca.h + * Sccsid: @(#)sqlca.h 9.4 1/18/93 11:09:48 + * Description: + * SQL Control Area + * + *************************************************************************** + */ + +#ifndef SQLCA_INCL +#define SQLCA_INCL + +#include "ifxtypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct sqlca_s + { + int4 sqlcode; + char sqlerrm[72]; /* error message parameters */ + char sqlerrp[8]; + int4 sqlerrd[6]; + /* 0 - estimated number of rows returned */ + /* 1 - serial value after insert or ISAM error code */ + /* 2 - number of rows processed */ + /* 3 - estimated cost */ + /* 4 - offset of the error into the SQL statement */ + /* 5 - rowid after insert */ +#ifdef _FGL_ + char sqlawarn[8]; +#else + struct sqlcaw_s + { + char sqlwarn0; /* = W if any of sqlwarn[1-7] = W */ + char sqlwarn1; /* = W if any truncation occurred or + database has transactions or + no privileges revoked */ + char sqlwarn2; /* = W if a null value returned or + ANSI database */ + char sqlwarn3; /* = W if no. in select list != no. in into list or + turbo backend or no privileges granted */ + char sqlwarn4; /* = W if no where clause on prepared update, delete or + incompatible float format */ + char sqlwarn5; /* = W if non-ANSI statement */ + char sqlwarn6; /* = W if server is in data replication secondary mode */ + char sqlwarn7; /* = W if database locale is different from proc_locale + */ + } sqlwarn; +#endif + } ifx_sqlca_t; + +/* NOTE: 4gl assumes that the sqlwarn structure can be defined as + * sqlawarn -- an 8 character string, because single-char + * variables are not recognized in 4gl. + * + * If this structure should change, the code generated by 4gl compiler + * must also change + */ + +#ifdef VMS +noshare +#endif /* VMS */ + +#define SQLNOTFOUND 100 + +#ifndef IFX_THREAD +extern struct sqlca_s sqlca; + +extern int4 SQLCODE; + +extern char SQLSTATE[]; +#else /* IFX_THREAD */ +extern int4 * ifx_sqlcode(); +extern struct sqlca_s * ifx_sqlca(); +#define SQLCODE (*(ifx_sqlcode())) +#define SQLSTATE ((char *)(ifx_sqlstate())) +#define sqlca (*(ifx_sqlca())) +#endif /* IFX_THREAD */ + +#ifdef __cplusplus +} +#endif + +#endif /* SQLCA_INCL */ + +#line 101 "/opt/informix/incl/esql/sqlca.h" +/* + * EXEC SQL define SUCCESS 0; + */ +#line 12 "testconnect.ec" + +/* + * EXEC SQL define WARNING 1; + */ +#line 13 "testconnect.ec" + +/* + * EXEC SQL define NODATA 100; + */ +#line 14 "testconnect.ec" + +/* + * EXEC SQL define RTERROR -1; + */ +#line 15 "testconnect.ec" + +#line 16 "testconnect.ec" + +/* + * The sqlstate_err() function checks the SQLSTATE status variable to see + * if an error or warning has occurred following an SQL statement. + */ +int4 sqlstate_err() +{ + int4 err_code = -1; + + if(SQLSTATE[0] == '0') /* trap '00', '01', '02' */ + { + switch(SQLSTATE[1]) + { + case '0': /* success - return 0 */ + err_code = 0; + break; + case '1': /* warning - return 1 */ + err_code = 1; + break; + case '2': /* end of data - return 100 */ + err_code = 100; + break; + default: /* error - return SQLCODE */ + break; + } + } + return(err_code); +} + +/* + * The disp_sqlstate_err() function executes the GET DIAGNOSTICS + * statement and prints the detail for each exception that is returned. + */ +void disp_sqlstate_err() +{ + mint j; + +/* + * EXEC SQL BEGIN DECLARE SECTION; + */ +#line 53 "testconnect.ec" +#line 54 "testconnect.ec" +#line 54 "testconnect.ec" +mint exception_count; +#line 55 "testconnect.ec" + char overflow[2]; +#line 56 "testconnect.ec" +mint exception_num = 1; +#line 57 "testconnect.ec" + char class_id[255]; +#line 58 "testconnect.ec" + char subclass_id[255]; +#line 59 "testconnect.ec" + char message[255]; +#line 60 "testconnect.ec" +mint messlen; +#line 61 "testconnect.ec" + char sqlstate_code[6]; +#line 62 "testconnect.ec" +mint i; +/* + * EXEC SQL END DECLARE SECTION; + */ +#line 63 "testconnect.ec" + + + printf("SQLSTATE: %s\n",SQLSTATE); + printf("SQLCODE: %d\n", SQLCODE); + +/* + * EXEC SQL get diagnostics :exception_count = NUMBER, :overflow = MORE; + */ +#line 68 "testconnect.ec" + { +#line 68 "testconnect.ec" + static ifx_hostvar_t _SQhtab[] = + { + { 0, 1, 102, sizeof(exception_count), 0, 0, 0, 0 }, + { 0, 2, 100, 2, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 } +#line 68 "testconnect.ec" + }; + _SQhtab[0].hostaddr = (char *)&exception_count; + _SQhtab[1].hostaddr = (overflow); +#line 68 "testconnect.ec" + sqli_diag_get(ESQLINTVERSION, _SQhtab, -1); +#line 68 "testconnect.ec" + } + + printf("EXCEPTIONS: Number=%d\t", exception_count); + printf("More? %s\n", overflow); + + for (i = 1; i <= exception_count; i++) + { +/* + * EXEC SQL get diagnostics exception :i + * :sqlstate_code = RETURNED_SQLSTATE, + * :class_id = CLASS_ORIGIN, :subclass_id = SUBCLASS_ORIGIN, + * :message = MESSAGE_TEXT, :messlen = MESSAGE_LENGTH; + */ +#line 75 "testconnect.ec" + { +#line 78 "testconnect.ec" + static ifx_hostvar_t _SQhtab[] = + { + { 0, 3, 100, 6, 0, 0, 0, 0 }, + { 0, 4, 100, 255, 0, 0, 0, 0 }, + { 0, 5, 100, 255, 0, 0, 0, 0 }, + { 0, 6, 100, 255, 0, 0, 0, 0 }, + { 0, 7, 102, sizeof(messlen), 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 } +#line 78 "testconnect.ec" + }; + _SQhtab[0].hostaddr = (sqlstate_code); + _SQhtab[1].hostaddr = (class_id); + _SQhtab[2].hostaddr = (subclass_id); + _SQhtab[3].hostaddr = (message); + _SQhtab[4].hostaddr = (char *)&messlen; +#line 78 "testconnect.ec" + sqli_diag_get(ESQLINTVERSION, _SQhtab, i); +#line 78 "testconnect.ec" + } + + printf("EXCEPTION %d: SQLSTATE=%s\n", i, sqlstate_code); + message[messlen-1] = '\0'; + printf("MESSAGE TEXT: %s\n", message); + j = byleng(class_id, stleng(class_id)); + class_id[j] = '\0'; + printf("CLASS ORIGIN: %s\n",class_id); + j = byleng(subclass_id, stleng(subclass_id)); + subclass_id[j] = '\0'; + printf("SUBCLASS ORIGIN: %s\n",subclass_id); + } +} + +void disp_error(char* stmt) +{ +} + +void disp_exception(char* stmt, int4 sqlerr_code, mint warn_flg) +{ + switch (sqlerr_code) + { + case 0: + case 100: + break; + case 1: + if(warn_flg) + { + printf("Warning encountered in %s\n", stmt); + disp_sqlstate_err(); + } + break; + case -1: + printf("Error encountered in %s\n", stmt); + disp_sqlstate_err(); + break; + default: + printf("INVALID EXCEPTION STATE for %s\n", stmt); + break; + } +} + +int +check() +{ + mint warn_flg = 1; + int4 sqlerr_code = 0; + + sqlerr_code = sqlstate_err(); + disp_exception((char*)"error", sqlerr_code, warn_flg); + + return SQLCODE; +} + + +int +main(int argc, char** argv) +{ + cout << argv[0] << " Informix database access test" << endl; + if (argc != 2) + { + cout << "Usage: " << argv[0] << " connectstring" << endl; + return 2; + } + +/* + * EXEC SQL BEGIN DECLARE SECTION; + */ +#line 143 "testconnect.ec" +#line 144 "testconnect.ec" +#line 144 "testconnect.ec" + char id[256]; +/* + * EXEC SQL END DECLARE SECTION; + */ +#line 145 "testconnect.ec" + + + strcpy( id, argv[1] ); + cout << "using connect string: " << id << endl; + +/* + * EXEC SQL CONNECT TO :id; + */ +#line 150 "testconnect.ec" + { +#line 150 "testconnect.ec" + sqli_connect_open(ESQLINTVERSION, 0, id, (char *) 0, (ifx_conn_t *) 0, 0); +#line 150 "testconnect.ec" + } + check(); + +/* + * EXEC SQL DISCONNECT CURRENT; + */ +#line 153 "testconnect.ec" + { +#line 153 "testconnect.ec" + sqli_connect_close(3, (char *) 0, 0, 0); +#line 153 "testconnect.ec" + } + check(); + + cout << argv[0] << ": done." << endl; + return 0; +} + + +#line 159 "testconnect.ec" |