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

Commitbf69b53

Browse files
author
Michael Meskes
committed
Applied patch by Boszormenyi Zoltan <zb@cybertec.at> to add DESCRIBE [OUTPUT] statement to ecpg.
1 parent40f908b commitbf69b53

22 files changed

+2443
-45
lines changed

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

Lines changed: 147 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* dynamic SQL support routines
22
*
3-
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.33 2009/08/07 10:51:20 meskes Exp $
3+
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.34 2010/01/15 10:44:34 meskes Exp $
44
*/
55

66
#definePOSTGRES_ECPG_INTERNAL
@@ -13,6 +13,7 @@
1313
#include"ecpgerrno.h"
1414
#include"extern.h"
1515
#include"sqlca.h"
16+
#include"sqlda.h"
1617
#include"sql3types.h"
1718

1819
staticvoiddescriptor_free(structdescriptor*desc);
@@ -226,6 +227,12 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va
226227
return (true);
227228
}
228229

230+
#defineRETURN_IF_NO_DATAif (ntuples < 1) \
231+
{ \
232+
ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \
233+
return (false); \
234+
}
235+
229236
bool
230237
ECPGget_desc(intlineno,constchar*desc_name,intindex,...)
231238
{
@@ -244,11 +251,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
244251
return (false);
245252

246253
ntuples=PQntuples(ECPGresult);
247-
if (ntuples<1)
248-
{
249-
ecpg_raise(lineno,ECPG_NOT_FOUND,ECPG_SQLSTATE_NO_DATA,NULL);
250-
return (false);
251-
}
252254

253255
if (index<1||index>PQnfields(ECPGresult))
254256
{
@@ -283,6 +285,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
283285
switch (type)
284286
{
285287
case (ECPGd_indicator):
288+
RETURN_IF_NO_DATA;
286289
data_var.ind_type=vartype;
287290
data_var.ind_pointer=var;
288291
data_var.ind_varcharsize=varcharsize;
@@ -295,6 +298,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
295298
break;
296299

297300
caseECPGd_data:
301+
RETURN_IF_NO_DATA;
298302
data_var.type=vartype;
299303
data_var.pointer=var;
300304
data_var.varcharsize=varcharsize;
@@ -377,6 +381,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
377381
caseECPGd_ret_length:
378382
caseECPGd_ret_octet:
379383

384+
RETURN_IF_NO_DATA;
380385
/*
381386
* this is like ECPGstore_result
382387
*/
@@ -480,6 +485,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
480485
sqlca->sqlerrd[2]=ntuples;
481486
return (true);
482487
}
488+
#undef RETURN_IF_NO_DATA
483489

484490
bool
485491
ECPGset_desc_header(intlineno,constchar*desc_name,intcount)
@@ -723,8 +729,140 @@ ecpg_find_desc(int line, const char *name)
723729
}
724730

725731
bool
726-
ECPGdescribe(intline,boolinput,constchar*statement,...)
732+
ECPGdescribe(intline,intcompat,boolinput,constchar*connection_name,constchar*stmt_name,...)
727733
{
728-
ecpg_log("ECPGdescribe called on line %d for %s: %s\n",line,input ?"input" :"output",statement);
729-
return false;
734+
boolret= false;
735+
structconnection*con;
736+
structprepared_statement*prep;
737+
PGresult*res;
738+
va_listargs;
739+
740+
/* DESCRIBE INPUT is not yet supported */
741+
if (input)
742+
returnret;
743+
744+
con=ecpg_get_connection(connection_name);
745+
if (!con)
746+
return false;
747+
prep=ecpg_find_prepared_statement(stmt_name,con,NULL);
748+
if (!prep)
749+
returnret;
750+
751+
va_start(args,stmt_name);
752+
753+
for (;;)
754+
{
755+
enumECPGttypetype,dummy_type;
756+
void*ptr,*dummy_ptr;
757+
longdummy;
758+
759+
/* variable type */
760+
type=va_arg(args,enumECPGttype);
761+
762+
if (type==ECPGt_EORT)
763+
break;
764+
765+
/* rest of variable parameters*/
766+
ptr=va_arg(args,void*);
767+
dummy=va_arg(args,long);
768+
dummy=va_arg(args,long);
769+
dummy=va_arg(args,long);
770+
771+
/* variable indicator */
772+
dummy_type=va_arg(args,enumECPGttype);
773+
dummy_ptr=va_arg(args,void*);
774+
dummy=va_arg(args,long);
775+
dummy=va_arg(args,long);
776+
dummy=va_arg(args,long);
777+
778+
switch (type)
779+
{
780+
caseECPGt_descriptor:
781+
{
782+
char*name=ptr;
783+
structdescriptor*desc=ecpg_find_desc(line,name);
784+
785+
if (desc==NULL)
786+
break;
787+
788+
res=PQdescribePrepared(con->connection,stmt_name);
789+
if (!ecpg_check_PQresult(res,line,con->connection,compat))
790+
break;
791+
792+
if (desc->result!=NULL)
793+
PQclear(desc->result);
794+
795+
desc->result=res;
796+
ret= true;
797+
break;
798+
}
799+
caseECPGt_sqlda:
800+
{
801+
if (INFORMIX_MODE(compat))
802+
{
803+
structsqlda_compat**_sqlda=ptr;
804+
structsqlda_compat*sqlda;
805+
806+
res=PQdescribePrepared(con->connection,stmt_name);
807+
if (!ecpg_check_PQresult(res,line,con->connection,compat))
808+
break;
809+
810+
sqlda=ecpg_build_compat_sqlda(line,res,-1,compat);
811+
if (sqlda)
812+
{
813+
structsqlda_compat*sqlda_old=*_sqlda;
814+
structsqlda_compat*sqlda_old1;
815+
816+
while (sqlda_old)
817+
{
818+
sqlda_old1=sqlda_old->desc_next;
819+
free(sqlda_old);
820+
sqlda_old=sqlda_old1;
821+
}
822+
823+
*_sqlda=sqlda;
824+
ret= true;
825+
}
826+
827+
PQclear(res);
828+
}
829+
else
830+
{
831+
structsqlda_struct**_sqlda=ptr;
832+
structsqlda_struct*sqlda;
833+
834+
res=PQdescribePrepared(con->connection,stmt_name);
835+
if (!ecpg_check_PQresult(res,line,con->connection,compat))
836+
break;
837+
838+
sqlda=ecpg_build_native_sqlda(line,res,-1,compat);
839+
if (sqlda)
840+
{
841+
structsqlda_struct*sqlda_old=*_sqlda;
842+
structsqlda_struct*sqlda_old1;
843+
844+
while (sqlda_old)
845+
{
846+
sqlda_old1=sqlda_old->desc_next;
847+
free(sqlda_old);
848+
sqlda_old=sqlda_old1;
849+
}
850+
851+
*_sqlda=sqlda;
852+
ret= true;
853+
}
854+
855+
PQclear(res);
856+
}
857+
break;
858+
}
859+
default:
860+
/* nothing else may come */
861+
;
862+
}
863+
}
864+
865+
va_end(args);
866+
867+
returnret;
730868
}

‎src/interfaces/ecpg/ecpglib/extern.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.36 2010/01/05 16:38:23 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.37 2010/01/15 10:44:34 meskes Exp $ */
22

33
#ifndef_ECPG_LIB_EXTERN_H
44
#define_ECPG_LIB_EXTERN_H
@@ -60,6 +60,15 @@ struct statement
6060
structvariable*outlist;
6161
};
6262

63+
/* structure to store prepared statements for a connection */
64+
structprepared_statement
65+
{
66+
char*name;
67+
boolprepared;
68+
structstatement*stmt;
69+
structprepared_statement*next;
70+
};
71+
6372
/* structure to store connections */
6473
structconnection
6574
{
@@ -139,6 +148,9 @@ struct descriptor *ecpggetdescp(int, char *);
139148

140149
structdescriptor*ecpg_find_desc(intline,constchar*name);
141150

151+
structprepared_statement*ecpg_find_prepared_statement(constchar*,
152+
structconnection*,structprepared_statement**);
153+
142154
boolecpg_store_result(constPGresult*results,intact_field,
143155
conststructstatement*stmt,structvariable*var);
144156
boolecpg_store_input(constint,constbool,conststructvariable*,char**,bool);

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

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.33 2009/10/15 10:20:15 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.34 2010/01/15 10:44:34 meskes Exp $ */
22

33
#definePOSTGRES_ECPG_INTERNAL
44
#include"postgres_fe.h"
@@ -11,14 +11,6 @@
1111
#include"extern.h"
1212
#include"sqlca.h"
1313

14-
structprepared_statement
15-
{
16-
char*name;
17-
boolprepared;
18-
structstatement*stmt;
19-
structprepared_statement*next;
20-
};
21-
2214
#defineSTMTID_SIZE 32
2315

2416
typedefstruct
@@ -35,8 +27,6 @@ static const int stmtCacheNBuckets = 2039;/* # buckets - a prime # */
3527
staticconstintstmtCacheEntPerBucket=8;/* # entries/bucket*/
3628
staticstmtCacheEntrystmtCacheEntries[16384]= {{0, {0},0,0,0}};
3729

38-
staticstructprepared_statement*find_prepared_statement(constchar*name,
39-
structconnection*con,structprepared_statement**prev);
4030
staticbooldeallocate_one(intlineno,enumCOMPAT_MODEc,structconnection*con,
4131
structprepared_statement*prev,structprepared_statement*this);
4232

@@ -126,7 +116,7 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
126116
return false;
127117

128118
/* check if we already have prepared this statement */
129-
this=find_prepared_statement(name,con,&prev);
119+
this=ecpg_find_prepared_statement(name,con,&prev);
130120
if (this&& !deallocate_one(lineno,ECPG_COMPAT_PGSQL,con,prev,this))
131121
return false;
132122

@@ -179,8 +169,8 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
179169
return true;
180170
}
181171

182-
staticstructprepared_statement*
183-
find_prepared_statement(constchar*name,
172+
structprepared_statement*
173+
ecpg_find_prepared_statement(constchar*name,
184174
structconnection*con,structprepared_statement**prev_)
185175
{
186176
structprepared_statement*this,
@@ -262,7 +252,7 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
262252
if (!ecpg_init(con,connection_name,lineno))
263253
return false;
264254

265-
this=find_prepared_statement(name,con,&prev);
255+
this=ecpg_find_prepared_statement(name,con,&prev);
266256
if (this)
267257
returndeallocate_one(lineno,c,con,prev,this);
268258

@@ -297,7 +287,7 @@ ecpg_prepared(const char *name, struct connection * con)
297287
{
298288
structprepared_statement*this;
299289

300-
this=find_prepared_statement(name,con,NULL);
290+
this=ecpg_find_prepared_statement(name,con,NULL);
301291
returnthis ?this->stmt->command :NULL;
302292
}
303293

@@ -394,7 +384,7 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, int entNo)/* entry # to free *
394384
con=ecpg_get_connection(entry->connection);
395385

396386
/* free the 'prepared_statement' list entry */
397-
this=find_prepared_statement(entry->stmtID,con,&prev);
387+
this=ecpg_find_prepared_statement(entry->stmtID,con,&prev);
398388
if (this&& !deallocate_one(lineno,compat,con,prev,this))
399389
return (-1);
400390

‎src/interfaces/ecpg/include/ecpglib.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* this is a small part of c.h since we don't want to leak all postgres
33
* definitions into ecpg programs
4-
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.80 2009/09/18 13:13:32 meskes Exp $
4+
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.81 2010/01/15 10:44:36 meskes Exp $
55
*/
66

77
#ifndef_ECPGLIB_H
@@ -83,7 +83,7 @@ boolECPGset_desc(int, const char *, int,...);
8383

8484
voidECPGset_noind_null(enumECPGttype,void*);
8585
boolECPGis_noind_null(enumECPGttype,void*);
86-
boolECPGdescribe(int,bool,constchar*,...);
86+
boolECPGdescribe(int,int,bool,constchar*,constchar*,...);
8787

8888
/* dynamic result allocation */
8989
voidECPGfree_auto_mem(void);

‎src/interfaces/ecpg/preproc/ecpg.addons

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.13 2010/01/05 16:38:23 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.14 2010/01/15 10:44:37 meskes Exp $ */
22
ECPG: stmtClosePortalStmt block
33
{
44
if (INFORMIX_MODE)
@@ -84,7 +84,7 @@ ECPG: stmtViewStmt rule
8484
}
8585
| ECPGDescribe
8686
{
87-
fprintf(yyout, "{ ECPGdescribe(__LINE__, %s,", $1);
87+
fprintf(yyout, "{ ECPGdescribe(__LINE__, %d, %s,", compat, $1);
8888
dump_variables(argsresult, 1);
8989
fputs("ECPGt_EORT);", yyout);
9090
fprintf(yyout, "}");

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp