Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit aa6ac35

Browse files
author
Michael Meskes
committed
Applied patch by Boszormenyi Zoltan <zb@cybertec.at> to add out-of-scope cursor support to native mode.
1 parent 525d2cb commit aa6ac35

20 files changed

+298
-142
lines changed

src/interfaces/ecpg/compatlib/informix.c

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/compatlib/informix.c,v 1.62 2009/10/01 18:03:54 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/compatlib/informix.c,v 1.63 2010/01/26 09:07:31 meskes Exp $ */
22

33
#define POSTGRES_ECPG_INTERNAL
44
#include "postgres_fe.h"
@@ -1004,57 +1004,16 @@ rtypwidth(int sqltype, int sqllen)
10041004
return 0;
10051005
}
10061006

1007-
static struct var_list
1008-
{
1009-
int number;
1010-
void *pointer;
1011-
struct var_list *next;
1012-
} *ivlist = NULL;
1013-
10141007
void
10151008
ECPG_informix_set_var(int number, void *pointer, int lineno)
10161009
{
1017-
struct var_list *ptr;
1018-
1019-
for (ptr = ivlist; ptr != NULL; ptr = ptr->next)
1020-
{
1021-
if (ptr->number == number)
1022-
{
1023-
/* already known => just change pointer value */
1024-
ptr->pointer = pointer;
1025-
return;
1026-
}
1027-
}
1028-
1029-
/* a new one has to be added */
1030-
ptr = (struct var_list *) calloc(1L, sizeof(struct var_list));
1031-
if (!ptr)
1032-
{
1033-
struct sqlca_t *sqlca = ECPGget_sqlca();
1034-
1035-
sqlca->sqlcode = ECPG_OUT_OF_MEMORY;
1036-
strncpy(sqlca->sqlstate, "YE001", sizeof("YE001"));
1037-
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "out of memory on line %d", lineno);
1038-
sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
1039-
/* free all memory we have allocated for the user */
1040-
ECPGfree_auto_mem();
1041-
}
1042-
else
1043-
{
1044-
ptr->number = number;
1045-
ptr->pointer = pointer;
1046-
ptr->next = ivlist;
1047-
ivlist = ptr;
1048-
}
1010+
ECPGset_var(number, pointer, lineno);
10491011
}
10501012

10511013
void *
10521014
ECPG_informix_get_var(int number)
10531015
{
1054-
struct var_list *ptr;
1055-
1056-
for (ptr = ivlist; ptr != NULL && ptr->number != number; ptr = ptr->next);
1057-
return (ptr) ? ptr->pointer : NULL;
1016+
return ECPGget_var(number);
10581017
}
10591018

10601019
void

src/interfaces/ecpg/ecpglib/exports.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/exports.txt,v 1.6 2009/09/18 13:13:32 meskes Exp $
1+
# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/exports.txt,v 1.7 2010/01/26 09:07:31 meskes Exp $
22
# Functions to be exported by ecpglib DLL
33
ECPGallocate_desc 1
44
ECPGconnect 2
@@ -26,4 +26,6 @@ ECPGstatus 23
2626
ECPGtrans 24
2727
sqlprint 25
2828
ECPGget_PGconn 26
29-
ECPGtransactionStatus 27
29+
ECPGtransactionStatus 27
30+
ECPGset_var 28
31+
ECPGget_var 29

src/interfaces/ecpg/ecpglib/misc.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.53 2009/11/24 16:30:31 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.54 2010/01/26 09:07:31 meskes Exp $ */
22

33
#define POSTGRES_ECPG_INTERNAL
44
#include "postgres_fe.h"
@@ -505,3 +505,55 @@ ecpg_gettext(const char *msgid)
505505
}
506506

507507
#endif /* ENABLE_NLS */
508+
509+
static struct var_list
510+
{
511+
int number;
512+
void *pointer;
513+
struct var_list *next;
514+
} *ivlist = NULL;
515+
516+
void
517+
ECPGset_var(int number, void *pointer, int lineno)
518+
{
519+
struct var_list *ptr;
520+
521+
for (ptr = ivlist; ptr != NULL; ptr = ptr->next)
522+
{
523+
if (ptr->number == number)
524+
{
525+
/* already known => just change pointer value */
526+
ptr->pointer = pointer;
527+
return;
528+
}
529+
}
530+
531+
/* a new one has to be added */
532+
ptr = (struct var_list *) calloc(1L, sizeof(struct var_list));
533+
if (!ptr)
534+
{
535+
struct sqlca_t *sqlca = ECPGget_sqlca();
536+
sqlca->sqlcode = ECPG_OUT_OF_MEMORY;
537+
strncpy(sqlca->sqlstate, "YE001", sizeof("YE001"));
538+
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "out of memory on line %d", lineno);
539+
sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
540+
/* free all memory we have allocated for the user */
541+
ECPGfree_auto_mem();
542+
}
543+
else
544+
{
545+
ptr->number = number;
546+
ptr->pointer = pointer;
547+
ptr->next = ivlist;
548+
ivlist = ptr;
549+
}
550+
}
551+
552+
void *
553+
ECPGget_var(int number)
554+
{
555+
struct var_list *ptr;
556+
557+
for (ptr = ivlist; ptr != NULL && ptr->number != number; ptr = ptr->next);
558+
return (ptr) ? ptr->pointer : NULL;
559+
}

src/interfaces/ecpg/include/ecpglib.h

Lines changed: 4 additions & 1 deletion
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.81 2010/01/15 10:44:36 meskes Exp $
4+
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.82 2010/01/26 09:07:31 meskes Exp $
55
*/
66

77
#ifndef _ECPGLIB_H
@@ -85,6 +85,9 @@ void ECPGset_noind_null(enum ECPGttype, void *);
8585
bool ECPGis_noind_null(enum ECPGttype, void *);
8686
bool ECPGdescribe(int, int, bool, const char *, const char *, ...);
8787

88+
void ECPGset_var(int, void *, int);
89+
void *ECPGget_var(int number);
90+
8891
/* dynamic result allocation */
8992
void ECPGfree_auto_mem(void);
9093

src/interfaces/ecpg/preproc/descriptor.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* functions needed for descriptor handling
33
*
4-
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/descriptor.c,v 1.29 2010/01/05 16:38:23 meskes Exp $
4+
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/descriptor.c,v 1.30 2010/01/26 09:07:31 meskes Exp $
55
*
66
* since descriptor might be either a string constant or a string var
77
* we need to check for a constant if we expect a constant
@@ -317,7 +317,7 @@ struct variable *
317317
descriptor_variable(const char *name, int input)
318318
{
319319
static char descriptor_names[2][MAX_DESCRIPTOR_NAMELEN];
320-
static const struct ECPGtype descriptor_type = {ECPGt_descriptor, NULL, NULL, {NULL}, 0};
320+
static const struct ECPGtype descriptor_type = {ECPGt_descriptor, NULL, NULL, NULL, {NULL}, 0};
321321
static const struct variable varspace[2] = {
322322
{descriptor_names[0], (struct ECPGtype *) & descriptor_type, 0, NULL},
323323
{descriptor_names[1], (struct ECPGtype *) & descriptor_type, 0, NULL}

src/interfaces/ecpg/preproc/ecpg.addons

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.14 2010/01/15 10:44:37 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.15 2010/01/26 09:07:31 meskes Exp $ */
22
ECPG: stmtClosePortalStmt block
33
{
44
if (INFORMIX_MODE)
@@ -310,11 +310,14 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
310310

311311
this->next = cur;
312312
this->name = $2;
313+
this->function = (current_function ? mm_strdup(current_function) : NULL);
313314
this->connection = connection;
314315
this->opened = false;
315316
this->command = cat_str(7, make_str("declare"), cursor_marker, $3, make_str("cursor"), $5, make_str("for"), $7);
316317
this->argsinsert = argsinsert;
318+
this->argsinsert_oos = NULL;
317319
this->argsresult = argsresult;
320+
this->argsresult_oos = NULL;
318321
argsinsert = argsresult = NULL;
319322
cur = this;
320323

@@ -327,17 +330,17 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
327330
}
328331
comment = cat_str(3, make_str("/*"), c1, make_str("*/"));
329332

330-
if (INFORMIX_MODE)
331-
{
332-
if (braces_open > 0) /* we're in a function */
333-
{
334-
$$ = cat_str(4, adjust_informix(this->argsinsert), adjust_informix(this->argsresult), make_str("ECPG_informix_reset_sqlca();"), comment);
335-
}
336-
else
337-
$$ = cat_str(3, adjust_informix(this->argsinsert), adjust_informix(this->argsresult), comment);
338-
}
333+
if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */
334+
$$ = cat_str(4,
335+
adjust_outofscope_cursor_vars(this, true),
336+
adjust_outofscope_cursor_vars(this, false),
337+
make_str("ECPG_informix_reset_sqlca();"),
338+
comment);
339339
else
340-
$$ = comment;
340+
$$ = cat_str(3,
341+
adjust_outofscope_cursor_vars(this, true),
342+
adjust_outofscope_cursor_vars(this, false),
343+
comment);
341344
}
342345
ECPG: ClosePortalStmtCLOSEcursor_name block
343346
{

src/interfaces/ecpg/preproc/ecpg.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.112 2010/01/02 16:58:11 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.113 2010/01/26 09:07:31 meskes Exp $ */
22

33
/* Main for ecpg, the PostgreSQL embedded SQL precompiler. */
44
/* Copyright (c) 1996-2010, PostgreSQL Global Development Group */
@@ -419,8 +419,8 @@ main(int argc, char *const argv[])
419419
/* and structure member lists */
420420
memset(struct_member_list, 0, sizeof(struct_member_list));
421421

422-
/* and our variable counter for Informix compatibility */
423-
ecpg_informix_var = 0;
422+
/* and our variable counter for out of scope cursors' variables */
423+
ecpg_internal_var = 0;
424424

425425
/* finally the actual connection */
426426
connection = NULL;

0 commit comments

Comments
 (0)