mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Removed old test files
This commit is contained in:
@ -1,363 +0,0 @@
|
||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/test/dt_test.pgc,v 1.10 2006/06/21 10:24:41 meskes Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <pgtypes_date.h>
|
||||
#include <pgtypes_timestamp.h>
|
||||
#include <pgtypes_interval.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
date date1;
|
||||
timestamp ts1;
|
||||
interval iv1;
|
||||
char *text;
|
||||
exec sql end declare section;
|
||||
date date2;
|
||||
int mdy[3] = { 4, 19, 1998 };
|
||||
char *fmt, *out, *in;
|
||||
char *d1 = "Mon Jan 17 1966";
|
||||
char *t1 = "2000-7-12 17:34:29";
|
||||
int i;
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
exec sql whenever sqlerror do sqlprint();
|
||||
exec sql connect to mm;
|
||||
exec sql create table date_test (d date, ts timestamp, iv interval);
|
||||
exec sql set datestyle to iso;
|
||||
|
||||
date1 = PGTYPESdate_from_asc(d1, NULL);
|
||||
ts1 = PGTYPEStimestamp_from_asc(t1, NULL);
|
||||
|
||||
exec sql insert into date_test(d, ts, iv) values (:date1, :ts1, now()-'Mon Jan 17 1966');
|
||||
|
||||
exec sql select * into :date1, :ts1 , :iv1 from date_test where d=:date1;
|
||||
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf ("Date: %s\n", text);
|
||||
free(text);
|
||||
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf ("timestamp: %s\n", text);
|
||||
free(text);
|
||||
|
||||
text = PGTYPESinterval_to_asc(&iv1);
|
||||
printf ("interval: %s\n", text);
|
||||
free(text);
|
||||
|
||||
PGTYPESdate_mdyjul(mdy, &date2);
|
||||
printf("m: %d, d: %d, y: %d\n", mdy[0], mdy[1], mdy[2]);
|
||||
/* reset */
|
||||
mdy[0] = mdy[1] = mdy[2] = 0;
|
||||
|
||||
printf("date seems to get encoded to julian %ld\n", date2);
|
||||
|
||||
PGTYPESdate_julmdy(date2, mdy);
|
||||
printf("m: %d, d: %d, y: %d\n", mdy[0], mdy[1], mdy[2]);
|
||||
|
||||
ts1 = PGTYPEStimestamp_from_asc("2003-12-04 17:34:29", NULL);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
|
||||
printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(ts1));
|
||||
free(text);
|
||||
|
||||
PGTYPESdate_today(&date1);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("today is %s\n", text);
|
||||
free(text);
|
||||
|
||||
fmt = "(ddd), mmm. dd, yyyy, repeat: (ddd), mmm. dd, yyyy. end";
|
||||
out = (char*) malloc(strlen(fmt) + 1);
|
||||
|
||||
PGTYPESdate_fmt_asc(date1, fmt, out);
|
||||
printf("Today in format \"%s\" is \"%s\"\n", fmt, out);
|
||||
free(out);
|
||||
|
||||
/* rdate_defmt_asc() */
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "yy/mm/dd";
|
||||
in = "In the year 1995, the month of December, it is the 25th day";
|
||||
/* 0123456789012345678901234567890123456789012345678901234567890
|
||||
* 0 1 2 3 4 5 6
|
||||
*/
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc1: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mmmm. dd. yyyy";
|
||||
in = "12/25/95";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc2: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "yy/mm/dd";
|
||||
in = "95/12/25";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc3: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "yy/mm/dd";
|
||||
in = "1995, December 25th";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc4: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "dd-mm-yy";
|
||||
in = "This is 25th day of December, 1995";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc5: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mmddyy";
|
||||
in = "Dec. 25th, 1995";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc6: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mmm. dd. yyyy";
|
||||
in = "dec 25th 1995";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc7: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mmm. dd. yyyy";
|
||||
in = "DEC-25-1995";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc8: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mm yy dd.";
|
||||
in = "12199525";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc9: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "yyyy fierj mm dd.";
|
||||
in = "19951225";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc10: %s\n", text);
|
||||
free(text);
|
||||
|
||||
date1 = 0; text = "";
|
||||
fmt = "mm/dd/yy";
|
||||
in = "122595";
|
||||
PGTYPESdate_defmt_asc(&date1, fmt, in);
|
||||
text = PGTYPESdate_to_asc(date1);
|
||||
printf("date_defmt_asc12: %s\n", text);
|
||||
free(text);
|
||||
|
||||
PGTYPEStimestamp_current(&ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_current: Now: %s\n", text);
|
||||
free(text);
|
||||
|
||||
ts1 = PGTYPEStimestamp_from_asc("96-02-29", NULL);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_to_asc1: %s\n", text);
|
||||
free(text);
|
||||
|
||||
ts1 = PGTYPEStimestamp_from_asc("1994-02-11 3:10:35", NULL);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_to_asc2: %s\n", text);
|
||||
free(text);
|
||||
|
||||
ts1 = PGTYPEStimestamp_from_asc("1994-02-11 26:10:35", NULL);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_to_asc3: %s\n", text);
|
||||
free(text);
|
||||
|
||||
/* abc-03:10:35-def-02/11/94-gh */
|
||||
/* 12345678901234567890123456789 */
|
||||
|
||||
out = (char*) malloc(32);
|
||||
i = PGTYPEStimestamp_fmt_asc(&ts1, out, 31, "abc-%X-def-%x-ghi%%");
|
||||
printf("timestamp_fmt_asc: %d: %s\n", i, out);
|
||||
free(out);
|
||||
|
||||
fmt = "This is a %m/%d/%y %H-%Ml%Stest";
|
||||
in = "This is a 4/12/80 3-39l12test";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %d %H:%M:%S %z %Y";
|
||||
in = "Tue Jul 22 17:28:44 +0200 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %d %H:%M:%S %z %Y";
|
||||
in = "Tue Feb 29 17:28:44 +0200 2000";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %d %H:%M:%S %z %Y";
|
||||
in = "Tue Feb 29 17:28:44 +0200 1900";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %d %H:%M:%S %z %Y";
|
||||
in = "Tue Feb 29 17:28:44 +0200 1996";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%b %d %H:%M:%S %z %Y";
|
||||
in = " Jul 31 17:28:44 +0200 1996";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%b %d %H:%M:%S %z %Y";
|
||||
in = " Jul 32 17:28:44 +0200 1996";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %d %H:%M:%S %z %Y";
|
||||
in = "Tue Feb 29 17:28:44 +0200 1997";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%";
|
||||
in = "Tue Jul 22 17:28:44 +0200 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "a %";
|
||||
in = "Tue Jul 22 17:28:44 +0200 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%b, %d %H_%M`%S %z %Y";
|
||||
in = " Jul, 22 17_28 `44 +0200 2003 ";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %%%d %H:%M:%S %Z %Y";
|
||||
in = "Tue Jul %22 17:28:44 CEST 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%a %b %%%d %H:%M:%S %Z %Y";
|
||||
in = "Tue Jul %22 17:28:44 CEST 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "abc%n %C %B %%%d %H:%M:%S %Z %Y";
|
||||
in = "abc\n 19 October %22 17:28:44 CEST 2003";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "abc%n %C %B %%%d %H:%M:%S %Z %y";
|
||||
in = "abc\n 18 October %34 17:28:44 CEST 80";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "";
|
||||
in = "abc\n 18 October %34 17:28:44 CEST 80";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = NULL;
|
||||
in = "1980-04-12 3:49:44 ";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
fmt = "%B %d, %Y. Time: %I:%M%p";
|
||||
in = "July 14, 1988. Time: 9:15am";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
in = "September 6 at 01:30 pm in the year 1983";
|
||||
fmt = "%B %d at %I:%M %p in the year %Y";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
in = " 1976, July 14. Time: 9:15am";
|
||||
fmt = "%Y, %B %d. Time: %I:%M %p";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
in = " 1976, July 14. Time: 9:15 am";
|
||||
fmt = "%Y, %B %d. Time: %I:%M%p";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
|
||||
in = " 1976, P.M. July 14. Time: 9:15";
|
||||
fmt = "%Y, %P %B %d. Time: %I:%M";
|
||||
i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
|
||||
text = PGTYPEStimestamp_to_asc(ts1);
|
||||
printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
|
||||
free(text);
|
||||
exec sql rollback;
|
||||
exec sql disconnect;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
@ -1,192 +0,0 @@
|
||||
/* dynamic SQL test program
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/interfaces/ecpg/test/dyntest.pgc,v 1.12 2006/03/11 16:57:43 momjian Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
exec sql include sql3types;
|
||||
exec sql include sqlca;
|
||||
|
||||
static void error(void)
|
||||
{ printf("#%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{ exec sql begin declare section;
|
||||
int COUNT;
|
||||
int INTVAR;
|
||||
int INDEX;
|
||||
int INDICATOR;
|
||||
bool BOOLVAR;
|
||||
int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
|
||||
int DATETIME_INTERVAL_CODE;
|
||||
char NAME[120];
|
||||
char STRINGVAR[1024];
|
||||
float FLOATVAR;
|
||||
double DOUBLEVAR;
|
||||
char QUERY[1024];
|
||||
char DB[1024];
|
||||
exec sql end declare section;
|
||||
int done=0;
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0]?argv[1]:"pg_tables");
|
||||
|
||||
exec sql whenever sqlerror do error();
|
||||
|
||||
exec sql allocate descriptor MYDESC;
|
||||
|
||||
strncpy(DB,argc>2?argv[2]:"mm",sizeof DB);
|
||||
exec sql connect to :DB;
|
||||
|
||||
exec sql prepare MYQUERY from :QUERY;
|
||||
exec sql declare MYCURS cursor for MYQUERY;
|
||||
|
||||
exec sql open MYCURS;
|
||||
|
||||
while (1)
|
||||
{ exec sql fetch in MYCURS into sql descriptor MYDESC;
|
||||
|
||||
if (sqlca.sqlcode) break;
|
||||
|
||||
exec sql get descriptor MYDESC :COUNT = count;
|
||||
if (!done)
|
||||
{ printf("%d Columns\n",COUNT);
|
||||
for (INDEX=1;INDEX<=COUNT;++INDEX)
|
||||
{ exec sql get descriptor MYDESC value :INDEX
|
||||
:TYPE = type,
|
||||
:LENGTH = length, :OCTET_LENGTH=octet_length,
|
||||
:PRECISION = precision, :SCALE=scale,
|
||||
:NULLABLE=nullable, :NAME=name,
|
||||
:RETURNED_OCTET_LENGTH=returned_octet_length;
|
||||
printf("%s ",NAME);
|
||||
switch (TYPE)
|
||||
{ case SQL3_BOOLEAN:
|
||||
printf("bool ");
|
||||
break;
|
||||
case SQL3_NUMERIC:
|
||||
printf("numeric(%d,%d) ",PRECISION,SCALE);
|
||||
break;
|
||||
case SQL3_DECIMAL:
|
||||
printf("decimal(%d,%d) ",PRECISION,SCALE);
|
||||
break;
|
||||
case SQL3_INTEGER:
|
||||
printf("integer ");
|
||||
break;
|
||||
case SQL3_SMALLINT:
|
||||
printf("smallint ");
|
||||
break;
|
||||
case SQL3_FLOAT:
|
||||
printf("float(%d,%d) ",PRECISION,SCALE);
|
||||
break;
|
||||
case SQL3_REAL:
|
||||
printf("real ");
|
||||
break;
|
||||
case SQL3_DOUBLE_PRECISION:
|
||||
printf("double precision ");
|
||||
break;
|
||||
case SQL3_DATE_TIME_TIMESTAMP:
|
||||
exec sql get descriptor MYDESC value :INDEX
|
||||
:DATETIME_INTERVAL_CODE=datetime_interval_code;
|
||||
switch(DATETIME_INTERVAL_CODE)
|
||||
{ case SQL3_DDT_DATE:
|
||||
printf("date "); break;
|
||||
case SQL3_DDT_TIME:
|
||||
printf("time "); break;
|
||||
case SQL3_DDT_TIMESTAMP:
|
||||
printf("timestamp "); break;
|
||||
case SQL3_DDT_TIME_WITH_TIME_ZONE:
|
||||
printf("time with time zone "); break;
|
||||
case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE:
|
||||
printf("timestamp with time zone "); break;
|
||||
}
|
||||
break;
|
||||
case SQL3_INTERVAL:
|
||||
printf("interval ");
|
||||
break;
|
||||
case SQL3_CHARACTER:
|
||||
if (LENGTH>0) printf("char(%d) ",LENGTH);
|
||||
else printf("char(?) ");
|
||||
break;
|
||||
case SQL3_CHARACTER_VARYING:
|
||||
if (LENGTH>0) printf("varchar(%d) ",LENGTH);
|
||||
else printf("varchar() ");
|
||||
break;
|
||||
default:
|
||||
if (TYPE<0) printf("<OID %d> ",-TYPE);
|
||||
else printf("<SQL3 %d> ",TYPE);
|
||||
break;
|
||||
}
|
||||
if (!NULLABLE) printf("not null ");
|
||||
if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
|
||||
putchar('\n');
|
||||
}
|
||||
putchar('\n');
|
||||
done=1;
|
||||
}
|
||||
|
||||
for (INDEX=1;INDEX<=COUNT;++INDEX)
|
||||
{ exec sql get descriptor MYDESC value :INDEX
|
||||
:TYPE = type, :SCALE=scale, :PRECISION = precision,
|
||||
:INDICATOR=indicator;
|
||||
if (INDICATOR==-1) printf("NULL");
|
||||
else switch (TYPE)
|
||||
{ case SQL3_BOOLEAN:
|
||||
exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
|
||||
printf(BOOLVAR?"true":"false");
|
||||
break;
|
||||
case SQL3_NUMERIC:
|
||||
case SQL3_DECIMAL:
|
||||
if (SCALE==0) /* we might even print leading zeros "%0*d" */
|
||||
{ exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
|
||||
printf("%*d",PRECISION,INTVAR);
|
||||
}
|
||||
else
|
||||
{ exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
|
||||
printf("%*.*f",PRECISION+1,SCALE,FLOATVAR);
|
||||
}
|
||||
break;
|
||||
case SQL3_INTEGER:
|
||||
case SQL3_SMALLINT:
|
||||
exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
|
||||
printf("%d",INTVAR);
|
||||
break;
|
||||
case SQL3_FLOAT:
|
||||
case SQL3_REAL:
|
||||
exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
|
||||
printf("%f",FLOATVAR);
|
||||
break;
|
||||
case SQL3_DOUBLE_PRECISION:
|
||||
exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
|
||||
printf("%f",DOUBLEVAR);
|
||||
break;
|
||||
case SQL3_DATE_TIME_TIMESTAMP:
|
||||
case SQL3_INTERVAL:
|
||||
case SQL3_CHARACTER:
|
||||
case SQL3_CHARACTER_VARYING:
|
||||
default:
|
||||
exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
|
||||
printf("'%s'",STRINGVAR);
|
||||
break;
|
||||
}
|
||||
putchar('|');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
exec sql close MYCURS;
|
||||
|
||||
exec sql deallocate descriptor MYDESC;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,140 +0,0 @@
|
||||
/* dynamic SQL test program
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/interfaces/ecpg/test/dyntest2.pgc,v 1.7 2006/03/11 16:57:44 momjian Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
exec sql include sql3types;
|
||||
exec sql include sqlca;
|
||||
|
||||
static void error(void)
|
||||
{
|
||||
printf("\n#%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
int COUNT;
|
||||
int INTVAR, BOOLVAR;
|
||||
int INDEX;
|
||||
int INDICATOR;
|
||||
int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
|
||||
int DATETIME_INTERVAL_CODE;
|
||||
char NAME[120];
|
||||
char STRINGVAR[1024];
|
||||
float FLOATVAR;
|
||||
double DOUBLEVAR;
|
||||
char QUERY[1024];
|
||||
exec sql end declare section;
|
||||
int done=0;
|
||||
FILE *dbgs;
|
||||
|
||||
exec sql var BOOLVAR is bool;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1?argv[1]:"pg_tables");
|
||||
|
||||
exec sql whenever sqlerror do error();
|
||||
|
||||
exec sql allocate descriptor MYDESC;
|
||||
|
||||
exec sql connect to mm;
|
||||
|
||||
exec sql prepare MYQUERY from :QUERY;
|
||||
exec sql declare MYCURS cursor for MYQUERY;
|
||||
|
||||
exec sql open MYCURS;
|
||||
|
||||
while (1)
|
||||
{ exec sql fetch in MYCURS into sql descriptor MYDESC;
|
||||
|
||||
if (sqlca.sqlcode) break;
|
||||
|
||||
exec sql get descriptor MYDESC :COUNT = count;
|
||||
if (!done)
|
||||
{ printf("Count %d\n",COUNT);
|
||||
done=1;
|
||||
}
|
||||
|
||||
for (INDEX=1;INDEX<=COUNT;++INDEX)
|
||||
{ exec sql get descriptor MYDESC value :INDEX
|
||||
:TYPE = type,
|
||||
:LENGTH = length, :OCTET_LENGTH=octet_length,
|
||||
:RETURNED_OCTET_LENGTH=returned_octet_length,
|
||||
:PRECISION = precision, :SCALE=scale,
|
||||
:NULLABLE=nullable, :NAME=name,
|
||||
:INDICATOR=indicator;
|
||||
printf("%2d\t%s (type: %d length: %d precision: %d scale: %d\n"
|
||||
"\toctet_length: %d returned_octet_length: %d nullable: %d)\n\t= "
|
||||
,INDEX,NAME,TYPE,LENGTH,PRECISION,SCALE
|
||||
,OCTET_LENGTH,RETURNED_OCTET_LENGTH,NULLABLE);
|
||||
if (INDICATOR==-1) printf("NULL\n");
|
||||
else switch (TYPE)
|
||||
{
|
||||
case SQL3_BOOLEAN:
|
||||
exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
|
||||
printf("%s\n",BOOLVAR ? "true":"false");
|
||||
break;
|
||||
case SQL3_NUMERIC:
|
||||
case SQL3_DECIMAL:
|
||||
if (SCALE==0)
|
||||
{ exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
|
||||
printf("%d\n",INTVAR);
|
||||
}
|
||||
else
|
||||
{ exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
|
||||
printf("%.*f\n",SCALE,FLOATVAR);
|
||||
}
|
||||
break;
|
||||
case SQL3_INTEGER:
|
||||
case SQL3_SMALLINT:
|
||||
exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
|
||||
printf("%d\n",INTVAR);
|
||||
break;
|
||||
case SQL3_FLOAT:
|
||||
case SQL3_REAL:
|
||||
exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
|
||||
printf("%.*f\n",PRECISION,FLOATVAR);
|
||||
break;
|
||||
case SQL3_DOUBLE_PRECISION:
|
||||
exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
|
||||
printf("%.*f\n",PRECISION,DOUBLEVAR);
|
||||
break;
|
||||
case SQL3_DATE_TIME_TIMESTAMP:
|
||||
exec sql get descriptor MYDESC value :INDEX
|
||||
:DATETIME_INTERVAL_CODE=datetime_interval_code,
|
||||
:STRINGVAR=data;
|
||||
printf("%d \"%s\"\n",DATETIME_INTERVAL_CODE,STRINGVAR);
|
||||
break;
|
||||
case SQL3_INTERVAL:
|
||||
exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
|
||||
printf("\"%s\"\n",STRINGVAR);
|
||||
break;
|
||||
case SQL3_CHARACTER:
|
||||
case SQL3_CHARACTER_VARYING:
|
||||
exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
|
||||
printf("\"%s\"\n",STRINGVAR);
|
||||
break;
|
||||
default:
|
||||
exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
|
||||
printf("<\"%s\">\n",STRINGVAR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exec sql close MYCURS;
|
||||
|
||||
exec sql deallocate descriptor MYDESC;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/test/num_test.pgc,v 1.11 2006/03/11 04:38:40 momjian Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pgtypes_numeric.h>
|
||||
#include <decimal.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
char *text="error\n";
|
||||
numeric *value1, *value2, *res;
|
||||
exec sql begin declare section;
|
||||
numeric(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ;
|
||||
exec sql end declare section;
|
||||
double d;
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
exec sql whenever sqlerror do sqlprint();
|
||||
|
||||
exec sql connect to mm;
|
||||
exec sql create table test (text char(5), num numeric(14,7));
|
||||
|
||||
value1 = PGTYPESnumeric_new();
|
||||
PGTYPESnumeric_from_int(1407, value1);
|
||||
text = PGTYPESnumeric_to_asc(value1, -1);
|
||||
printf("long = %s\n", text);
|
||||
|
||||
value1 = PGTYPESnumeric_from_asc("2369.7", NULL);
|
||||
value2 = PGTYPESnumeric_from_asc("10.0", NULL);
|
||||
res = PGTYPESnumeric_new();
|
||||
PGTYPESnumeric_add(value1, value2, res);
|
||||
text = PGTYPESnumeric_to_asc(res, -1);
|
||||
printf("add = %s\n", text);
|
||||
|
||||
PGTYPESnumeric_sub(res, value2, res);
|
||||
text = PGTYPESnumeric_to_asc(res, -1);
|
||||
printf("sub = %s\n", text);
|
||||
|
||||
PGTYPESnumeric_copy(res, &des);
|
||||
exec sql insert into test (text, num) values ('test', :des);
|
||||
|
||||
value2 = PGTYPESnumeric_from_asc("2369.7", NULL);
|
||||
PGTYPESnumeric_mul(value1, value2, res);
|
||||
|
||||
exec sql select num into :des from test where text = 'test';
|
||||
|
||||
PGTYPESnumeric_mul(res, &des, res);
|
||||
text = PGTYPESnumeric_to_asc(res, -1);
|
||||
printf("mul = %s\n", text);
|
||||
|
||||
value2 = PGTYPESnumeric_from_asc("10000", NULL);
|
||||
PGTYPESnumeric_div(res, value2, res);
|
||||
text = PGTYPESnumeric_to_asc(res, -1);
|
||||
PGTYPESnumeric_to_double(res, &d);
|
||||
printf("div = %s %e\n", text, d);
|
||||
|
||||
exec sql rollback;
|
||||
exec sql disconnect;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
@ -1,145 +0,0 @@
|
||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/test/perftest.pgc,v 1.11 2006/03/11 04:38:40 momjian Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
exec sql include sqlca;
|
||||
|
||||
exec sql whenever sqlerror sqlprint;
|
||||
exec sql whenever not found sqlprint;
|
||||
|
||||
static void
|
||||
print_result(long sec, long usec, char *text)
|
||||
{
|
||||
if (usec < 0)
|
||||
{
|
||||
sec--;
|
||||
usec+=1000000;
|
||||
}
|
||||
printf("%ld seconds and %ld microseconds for test %s\n", sec, usec, text);
|
||||
exec sql vacuum;
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
long i;
|
||||
exec sql end declare section;
|
||||
struct timeval tvs, tve;
|
||||
|
||||
exec sql connect to mm;
|
||||
|
||||
exec sql create table perftest1(number int4, ascii char(16));
|
||||
|
||||
exec sql create unique index number1 on perftest1(number);
|
||||
|
||||
exec sql create table perftest2(number int4, next_number int4);
|
||||
|
||||
exec sql create unique index number2 on perftest2(number);
|
||||
|
||||
exec sql commit;
|
||||
|
||||
exec sql set autocommit to on;
|
||||
|
||||
exec sql begin transaction;
|
||||
|
||||
gettimeofday(&tvs, NULL);
|
||||
|
||||
for (i = 0;i < 1407; i++)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char text[16];
|
||||
exec sql end declare section;
|
||||
|
||||
sprintf(text, "%ld", i);
|
||||
exec sql insert into perftest1(number, ascii) values (:i, :text);
|
||||
exec sql insert into perftest2(number, next_number) values (:i, :i+1);
|
||||
}
|
||||
|
||||
exec sql commit;
|
||||
|
||||
gettimeofday(&tve, NULL);
|
||||
|
||||
print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "insert");
|
||||
|
||||
exec sql begin transaction;
|
||||
|
||||
gettimeofday(&tvs, NULL);
|
||||
|
||||
for (i = 0;i < 1407; i++)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char text[16];
|
||||
exec sql end declare section;
|
||||
|
||||
exec sql select ascii into :text from perftest1 where number = :i;
|
||||
}
|
||||
|
||||
exec sql commit;
|
||||
|
||||
gettimeofday(&tve, NULL);
|
||||
|
||||
print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "selection&projection");
|
||||
|
||||
exec sql begin transaction;
|
||||
|
||||
gettimeofday(&tvs, NULL);
|
||||
|
||||
for (i = 0;i < 1407; i++)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char text[16];
|
||||
exec sql end declare section;
|
||||
|
||||
exec sql select perftest1.ascii into :text from perftest1, perftest2 where perftest1.number = perftest2.number and perftest2.number = :i;
|
||||
}
|
||||
|
||||
exec sql commit;
|
||||
|
||||
gettimeofday(&tve, NULL);
|
||||
|
||||
print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "join");
|
||||
|
||||
exec sql begin transaction;
|
||||
|
||||
gettimeofday(&tvs, NULL);
|
||||
|
||||
exec sql update perftest2 set next_number = next_number + 1;
|
||||
|
||||
exec sql commit;
|
||||
|
||||
gettimeofday(&tve, NULL);
|
||||
|
||||
print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "update");
|
||||
|
||||
exec sql begin transaction;
|
||||
|
||||
gettimeofday(&tvs, NULL);
|
||||
|
||||
exec sql delete from perftest2;
|
||||
|
||||
exec sql commit;
|
||||
|
||||
gettimeofday(&tve, NULL);
|
||||
|
||||
print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "delete");
|
||||
|
||||
exec sql set autocommit = off;
|
||||
|
||||
exec sql drop index number2;
|
||||
|
||||
exec sql drop table perftest2;
|
||||
|
||||
exec sql drop index number1;
|
||||
|
||||
exec sql drop table perftest1;
|
||||
|
||||
exec sql commit;
|
||||
|
||||
exec sql disconnect;
|
||||
|
||||
return (0);
|
||||
}
|
@ -1,206 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* just a test comment */ exec sql whenever sqlerror do PrintAndStop(msg);
|
||||
exec sql whenever sqlwarning do warn();
|
||||
|
||||
static void PrintAndStop(char *msg)
|
||||
{
|
||||
fprintf(stderr, "Error in statement '%s':\n", msg);
|
||||
sqlprint();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
static void warn(void)
|
||||
{
|
||||
fprintf(stderr, "Warning: At least one column was truncated\n");
|
||||
}
|
||||
|
||||
/* comment */
|
||||
exec sql define AMOUNT 6;
|
||||
exec sql define NAMELEN 8;
|
||||
|
||||
exec sql type intarray is int[AMOUNT];
|
||||
|
||||
typedef int intarray[AMOUNT];
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
exec sql ifdef NAMELEN;
|
||||
typedef char string[NAMELEN];
|
||||
intarray amount;
|
||||
int increment=100;
|
||||
char name[AMOUNT][NAMELEN];
|
||||
char letter[AMOUNT][1];
|
||||
struct name_letter_struct
|
||||
{
|
||||
char name[NAMELEN];
|
||||
int amount;
|
||||
char letter;
|
||||
} name_letter[AMOUNT];
|
||||
#if 0
|
||||
int not_used;
|
||||
#endif
|
||||
exec sql endif;
|
||||
struct ind_struct
|
||||
{
|
||||
short a;
|
||||
short b;
|
||||
short c;
|
||||
} ind[AMOUNT];
|
||||
char command[128];
|
||||
char *connection="pm";
|
||||
int how_many;
|
||||
char *user="postgres";
|
||||
exec sql end declare section;
|
||||
exec sql var name is string[AMOUNT];
|
||||
char msg[128];
|
||||
FILE *dbgs;
|
||||
int i,j;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
strcpy(msg, "connect");
|
||||
exec sql connect to mm as main;
|
||||
|
||||
strcpy(msg, "connect");
|
||||
exec sql connect to pm user :user;
|
||||
|
||||
strcpy(msg, "create");
|
||||
exec sql at main create table "Test" (name char(NAMELEN), amount int, letter char(1));
|
||||
exec sql create table "Test" (name char(NAMELEN), amount int, letter char(1));
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql at main commit;
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "set connection");
|
||||
exec sql set connection to main;
|
||||
|
||||
strcpy(msg, "execute insert 1");
|
||||
sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''mm''', 1, 'f')");
|
||||
exec sql execute immediate :command;
|
||||
printf("New tuple got OID = %ld\n", sqlca.sqlerrd[1]);
|
||||
|
||||
sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''mm''', 2, 't')");
|
||||
exec sql execute immediate :command;
|
||||
|
||||
strcpy(msg, "execute insert 2");
|
||||
sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''pm''', 1, 'f')");
|
||||
exec sql at pm execute immediate :command;
|
||||
|
||||
strcpy(msg, "execute insert 3");
|
||||
sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+10, letter from \"Test\"");
|
||||
exec sql execute immediate :command;
|
||||
|
||||
printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
|
||||
|
||||
strcpy(msg, "execute insert 4");
|
||||
sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+?, letter from \"Test\"");
|
||||
exec sql prepare I from :command;
|
||||
exec sql at pm execute I using :increment;
|
||||
|
||||
printf("Inserted %ld tuples via prepared execute\n", sqlca.sqlerrd[2]);
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
/* Start automatic transactioning for connection pm. */
|
||||
exec sql at pm set autocommit to on;
|
||||
exec sql at pm begin transaction;
|
||||
|
||||
strcpy(msg, "select");
|
||||
exec sql select * into :name, :amount, :letter from "Test";
|
||||
|
||||
printf("Database: mm\n");
|
||||
for (i=0, how_many=j=sqlca.sqlerrd[2]; i<j; i++)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char n[8], l = letter[i][0];
|
||||
int a = amount[i];
|
||||
exec sql end declare section;
|
||||
|
||||
strncpy(n, name[i], NAMELEN);
|
||||
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
|
||||
amount[i]+=1000;
|
||||
|
||||
strcpy(msg, "insert");
|
||||
exec sql at pm insert into "Test" (name, amount, letter) values (:n, :amount[i], :l);
|
||||
}
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql at pm commit;
|
||||
|
||||
sprintf (command, "select * from \"Test\"");
|
||||
|
||||
exec sql prepare F from :command;
|
||||
exec sql declare CUR cursor for F;
|
||||
|
||||
strcpy(msg, "open");
|
||||
exec sql open CUR;
|
||||
|
||||
strcpy(msg, "fetch");
|
||||
exec sql fetch :how_many in CUR into :name, :amount, :letter;
|
||||
|
||||
printf("Database: mm\n");
|
||||
for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char n[8], l = letter[i][0];
|
||||
int a = amount[i];
|
||||
exec sql end declare section;
|
||||
|
||||
strncpy(n, name[i], 8);
|
||||
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
|
||||
}
|
||||
|
||||
exec sql close CUR;
|
||||
|
||||
strcpy(msg, "select");
|
||||
exec sql at :connection select name, amount, letter into :name, :amount, :letter from "Test";
|
||||
|
||||
printf("Database: %s\n", connection);
|
||||
for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
|
||||
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "select");
|
||||
exec sql at pm select name, amount, letter into :name_letter:ind from "Test";
|
||||
|
||||
printf("Database: pm\n");
|
||||
for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
|
||||
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name_letter[i].name, i, name_letter[i].amount,i, name_letter[i].letter);
|
||||
|
||||
name_letter[4].amount=1407;
|
||||
strcpy(msg, "insert");
|
||||
exec sql insert into "Test" (name, amount, letter) values (:name_letter[4]);
|
||||
|
||||
strcpy(msg, "select");
|
||||
exec sql select name, amount, letter into :name_letter[2] from "Test" where amount = 1407;
|
||||
|
||||
printf("Database: mm\n");
|
||||
printf("name[2]=%8.8s\tamount[2]=%d\tletter[2]=%c\n", name_letter[2].name, name_letter[2].amount, name_letter[2].letter);
|
||||
|
||||
/* Start automatic transactioning for connection main. */
|
||||
exec sql set autocommit to on;
|
||||
|
||||
strcpy(msg, "drop");
|
||||
exec sql drop table "Test";
|
||||
exec sql at pm drop table "Test";
|
||||
|
||||
strcpy(msg, "disconnect");
|
||||
exec sql disconnect main;
|
||||
exec sql disconnect pm;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
@ -1,132 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
exec sql include header_test;
|
||||
|
||||
exec sql type c is char reference;
|
||||
typedef char* c;
|
||||
|
||||
exec sql type ind is union { int integer; short smallint; };
|
||||
typedef union { int integer; short smallint; } ind;
|
||||
|
||||
#define BUFFERSIZ 8
|
||||
exec sql type str is varchar[BUFFERSIZ];
|
||||
|
||||
exec sql declare cur cursor for
|
||||
select name, born, age, married, children from meskes;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
exec sql struct birthinfo { long born; short age; };
|
||||
exec sql begin declare section;
|
||||
struct personal_struct { str name;
|
||||
struct birthinfo birth;
|
||||
} personal, *p;
|
||||
struct personal_indicator { int ind_name;
|
||||
struct birthinfo ind_birth;
|
||||
} ind_personal, *i;
|
||||
ind ind_children;
|
||||
char *query="select name, born, age, married, children from meskes where name = :var1";
|
||||
exec sql end declare section;
|
||||
|
||||
exec sql char *married = NULL;
|
||||
exec sql float ind_married;
|
||||
exec sql ind children;
|
||||
|
||||
exec sql var ind_married is long;
|
||||
|
||||
char msg[128];
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
strcpy(msg, "connect");
|
||||
exec sql connect to tcp:postgresql://127.0.0.1:5432/mm;
|
||||
|
||||
strcpy(msg, "create");
|
||||
exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
|
||||
|
||||
strcpy(msg, "insert");
|
||||
exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3);
|
||||
exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
|
||||
exec sql insert into meskes(name, born, age) values ('Carsten', 19910103,10);
|
||||
exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
|
||||
exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "open");
|
||||
exec sql open cur;
|
||||
|
||||
exec sql whenever not found do break;
|
||||
|
||||
p=&personal;
|
||||
i=&ind_personal;
|
||||
memset(i, 0, sizeof(ind_personal));
|
||||
while (1) {
|
||||
strcpy(msg, "fetch");
|
||||
exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint;
|
||||
printf("%8.8s", personal.name.arr);
|
||||
if (i->ind_birth.born >= 0)
|
||||
printf(", born %ld", personal.birth.born);
|
||||
if (i->ind_birth.age >= 0)
|
||||
printf(", age = %d", personal.birth.age);
|
||||
if ((long)ind_married >= 0)
|
||||
printf(", married %s", married);
|
||||
if (ind_children.smallint >= 0)
|
||||
printf(", children = %d", children.integer);
|
||||
putchar('\n');
|
||||
|
||||
free(married);
|
||||
married = NULL;
|
||||
}
|
||||
|
||||
strcpy(msg, "close");
|
||||
exec sql close cur;
|
||||
|
||||
/* and now a same query with prepare */
|
||||
exec sql prepare MM from :query;
|
||||
exec sql declare prep cursor for MM;
|
||||
|
||||
strcpy(msg, "open");
|
||||
exec sql open prep using 'Petra';
|
||||
|
||||
exec sql whenever not found do break;
|
||||
|
||||
while (1) {
|
||||
strcpy(msg, "fetch");
|
||||
exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children.integer:ind_children.smallint;
|
||||
printf("%8.8s", personal.name.arr);
|
||||
if (ind_personal.ind_birth.born >= 0)
|
||||
printf(", born %ld", personal.birth.born);
|
||||
if (ind_personal.ind_birth.age >= 0)
|
||||
printf(", age = %d", personal.birth.age);
|
||||
if ((long)ind_married >= 0)
|
||||
printf(", married %s", married);
|
||||
if (ind_children.smallint >= 0)
|
||||
printf(", children = %d", children.integer);
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
free(married);
|
||||
|
||||
strcpy(msg, "close");
|
||||
exec sql close prep;
|
||||
|
||||
strcpy(msg, "drop");
|
||||
exec sql drop table meskes;
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "disconnect");
|
||||
exec sql disconnect;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
/****************************************************************************/
|
||||
/* Test comment */
|
||||
/*--------------------------------------------------------------------------*/
|
||||
exec sql include header_test;
|
||||
|
||||
exec sql type str is varchar[10];
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
typedef struct { long born; short age; } birthinfo;
|
||||
struct personal_struct { str name;
|
||||
birthinfo birth;
|
||||
} personal;
|
||||
struct personal_indicator { int ind_name;
|
||||
birthinfo ind_birth;
|
||||
} ind_personal;
|
||||
int *ind_married = NULL;
|
||||
int children, movevalue = 2;
|
||||
int ind_children;
|
||||
str *married = NULL;
|
||||
char *wifesname="Petra";
|
||||
char *query="select * from meskes where name = ?";
|
||||
exec sql end declare section;
|
||||
|
||||
exec sql declare cur cursor for
|
||||
select name, born, age, married, children from meskes;
|
||||
|
||||
char msg[128];
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
strcpy(msg, "connect");
|
||||
exec sql connect to unix:postgresql://localhost:5432/mm;
|
||||
|
||||
strcpy(msg, "create");
|
||||
exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
|
||||
|
||||
strcpy(msg, "insert");
|
||||
exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3);
|
||||
exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
|
||||
exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 10);
|
||||
exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
|
||||
exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "open");
|
||||
exec sql open cur;
|
||||
|
||||
strcpy(msg, "move");
|
||||
exec sql move :movevalue in cur;
|
||||
|
||||
exec sql whenever not found do break;
|
||||
|
||||
while (1) {
|
||||
strcpy(msg, "fetch");
|
||||
exec sql fetch from cur into :personal:ind_personal, :married:ind_married, :children:ind_children;
|
||||
printf("%8.8s", personal.name.arr);
|
||||
if (ind_personal.ind_birth.born >= 0)
|
||||
printf(", born %ld", personal.birth.born);
|
||||
if (ind_personal.ind_birth.age >= 0)
|
||||
printf(", age = %d", personal.birth.age);
|
||||
if (*ind_married >= 0)
|
||||
printf(", married %10.10s", married->arr);
|
||||
if (ind_children >= 0)
|
||||
printf(", children = %d", children);
|
||||
putchar('\n');
|
||||
|
||||
free(married);
|
||||
married = NULL;
|
||||
}
|
||||
|
||||
strcpy(msg, "close");
|
||||
exec sql close cur;
|
||||
|
||||
/* and now a query with prepare */
|
||||
exec sql prepare MM from :query;
|
||||
exec sql declare prep cursor for MM;
|
||||
|
||||
strcpy(msg, "open");
|
||||
exec sql open prep using :wifesname;
|
||||
|
||||
exec sql whenever not found do break;
|
||||
|
||||
while (1) {
|
||||
strcpy(msg, "fetch");
|
||||
exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children;
|
||||
printf("%8.8s", personal.name.arr);
|
||||
if (ind_personal.ind_birth.born >= 0)
|
||||
printf(", born %ld", personal.birth.born);
|
||||
if (ind_personal.ind_birth.age >= 0)
|
||||
printf(", age = %d", personal.birth.age);
|
||||
if (*ind_married >= 0)
|
||||
printf(", married %10.10s", married->arr);
|
||||
if (ind_children >= 0)
|
||||
printf(", children = %d", children);
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
free(married);
|
||||
|
||||
strcpy(msg, "close");
|
||||
exec sql close prep;
|
||||
|
||||
strcpy(msg, "drop");
|
||||
exec sql drop table meskes;
|
||||
|
||||
strcpy(msg, "commit");
|
||||
exec sql commit;
|
||||
|
||||
strcpy(msg, "disconnect");
|
||||
exec sql disconnect;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
@ -1,101 +0,0 @@
|
||||
#include <locale.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
exec sql whenever sqlerror sqlprint;
|
||||
|
||||
exec sql include sqlca;
|
||||
|
||||
EXEC SQL type errtype is enum
|
||||
{
|
||||
OK = 0,
|
||||
ERR = 1,
|
||||
WARN = 2
|
||||
};
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
struct
|
||||
{
|
||||
errtype e :2;
|
||||
int code :14;
|
||||
} error = {1, 147};
|
||||
int i = 1;
|
||||
int *did = &i;
|
||||
int a[10] = {9,8,7,6,5,4,3,2,1,0};
|
||||
char text[25] = "klmnopqrst";
|
||||
char *t = (char *)malloc(10);
|
||||
double f;
|
||||
bool b = true;
|
||||
varchar database[3];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
FILE *dbgs;
|
||||
|
||||
strcpy(t, "0123456789");
|
||||
setlocale(LC_ALL, "de_DE");
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
strcpy(database.arr, "mm");
|
||||
EXEC SQL CONNECT TO :database;
|
||||
|
||||
EXEC SQL SET AUTOCOMMIT = ON;
|
||||
|
||||
EXEC SQL BEGIN WORK;
|
||||
|
||||
EXEC SQL CREATE TABLE test (f float, i int, a int[10], text char(10), b bool, t int, err int);
|
||||
|
||||
EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(404.90,3,'{0,1,2,3,4,5,6,7,8,9}','abcdefghij','f',0,0);
|
||||
|
||||
EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(140787.0,2,:a,:text,'t',2,14);
|
||||
|
||||
EXEC SQL IFDEF BIT_FIELD_IS_NOT_ACCESSIBLE;
|
||||
EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,:error);
|
||||
EXEC SQL ELSE;
|
||||
EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,1,147);
|
||||
error.code=0;
|
||||
EXEC SQL ENDIF;
|
||||
|
||||
EXEC SQL COMMIT;
|
||||
|
||||
EXEC SQL BEGIN WORK;
|
||||
|
||||
EXEC SQL SELECT f,text,b
|
||||
INTO :f,:text,:b
|
||||
FROM test
|
||||
WHERE i = 1;
|
||||
|
||||
printf("Found f=%f text=%10.10s b=%d\n", f, text, b);
|
||||
|
||||
f=140787;
|
||||
EXEC SQL SELECT a,text
|
||||
INTO :a,:t
|
||||
FROM test
|
||||
WHERE f = :f;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
printf("Found a[%d] = %d\n", i, a[i]);
|
||||
|
||||
printf("Found text=%10.10s\n", t);
|
||||
|
||||
EXEC SQL SELECT a
|
||||
INTO :text
|
||||
FROM test
|
||||
WHERE f = :f;
|
||||
|
||||
printf("Found text=%s\n", text);
|
||||
|
||||
EXEC SQL DROP TABLE test;
|
||||
|
||||
EXEC SQL COMMIT;
|
||||
|
||||
EXEC SQL DISCONNECT;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return (0);
|
||||
}
|
@ -1,109 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
EXEC SQL typedef long mmInteger;
|
||||
EXEC SQL typedef char mmChar;
|
||||
EXEC SQL typedef short mmSmallInt;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
struct TBempl
|
||||
{
|
||||
mmInteger idnum;
|
||||
mmChar name[21];
|
||||
mmSmallInt accs;
|
||||
mmChar byte[20];
|
||||
};
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
struct TBempl empl;
|
||||
char *data = "\\001\\155\\000\\212";
|
||||
union
|
||||
{
|
||||
mmSmallInt accs;
|
||||
char t[2];
|
||||
} a;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
FILE *dbgs;
|
||||
int i;
|
||||
|
||||
if ((dbgs = fopen ("log", "w")) != NULL)
|
||||
ECPGdebug (1, dbgs);
|
||||
|
||||
empl.idnum = 1;
|
||||
EXEC SQL connect to mm;
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("connect error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
|
||||
EXEC SQL create table empl
|
||||
(idnum integer, name char (20), accs smallint, byte bytea);
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("create error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
|
||||
EXEC SQL insert into empl values (1, 'first user', 320,:data);
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("insert error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
|
||||
EXEC SQL select name, accs, byte
|
||||
into :empl.name, :empl.accs, :empl.byte
|
||||
from empl
|
||||
where idnum =:empl.idnum;
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("select error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
|
||||
|
||||
EXEC SQL DECLARE C CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
|
||||
EXEC SQL OPEN C;
|
||||
EXEC SQL FETCH C INTO:empl.name,:empl.accs,:empl.byte;
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("fetch error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
|
||||
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
|
||||
|
||||
memset(empl.name, 0, 21L);
|
||||
memset(empl.byte, '#', 20L);
|
||||
EXEC SQL DECLARE B BINARY CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
|
||||
EXEC SQL OPEN B;
|
||||
EXEC SQL FETCH B INTO :empl.name,:a.accs,:empl.byte;
|
||||
if (sqlca.sqlcode)
|
||||
{
|
||||
printf ("fetch error = %ld\n", sqlca.sqlcode);
|
||||
exit (sqlca.sqlcode);
|
||||
}
|
||||
|
||||
EXEC SQL CLOSE B;
|
||||
|
||||
i=a.t[0];
|
||||
a.t[0]=a.t[1];
|
||||
a.t[1]=i;
|
||||
|
||||
printf ("name=%s, accs=%d byte=", empl.name, a.accs);
|
||||
for (i=0; i<20; i++)
|
||||
{
|
||||
if (empl.byte[i] == '#')
|
||||
break;
|
||||
printf("(%o)", (unsigned char)empl.byte[i]);
|
||||
}
|
||||
printf("\n");
|
||||
EXEC SQL disconnect;
|
||||
fclose (dbgs);
|
||||
exit (0);
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
// $PostgreSQL: pgsql/src/interfaces/ecpg/test/test_code100.pgc,v 1.3 2003/11/29 22:41:18 pgsql Exp $
|
||||
|
||||
exec sql include sqlca;
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{ exec sql begin declare section;
|
||||
int index;
|
||||
exec sql end declare section;
|
||||
|
||||
|
||||
// ECPGdebug(1,stdout);
|
||||
|
||||
exec sql connect to mm;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql create table test (
|
||||
"index" numeric(3) primary key,
|
||||
"payload" int4 NOT NULL);
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
exec sql commit work;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
for (index=0;index<10;++index)
|
||||
{ exec sql insert into test
|
||||
(payload, index)
|
||||
values (0, :index);
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
}
|
||||
exec sql commit work;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql update test
|
||||
set payload=payload+1 where index=-1;
|
||||
if (sqlca.sqlcode!=100) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql delete from test where index=-1;
|
||||
if (sqlca.sqlcode!=100) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql insert into test (select * from test where index=-1);
|
||||
if (sqlca.sqlcode!=100) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql drop table test;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
exec sql commit work;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql disconnect;
|
||||
if (sqlca.sqlcode) printf("%ld:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
return 0;
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
EXEC SQL WHENEVER SQLERROR SQLPRINT;
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char *stmt1 = "INSERT INTO test1 VALUES (?, ?)";
|
||||
char *stmt2 = "SELECT * from test1 where a = ? and b = ?";
|
||||
char *stmt3 = "SELECT * from test1 where a = ?";
|
||||
|
||||
int val1 = 1;
|
||||
char val2[] = "one", val2output[] = "AAA";
|
||||
int val1output = 2, val2i = 0;
|
||||
int val2null = -1;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
EXEC SQL ALLOCATE DESCRIPTOR indesc;
|
||||
EXEC SQL ALLOCATE DESCRIPTOR outdesc;
|
||||
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = :val1;
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 2 INDICATOR = :val2i, DATA = :val2;
|
||||
|
||||
EXEC SQL CONNECT TO mm;
|
||||
|
||||
EXEC SQL CREATE TABLE test1 (a int, b text);
|
||||
EXEC SQL PREPARE foo1 FROM :stmt1;
|
||||
EXEC SQL PREPARE foo2 FROM :stmt2;
|
||||
EXEC SQL PREPARE foo3 FROM :stmt3;
|
||||
|
||||
EXEC SQL EXECUTE foo1 USING DESCRIPTOR indesc;
|
||||
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = 2;
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 2 INDICATOR = :val2null, DATA = :val2;
|
||||
|
||||
EXEC SQL EXECUTE foo1 USING DESCRIPTOR indesc;
|
||||
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = :val1;
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 2 INDICATOR = :val2i, DATA = :val2;
|
||||
|
||||
EXEC SQL EXECUTE foo2 USING DESCRIPTOR indesc INTO DESCRIPTOR outdesc;
|
||||
|
||||
EXEC SQL GET DESCRIPTOR outdesc VALUE 1 :val2output = DATA;
|
||||
printf("output = %s\n", val2output);
|
||||
|
||||
EXEC SQL DECLARE c1 CURSOR FOR foo2;
|
||||
EXEC SQL OPEN c1 USING DESCRIPTOR indesc;
|
||||
|
||||
EXEC SQL FETCH next FROM c1 INTO :val1output, :val2output;
|
||||
printf("val1=%d val2=%s\n", val1output, val2output);
|
||||
|
||||
EXEC SQL CLOSE c1;
|
||||
|
||||
EXEC SQL SET DESCRIPTOR indesc COUNT = 1;
|
||||
EXEC SQL SET DESCRIPTOR indesc VALUE 1 DATA = 2;
|
||||
|
||||
EXEC SQL DECLARE c2 CURSOR FOR foo3;
|
||||
EXEC SQL OPEN c2 USING DESCRIPTOR indesc;
|
||||
|
||||
EXEC SQL FETCH next FROM c2 INTO :val1output, :val2output :val2i;
|
||||
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
|
||||
|
||||
EXEC SQL CLOSE c2;
|
||||
|
||||
EXEC SQL SELECT * INTO :val1output, :val2output :val2i FROM test1 where a = 2;
|
||||
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
|
||||
|
||||
EXEC SQL DROP TABLE test1;
|
||||
EXEC SQL DISCONNECT;
|
||||
|
||||
EXEC SQL DEALLOCATE DESCRIPTOR indesc;
|
||||
EXEC SQL DEALLOCATE DESCRIPTOR outdesc;
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
EXEC SQL CONNECT TO mm;
|
||||
|
||||
EXEC SQL SET AUTOCOMMIT TO ON;
|
||||
EXEC SQL WHENEVER SQLWARNING SQLPRINT;
|
||||
EXEC SQL WHENEVER SQLERROR SQLPRINT;
|
||||
|
||||
EXEC SQL CREATE TABLE My_Table ( Item1 int, Item2 text );
|
||||
|
||||
EXEC SQL CREATE FUNCTION My_Table_Check() RETURNS trigger
|
||||
AS $test$
|
||||
BEGIN
|
||||
RAISE NOTICE 'TG_NAME=%, TG WHEN=%', TG_NAME, TG_WHEN;
|
||||
RETURN NEW;
|
||||
END; $test$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
EXEC SQL CREATE TRIGGER My_Table_Check_Trigger
|
||||
BEFORE INSERT
|
||||
ON My_Table
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE My_Table_Check();
|
||||
|
||||
EXEC SQL INSERT INTO My_Table VALUES (1234, 'Some random text');
|
||||
EXEC SQL INSERT INTO My_Table VALUES (5678, 'The Quick Brown');
|
||||
|
||||
EXEC SQL DROP TRIGGER My_Table_Check_Trigger ON My_Table;
|
||||
EXEC SQL DROP FUNCTION My_Table_Check();
|
||||
EXEC SQL DROP TABLE My_Table;
|
||||
|
||||
EXEC SQL DISCONNECT ALL;
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
#include "sqltypes.h"
|
||||
|
||||
static void openit(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
$int i = 14;
|
||||
$decimal j, m, n;
|
||||
FILE *dbgs;
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
$connect to mm;
|
||||
|
||||
$create table test(i int primary key, j int);
|
||||
|
||||
rsetnull(CDECIMALTYPE, (char *)&j);
|
||||
$insert into test (i, j) values (7, :j);
|
||||
$commit;
|
||||
|
||||
$insert into test (i, j) values (7, 2);
|
||||
printf("INSERT: %ld=%s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
|
||||
if (sqlca.sqlcode != 0) $rollback;
|
||||
|
||||
$insert into test (i, j) values (:i, 1);
|
||||
$commit;
|
||||
|
||||
$select i from test where j=(select j from test);
|
||||
printf("SELECT: %ld=%s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
|
||||
if (sqlca.sqlcode != 0) $rollback;
|
||||
|
||||
$declare c cursor for select * from test where i <= :i;
|
||||
openit();
|
||||
|
||||
deccvint(0, &j);
|
||||
|
||||
while (1)
|
||||
{
|
||||
$fetch forward c into :i, :j;
|
||||
if (sqlca.sqlcode == 100) break;
|
||||
else if (sqlca.sqlcode != 0) printf ("Error: %ld\n", sqlca.sqlcode);
|
||||
|
||||
if (risnull(CDECIMALTYPE, (char *)&j))
|
||||
printf("%d NULL\n", i);
|
||||
else
|
||||
{
|
||||
int a;
|
||||
|
||||
dectoint(&j, &a);
|
||||
printf("%d %d\n", i, a);
|
||||
}
|
||||
}
|
||||
|
||||
deccvint(7, &j);
|
||||
deccvint(14, &m);
|
||||
decadd(&j, &m, &n);
|
||||
$delete from test where i=:n;
|
||||
printf("DELETE: %ld\n", sqlca.sqlcode);
|
||||
|
||||
$select 1 from test where i=14;
|
||||
printf("Exists: %ld\n", sqlca.sqlcode);
|
||||
|
||||
$select 1 from test where i=147;
|
||||
printf("Does not exist: %ld\n", sqlca.sqlcode);
|
||||
|
||||
$commit;
|
||||
$drop table test;
|
||||
$commit;
|
||||
|
||||
$close database;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void openit(void)
|
||||
{
|
||||
$open c;
|
||||
}
|
||||
|
@ -1,123 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "sqltypes.h"
|
||||
|
||||
EXEC SQL include sqlca.h;
|
||||
|
||||
/* Check SQLCODE, and produce a "standard error" if it's wrong! */
|
||||
static void sql_check(char *fn, char *caller, int ignore)
|
||||
{
|
||||
char errorstring[255];
|
||||
|
||||
if (SQLCODE == ignore)
|
||||
return;
|
||||
else
|
||||
{
|
||||
if (SQLCODE != 0)
|
||||
{
|
||||
|
||||
sprintf(errorstring, "**SQL error %ld doing '%s' in function '%s'. [%s]",
|
||||
SQLCODE, caller, fn, sqlca.sqlerrm.sqlerrmc);
|
||||
fprintf(stderr, "%s", errorstring);
|
||||
printf("%s\n", errorstring);
|
||||
|
||||
/* attempt a ROLLBACK */
|
||||
EXEC SQL rollback;
|
||||
|
||||
if (SQLCODE == 0)
|
||||
{
|
||||
sprintf(errorstring, "Rollback successful.\n");
|
||||
} else {
|
||||
sprintf(errorstring, "Rollback failed with code %ld.\n", SQLCODE);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s", errorstring);
|
||||
printf("%s\n", errorstring);
|
||||
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
int c;
|
||||
timestamp d;
|
||||
timestamp maxd;
|
||||
char dbname[30];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
EXEC SQL whenever sqlerror sqlprint;
|
||||
|
||||
strcpy(dbname, "mm");
|
||||
EXEC SQL connect to :dbname;
|
||||
sql_check("main", "connect", 0);
|
||||
|
||||
EXEC SQL create table history (customerid integer, timestamp timestamp without time zone, action_taken char(5), narrative varchar(100));
|
||||
sql_check("main", "create", 0);
|
||||
|
||||
EXEC SQL insert into history
|
||||
(customerid, timestamp, action_taken, narrative)
|
||||
values(1, now(), 'test', 'test');
|
||||
sql_check("main", "insert", 0);
|
||||
|
||||
EXEC SQL select max(timestamp)
|
||||
into :maxd
|
||||
from history;
|
||||
sql_check("main", "select max", 100);
|
||||
|
||||
if (risnull(CDTIMETYPE, (char *) &maxd))
|
||||
{
|
||||
printf("Nothing on the history table\n\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
EXEC SQL select customerid, timestamp
|
||||
into :c, :d
|
||||
from history
|
||||
where timestamp = :maxd
|
||||
limit 1;
|
||||
sql_check("main", "select", 0);
|
||||
|
||||
printf("Read in customer %d\n", c);
|
||||
|
||||
/* Adding 1 to d adds 1 second. So:
|
||||
60 1 minute
|
||||
3600 1 hour
|
||||
86400 1 day */
|
||||
d=d+86400;
|
||||
c++;
|
||||
|
||||
EXEC SQL insert into history
|
||||
(customerid, timestamp, action_taken, narrative)
|
||||
values(:c, :d, 'test', 'test');
|
||||
sql_check("main", "update", 0);
|
||||
|
||||
EXEC SQL commit;
|
||||
|
||||
EXEC SQL drop table history;
|
||||
sql_check("main", "drop", 0);
|
||||
|
||||
EXEC SQL commit;
|
||||
|
||||
EXEC SQL disconnect;
|
||||
sql_check("main", "disconnect", 0);
|
||||
|
||||
printf("All OK!\n");
|
||||
|
||||
exit(0);
|
||||
|
||||
/*
|
||||
Table "public.history"
|
||||
Column | Type | Modifiers
|
||||
--------------+-----------------------------+-----------
|
||||
customerid | integer | not null
|
||||
timestamp | timestamp without time zone | not null
|
||||
action_taken | character(5) | not null
|
||||
narrative | character varying(100) |
|
||||
*/
|
||||
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
exec sql include sqlca;
|
||||
|
||||
int fa(void) { return 2; }
|
||||
int fb(int x) { return x; }
|
||||
int fc(const char *x) { return *x; }
|
||||
int fd(const char *x,int i) { return (*x)*i; }
|
||||
enum e { ENUM0, ENUM1 };
|
||||
int fe(enum e x) { return (int)x; }
|
||||
struct sa { int member; };
|
||||
|
||||
void sqlmeldung(char *meldung, short trans)
|
||||
{
|
||||
}
|
||||
|
||||
exec sql define NONO 0;
|
||||
|
||||
#define YES 1
|
||||
|
||||
#ifdef _cplusplus
|
||||
namespace N
|
||||
{ static const int i=2;
|
||||
};
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
{ struct sa x,*y=&x;
|
||||
exec sql begin declare section;
|
||||
int a=(int)2;
|
||||
int b=2+2;
|
||||
int b2=(14*7);
|
||||
int d=x.member;
|
||||
int g=fb(2);
|
||||
int i=3^1;
|
||||
int j=1?1:2;
|
||||
|
||||
int e=y->member;
|
||||
int c=10>>2;
|
||||
bool h=2||1;
|
||||
long iay /* = 1L */ ;
|
||||
long long iax /* = 40000000000LL */ ;
|
||||
exec sql end declare section;
|
||||
|
||||
int f=fa();
|
||||
|
||||
#ifdef _cplusplus
|
||||
exec sql begin declare section;
|
||||
int k=N::i; /* compile error */
|
||||
exec sql end declare section;
|
||||
#endif
|
||||
|
||||
exec sql whenever sqlerror do fa();
|
||||
exec sql select now();
|
||||
exec sql whenever sqlerror do fb(20);
|
||||
exec sql select now();
|
||||
exec sql whenever sqlerror do fc("50");
|
||||
exec sql select now();
|
||||
exec sql whenever sqlerror do fd("50",1);
|
||||
exec sql select now();
|
||||
exec sql whenever sqlerror do fe(ENUM0);
|
||||
exec sql select now();
|
||||
exec sql whenever sqlerror do sqlmeldung(NULL, NONO);
|
||||
exec sql select now();
|
||||
return 0;
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
// $PostgreSQL: pgsql/src/interfaces/ecpg/test/test_notice.pgc,v 1.4 2003/11/29 22:41:18 pgsql Exp $
|
||||
|
||||
exec sql include sqlca;
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
static void printwarning(void)
|
||||
{
|
||||
if (sqlca.sqlwarn[0]) printf("sqlca.sqlwarn: %c",sqlca.sqlwarn[0]);
|
||||
else return;
|
||||
|
||||
if (sqlca.sqlwarn[1]) putchar('1');
|
||||
if (sqlca.sqlwarn[2]) putchar('2');
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
int payload;
|
||||
exec sql end declare section;
|
||||
FILE *dbgs;
|
||||
|
||||
/* actually this will print 'sql error' if a warning occurs */
|
||||
exec sql whenever sqlwarning do printwarning();
|
||||
|
||||
if ((dbgs = fopen("log", "w")) != NULL)
|
||||
ECPGdebug(1, dbgs);
|
||||
|
||||
exec sql connect to mm;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql create table test (
|
||||
"index" numeric(3) primary key,
|
||||
"payload" int4 NOT NULL);
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql commit work;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql begin work;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql begin work;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_IN_TRANSACTION) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql commit;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql commit;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_NO_TRANSACTION) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql rollback;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_NO_TRANSACTION) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
sqlca.sqlcode=0;
|
||||
exec sql declare x cursor for select * from test;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql open x;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql open x;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_PORTAL_EXISTS) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql close x;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql close x;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_UNKNOWN_PORTAL) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql update test set nonexistent=2;
|
||||
if (sqlca.sqlcode!=ECPG_PGSQL) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql select payload into :payload from test where index=1;
|
||||
if (sqlca.sqlcode!=ECPG_WARNING_QUERY_IGNORED) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql rollback;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
// this will raise a warning
|
||||
exec sql drop table test;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
exec sql commit work;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
exec sql disconnect;
|
||||
if (sqlca.sqlcode) printf("%d %ld:%s\n",__LINE__,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
if (dbgs != NULL)
|
||||
fclose(dbgs);
|
||||
return 0;
|
||||
}
|
@ -1,140 +0,0 @@
|
||||
/*
|
||||
* Thread test program
|
||||
* by Philip Yarra & Lee Kindness.
|
||||
*/
|
||||
|
||||
/* #define ECPGDEBUG */
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void *test_thread(void *arg);
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char *l_dbname;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
int nthreads = 2;
|
||||
int iterations = 10;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifdef ECPGDEBUG
|
||||
char debugfilename[] = "thread_test.log";
|
||||
FILE *debugfile;
|
||||
#endif
|
||||
pthread_t *threads;
|
||||
int n;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
int l_rows;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
/* parse command line arguments */
|
||||
if( (argc < 2) || (argc > 4) )
|
||||
{
|
||||
fprintf(stderr, "Usage: %s dbname [threads] [iterations_per_thread]\n", argv[0]);
|
||||
return( 1 );
|
||||
}
|
||||
l_dbname = argv[1];
|
||||
if( argc >= 3 )
|
||||
nthreads = atoi(argv[2]);
|
||||
if( argc == 4 )
|
||||
iterations = atoi(argv[3]);
|
||||
|
||||
/* open ECPG debug log? */
|
||||
#ifdef ECPGDEBUG
|
||||
debugfile = fopen(debugfilename, "w");
|
||||
if( debugfile != NULL )
|
||||
ECPGdebug(1, debugfile);
|
||||
else
|
||||
fprintf(stderr, "Cannot open ECPG debug log: %s\n", debugfilename);
|
||||
#endif
|
||||
|
||||
/* setup test_thread table */
|
||||
EXEC SQL CONNECT TO :l_dbname;
|
||||
EXEC SQL DROP TABLE test_thread; /* DROP might fail */
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL CREATE TABLE
|
||||
test_thread(tstamp TIMESTAMP NOT NULL DEFAULT CAST(timeofday() AS TIMESTAMP),
|
||||
thread TEXT NOT NULL,
|
||||
iteration INTEGER NOT NULL,
|
||||
PRIMARY KEY(thread, iteration));
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL DISCONNECT;
|
||||
|
||||
/* create, and start, threads */
|
||||
threads = calloc(nthreads, sizeof(pthread_t));
|
||||
if( threads == NULL )
|
||||
{
|
||||
fprintf(stderr, "Cannot alloc memory\n");
|
||||
return( 1 );
|
||||
}
|
||||
for( n = 0; n < nthreads; n++ )
|
||||
{
|
||||
pthread_create(&threads[n], NULL, test_thread, (void *) (n + 1));
|
||||
}
|
||||
|
||||
/* wait for thread completion */
|
||||
for( n = 0; n < nthreads; n++ )
|
||||
{
|
||||
pthread_join(threads[n], NULL);
|
||||
}
|
||||
free(threads);
|
||||
|
||||
/* and check results */
|
||||
EXEC SQL CONNECT TO :l_dbname;
|
||||
EXEC SQL SELECT COUNT(*) INTO :l_rows FROM test_thread;
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL DISCONNECT;
|
||||
if( l_rows == (nthreads * iterations) )
|
||||
printf("\nSuccess.\n");
|
||||
else
|
||||
printf("\nERROR: Failure - expecting %d rows, got %d.\n", nthreads * iterations, l_rows);
|
||||
|
||||
/* close ECPG debug log? */
|
||||
#ifdef ECPGDEBUG
|
||||
if( debugfile != NULL )
|
||||
{
|
||||
ECPGdebug(0, debugfile);
|
||||
fclose(debugfile);
|
||||
}
|
||||
#endif
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
void *test_thread(void *arg)
|
||||
{
|
||||
long threadnum = (long)arg;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
int l_i;
|
||||
char l_connection[128];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
/* build up connection name, and connect to database */
|
||||
snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);
|
||||
EXEC SQL WHENEVER sqlerror sqlprint;
|
||||
EXEC SQL CONNECT TO :l_dbname AS :l_connection;
|
||||
if( sqlca.sqlcode != 0 )
|
||||
{
|
||||
printf("%s: ERROR: cannot connect to database!\n", l_connection);
|
||||
return( NULL );
|
||||
}
|
||||
EXEC SQL AT :l_connection BEGIN;
|
||||
|
||||
/* insert into test_thread table */
|
||||
for( l_i = 1; l_i <= iterations; l_i++ )
|
||||
{
|
||||
printf("%s: inserting %d\n", l_connection, l_i);
|
||||
EXEC SQL AT :l_connection INSERT INTO test_thread(thread, iteration) VALUES(:l_connection, :l_i);
|
||||
if( sqlca.sqlcode == 0 )
|
||||
printf("%s: insert done\n", l_connection);
|
||||
else
|
||||
printf("%s: ERROR: insert failed!\n", l_connection);
|
||||
}
|
||||
|
||||
/* all done */
|
||||
EXEC SQL AT :l_connection COMMIT;
|
||||
EXEC SQL DISCONNECT :l_connection;
|
||||
printf("%s: done!\n", l_connection);
|
||||
return( NULL );
|
||||
}
|
@ -1,140 +0,0 @@
|
||||
/*
|
||||
* Thread test program
|
||||
* by Lee Kindness.
|
||||
*/
|
||||
|
||||
/* #define ECPGDEBUG */
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void *test_thread(void *arg);
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char *l_dbname;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
int nthreads = 2;
|
||||
int iterations = 10;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifdef ECPGDEBUG
|
||||
char debugfilename[] = "thread_test_implicit.log";
|
||||
FILE *debugfile;
|
||||
#endif
|
||||
pthread_t *threads;
|
||||
int n;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
int l_rows;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
/* parse command line arguments */
|
||||
if( (argc < 2) || (argc > 4) )
|
||||
{
|
||||
fprintf(stderr, "Usage: %s dbname [threads] [iterations_per_thread]\n", argv[0]);
|
||||
return( 1 );
|
||||
}
|
||||
l_dbname = argv[1];
|
||||
if( argc >= 3 )
|
||||
nthreads = atoi(argv[2]);
|
||||
if( argc == 4 )
|
||||
iterations = atoi(argv[3]);
|
||||
|
||||
/* open ECPG debug log? */
|
||||
#ifdef ECPGDEBUG
|
||||
debugfile = fopen(debugfilename, "w");
|
||||
if( debugfile != NULL )
|
||||
ECPGdebug(1, debugfile);
|
||||
else
|
||||
fprintf(stderr, "Cannot open ECPG debug log: %s\n", debugfilename);
|
||||
#endif
|
||||
|
||||
/* setup test_thread table */
|
||||
EXEC SQL CONNECT TO:l_dbname;
|
||||
EXEC SQL DROP TABLE test_thread; /* DROP might fail */
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL CREATE TABLE
|
||||
test_thread(tstamp TIMESTAMP NOT NULL DEFAULT CAST(timeofday() AS TIMESTAMP),
|
||||
thread TEXT NOT NULL,
|
||||
iteration INTEGER NOT NULL,
|
||||
PRIMARY KEY(thread, iteration));
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL DISCONNECT;
|
||||
|
||||
/* create, and start, threads */
|
||||
threads = calloc(nthreads, sizeof(pthread_t));
|
||||
if( threads == NULL )
|
||||
{
|
||||
fprintf(stderr, "Cannot alloc memory\n");
|
||||
return( 1 );
|
||||
}
|
||||
for( n = 0; n < nthreads; n++ )
|
||||
{
|
||||
pthread_create(&threads[n], NULL, test_thread, (void *) (n + 1));
|
||||
}
|
||||
|
||||
/* wait for thread completion */
|
||||
for( n = 0; n < nthreads; n++ )
|
||||
{
|
||||
pthread_join(threads[n], NULL);
|
||||
}
|
||||
free(threads);
|
||||
|
||||
/* and check results */
|
||||
EXEC SQL CONNECT TO :l_dbname;
|
||||
EXEC SQL SELECT COUNT(*) INTO :l_rows FROM test_thread;
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL DISCONNECT;
|
||||
if( l_rows == (nthreads * iterations) )
|
||||
printf("\nSuccess.\n");
|
||||
else
|
||||
printf("\nERROR: Failure - expecting %d rows, got %d.\n", nthreads * iterations, l_rows);
|
||||
|
||||
/* close ECPG debug log? */
|
||||
#ifdef ECPGDEBUG
|
||||
if( debugfile != NULL )
|
||||
{
|
||||
ECPGdebug(0, debugfile);
|
||||
fclose(debugfile);
|
||||
}
|
||||
#endif
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
void *test_thread(void *arg)
|
||||
{
|
||||
long threadnum = (long)arg;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
int l_i;
|
||||
char l_connection[128];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
/* build up connection name, and connect to database */
|
||||
snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);
|
||||
EXEC SQL WHENEVER sqlerror sqlprint;
|
||||
EXEC SQL CONNECT TO :l_dbname AS :l_connection;
|
||||
if( sqlca.sqlcode != 0 )
|
||||
{
|
||||
printf("%s: ERROR: cannot connect to database!\n", l_connection);
|
||||
return( NULL );
|
||||
}
|
||||
EXEC SQL BEGIN;
|
||||
|
||||
/* insert into test_thread table */
|
||||
for( l_i = 1; l_i <= iterations; l_i++ )
|
||||
{
|
||||
printf("%s: inserting %d\n", l_connection, l_i);
|
||||
EXEC SQL INSERT INTO test_thread(thread, iteration) VALUES(:l_connection, :l_i);
|
||||
if( sqlca.sqlcode == 0 )
|
||||
printf("%s: insert done\n", l_connection);
|
||||
else
|
||||
printf("%s: ERROR: insert failed!\n", l_connection);
|
||||
}
|
||||
|
||||
/* all done */
|
||||
EXEC SQL COMMIT;
|
||||
EXEC SQL DISCONNECT :l_connection;
|
||||
printf("%s: done!\n", l_connection);
|
||||
return( NULL );
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#include <stdio.h>
|
||||
exec sql include sqlca;
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
exec sql begin declare section;
|
||||
char **cpp=0;
|
||||
int *ipointer=0;
|
||||
exec sql end declare section;
|
||||
int i;
|
||||
|
||||
if (getenv("SQLOPT")) ECPGdebug(1,stderr);
|
||||
|
||||
exec sql whenever sqlerror do sqlprint();
|
||||
exec sql connect to postgres;
|
||||
|
||||
exec sql allocate descriptor mydesc;
|
||||
exec sql select tablename into descriptor mydesc from pg_tables;
|
||||
exec sql get descriptor mydesc value 1 :cpp=DATA, :ipointer=INDICATOR;
|
||||
|
||||
printf("Result ");
|
||||
for (i=0;i<sqlca.sqlerrd[2];++i)
|
||||
{ if (ipointer[i]) printf("NULL, ");
|
||||
else printf("'%s', ",cpp[i]);
|
||||
}
|
||||
ECPGfree_auto_mem();
|
||||
printf("\n");
|
||||
|
||||
exec sql deallocate descriptor mydesc;
|
||||
exec sql disconnect;
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user