Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf3dda5b

Browse files
author
Michael Meskes
committed
Data transferred binary is now put into the variables verbatim.
Also added a test case for a binary cursor.
1 parent73e3566 commitf3dda5b

File tree

5 files changed

+153
-58
lines changed

5 files changed

+153
-58
lines changed

‎src/interfaces/ecpg/ChangeLog

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,6 +1962,15 @@ Fri Dec 2 16:00:10 CET 2005
19621962

19631963
- Added special handling of CONNECTION variable that is used by ECPG
19641964
instead of given to the backend.
1965+
1966+
Fr Jan 13 17:29:30 CET 2006
1967+
1968+
- Fixed a fixed size buffer in preproc.y to be variable size since an
1969+
overflow could occur on the fixed one.
1970+
1971+
Tu Jan 17 18:53:03 CET 2006
1972+
1973+
- Data transferred binary is now put into the variables verbatim.
19651974
- Set ecpg library version to 5.2.
19661975
- Set ecpg version to 4.2.1.
19671976

‎src/interfaces/ecpg/ecpglib/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
# Copyright (c) 1994, Regents of the University of California
66
#
7-
# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.37 2005/12/09 21:19:35 petere Exp $
7+
# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.38 2006/01/1719:49:23 meskes Exp $
88
#
99
#-------------------------------------------------------------------------
1010

@@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global
1414

1515
NAME= ecpg
1616
SO_MAJOR_VERSION= 5
17-
SO_MINOR_VERSION=3
17+
SO_MINOR_VERSION=2
1818
DLTYPE= library
1919

2020
overrideCPPFLAGS := -DFRONTEND -I$(top_srcdir)/src/interfaces/ecpg/include\

‎src/interfaces/ecpg/ecpglib/data.c

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.29 2005/10/15 02:49:47 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.30 2006/01/17 19:49:23 meskes Exp $ */
22

33
#definePOSTGRES_ECPG_INTERNAL
44
#include"postgres_fe.h"
@@ -45,11 +45,12 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
4545
longind_offset,enumARRAY_TYPEisarray,enumCOMPAT_MODEcompat,boolforce_indicator)
4646
{
4747
structsqlca_t*sqlca=ECPGget_sqlca();
48-
char*pval= (char*)PQgetvalue(results,act_tuple,act_field);
49-
intvalue_for_indicator=0;
50-
51-
ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld array: %s\n",lineno,pval ?pval :"",offset,isarray ?"Yes" :"No");
48+
char*pval= (char*)PQgetvalue(results,act_tuple,act_field);
49+
intbinary=PQfformat(results,act_field);
50+
intsize=PQgetlength(results,act_tuple,act_field);
51+
intvalue_for_indicator=0;
5252

53+
ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld array: %s\n",lineno,pval ? (binary ?"BINARY" :pval) :"EMPTY",offset,isarray ?"Yes" :"No");
5354
/* We will have to decode the value */
5455

5556
/*
@@ -131,6 +132,50 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
131132

132133
do
133134
{
135+
if (binary)
136+
{
137+
if (pval)
138+
{
139+
if (varcharsize==0||varcharsize*offset >=size)
140+
memcpy((char*) ((long)var+offset*act_tuple),pval,size);
141+
else
142+
{
143+
memcpy((char*) ((long)var+offset*act_tuple),pval,varcharsize*offset);
144+
145+
if (varcharsize*offset<size)
146+
{
147+
/* truncation */
148+
switch (ind_type)
149+
{
150+
caseECPGt_short:
151+
caseECPGt_unsigned_short:
152+
*((short*) (ind+ind_offset*act_tuple))=size;
153+
break;
154+
caseECPGt_int:
155+
caseECPGt_unsigned_int:
156+
*((int*) (ind+ind_offset*act_tuple))=size;
157+
break;
158+
caseECPGt_long:
159+
caseECPGt_unsigned_long:
160+
*((long*) (ind+ind_offset*act_tuple))=size;
161+
break;
162+
#ifdefHAVE_LONG_LONG_INT_64
163+
caseECPGt_long_long:
164+
caseECPGt_unsigned_long_long:
165+
*((long longint*) (ind+ind_offset*act_tuple))=size;
166+
break;
167+
#endif/* HAVE_LONG_LONG_INT_64 */
168+
default:
169+
break;
170+
}
171+
sqlca->sqlwarn[0]=sqlca->sqlwarn[1]='W';
172+
}
173+
}
174+
pval+=size;
175+
}
176+
}
177+
else
178+
{
134179
switch (type)
135180
{
136181
longres;
@@ -619,6 +664,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
619664
if (*pval==' ')
620665
++pval;
621666
}
667+
}
622668
}while (*pval!='\0'&& ((isarray==ECPG_ARRAY_ARRAY&&*pval!='}')||isarray==ECPG_ARRAY_VECTOR));
623669

624670
return (true);

‎src/interfaces/ecpg/preproc/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
# Copyright (c) 1998-2005, PostgreSQL Global Development Group
66
#
7-
# $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.117 2005/12/09 21:19:36 petere Exp $
7+
# $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.118 2006/01/1719:49:23 meskes Exp $
88
#
99
#-------------------------------------------------------------------------
1010

@@ -14,7 +14,7 @@ top_builddir = ../../../..
1414
include$(top_builddir)/src/Makefile.global
1515

1616
MAJOR_VERSION= 4
17-
MINOR_VERSION=3
17+
MINOR_VERSION=2
1818
PATCHLEVEL=1
1919

2020
overrideCPPFLAGS := -I$(srcdir)/../include -I$(srcdir)$(CPPFLAGS)\

‎src/interfaces/ecpg/test/test5.pgc

Lines changed: 89 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,60 +7,100 @@ EXEC SQL typedef short mmSmallInt;
77

88
EXEC SQL BEGIN DECLARE SECTION;
99
struct TBempl
10-
{
11-
mmInteger idnum;
12-
mmChar name[21];
13-
mmSmallInt accs;
14-
};
10+
{
11+
mmInteger idnum;
12+
mmChar name[21];
13+
mmSmallInt accs;
14+
mmChar byte[20];
15+
};
1516
EXEC SQL END DECLARE SECTION;
1617

17-
int main(void)
18+
int
19+
main (void)
1820
{
19-
EXEC SQL BEGIN DECLARE SECTION;
20-
struct TBempl empl;
21-
EXEC SQL END DECLARE SECTION;
22-
FILE *dbgs;
21+
EXEC SQL BEGIN DECLARE SECTION;
22+
struct TBempl empl;
23+
char *data = "\\001\\155\\000\\212";
24+
union
25+
{
26+
mmSmallInt accs;
27+
char t[2];
28+
} a;
29+
EXEC SQL END DECLARE SECTION;
30+
FILE *dbgs;
31+
int i;
32+
33+
if ((dbgs = fopen ("log", "w")) != NULL)
34+
ECPGdebug (1, dbgs);
35+
36+
empl.idnum = 1;
37+
EXEC SQL connect to mm;
38+
if (sqlca.sqlcode)
39+
{
40+
printf ("connect error = %ld\n", sqlca.sqlcode);
41+
exit (sqlca.sqlcode);
42+
}
43+
44+
EXEC SQL create table empl
45+
(idnum integer, name char (20), accs smallint, byte bytea);
46+
if (sqlca.sqlcode)
47+
{
48+
printf ("create error = %ld\n", sqlca.sqlcode);
49+
exit (sqlca.sqlcode);
50+
}
51+
52+
EXEC SQL insert into empl values (1, 'first user', 320,:data);
53+
if (sqlca.sqlcode)
54+
{
55+
printf ("insert error = %ld\n", sqlca.sqlcode);
56+
exit (sqlca.sqlcode);
57+
}
58+
59+
EXEC SQL select name, accs, byte into:empl.name,:empl.accs,:empl.byte from empl where idnum =:empl.idnum;
60+
if (sqlca.sqlcode)
61+
{
62+
printf ("select error = %ld\n", sqlca.sqlcode);
63+
exit (sqlca.sqlcode);
64+
}
65+
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
66+
67+
EXEC SQL DECLARE C CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
68+
EXEC SQL OPEN C;
69+
EXEC SQL FETCH C INTO:empl.name,:empl.accs,:empl.byte;
70+
if (sqlca.sqlcode)
71+
{
72+
printf ("fetch error = %ld\n", sqlca.sqlcode);
73+
exit (sqlca.sqlcode);
74+
}
2375

24-
if ((dbgs = fopen("log", "w")) != NULL)
25-
ECPGdebug(1, dbgs);
26-
27-
empl.idnum = 1;
28-
EXEC SQL connect to mm;
29-
if (sqlca.sqlcode)
30-
{
31-
printf("connect error = %ld\n", sqlca.sqlcode);
32-
exit(sqlca.sqlcode);
33-
}
76+
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
3477

35-
EXEC SQL create table empl
36-
(
37-
idnum integer,
38-
name char(20),
39-
accs smallint
40-
);
41-
if (sqlca.sqlcode)
42-
{
43-
printf("select error = %ld\n", sqlca.sqlcode);
44-
exit(sqlca.sqlcode);
45-
}
78+
memset(empl.name, 0, 21L);
79+
memset(empl.byte, '#', 20L);
80+
EXEC SQL DECLARE B BINARY CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
81+
EXEC SQL OPEN B;
82+
EXEC SQL FETCH B INTO :empl.name,:a.accs,:empl.byte;
83+
if (sqlca.sqlcode)
84+
{
85+
printf ("fetch error = %ld\n", sqlca.sqlcode);
86+
exit (sqlca.sqlcode);
87+
}
4688

47-
EXEC SQL insert into empl values (1, 'first user', 20);
48-
if (sqlca.sqlcode)
49-
{
50-
printf("select error = %ld\n", sqlca.sqlcode);
51-
exit(sqlca.sqlcode);
52-
}
89+
EXEC SQL CLOSE B;
5390

54-
EXEC SQL select name, accs
55-
into :empl.name, :empl.accs
56-
from empl where idnum = :empl.idnum;
57-
if (sqlca.sqlcode)
58-
{
59-
printf("select error = %ld\n", sqlca.sqlcode);
60-
exit(sqlca.sqlcode);
61-
}
62-
printf("name=%s, accs=%d\n", empl.name, empl.accs);
63-
EXEC SQL disconnect;
64-
fclose(dbgs);
65-
exit(0);
91+
i=a.t[0];
92+
a.t[0]=a.t[1];
93+
a.t[1]=i;
94+
95+
printf ("name=%s, accs=%d byte=", empl.name, a.accs);
96+
for (i=0; i<20; i++)
97+
{
98+
if (empl.byte[i] == '#')
99+
break;
100+
printf("(%o)", (unsigned char)empl.byte[i]);
101+
}
102+
printf("\n");
103+
EXEC SQL disconnect;
104+
fclose (dbgs);
105+
exit (0);
66106
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp