Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
c8577c6c
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c8577c6c
编写于
4月 27, 2007
作者:
M
Michael Meskes
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Inlined two functions to get rid of va_list problems on some archs.
上级
a2e923a6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
149 addition
and
146 deletion
+149
-146
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ChangeLog
+5
-0
src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/descriptor.c
+23
-8
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/execute.c
+121
-138
未找到文件。
src/interfaces/ecpg/ChangeLog
浏览文件 @
c8577c6c
...
...
@@ -2183,4 +2183,9 @@ Thu, 29 Mar 2007 11:18:39 +0200
- Added patch by Magnus Hagander <magnus@hagander.net> to use native
win32 threads.
- Fixed regression tests to run threading tests.
Fr 27. Apr 08:55:25 CEST 2007
- Inlined two functions to get rid of va_list problems on some
architectures.
- Set ecpg version to 4.3.1.
src/interfaces/ecpg/ecpglib/descriptor.c
浏览文件 @
c8577c6c
/* dynamic SQL support routines
*
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.2
0 2006/10/04 00:30:11 momjian
Exp $
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.2
1 2007/04/27 06:56:11 meskes
Exp $
*/
#define POSTGRES_ECPG_INTERNAL
...
...
@@ -507,7 +507,6 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
do
{
enum
ECPGdtype
itemtype
;
enum
ECPGttype
type
;
const
char
*
tobeinserted
=
NULL
;
bool
malloced
;
...
...
@@ -516,13 +515,29 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
if
(
itemtype
==
ECPGd_EODT
)
break
;
type
=
va_arg
(
args
,
enum
ECPGttype
);
#if defined(__GNUC__) && (defined (__powerpc__) || defined(__amd64__) || defined(__x86_64__))
ECPGget_variable
(
args
,
type
,
var
,
false
);
#else
ECPGget_variable
(
&
args
,
type
,
var
,
false
);
#endif
var
->
type
=
va_arg
(
args
,
enum
ECPGttype
);
var
->
pointer
=
va_arg
(
args
,
char
*
);
var
->
varcharsize
=
va_arg
(
args
,
long
);
var
->
arrsize
=
va_arg
(
args
,
long
);
var
->
offset
=
va_arg
(
args
,
long
);
if
(
var
->
arrsize
==
0
||
var
->
varcharsize
==
0
)
var
->
value
=
*
((
char
**
)
(
var
->
pointer
));
else
var
->
value
=
var
->
pointer
;
/*
* negative values are used to indicate an array without given bounds
*/
/* reset to zero for us */
if
(
var
->
arrsize
<
0
)
var
->
arrsize
=
0
;
if
(
var
->
varcharsize
<
0
)
var
->
varcharsize
=
0
;
var
->
next
=
NULL
;
switch
(
itemtype
)
{
case
ECPGd_data
:
...
...
src/interfaces/ecpg/ecpglib/execute.c
浏览文件 @
c8577c6c
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.6
5 2007/03/29 12:02:24
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.6
6 2007/04/27 06:56:11
meskes Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
...
...
@@ -79,136 +79,6 @@ quote_postgres(char *arg, bool quote, int lineno)
}
}
#if defined(__GNUC__) && (defined (__powerpc__) || defined(__amd64__) || defined(__x86_64__))
#define APREF ap
#else
#define APREF *ap
#endif
void
ECPGget_variable
(
va_list
APREF
,
enum
ECPGttype
type
,
struct
variable
*
var
,
bool
indicator
)
{
var
->
type
=
type
;
var
->
pointer
=
va_arg
(
APREF
,
char
*
);
var
->
varcharsize
=
va_arg
(
APREF
,
long
);
var
->
arrsize
=
va_arg
(
APREF
,
long
);
var
->
offset
=
va_arg
(
APREF
,
long
);
if
(
var
->
arrsize
==
0
||
var
->
varcharsize
==
0
)
var
->
value
=
*
((
char
**
)
(
var
->
pointer
));
else
var
->
value
=
var
->
pointer
;
/*
* negative values are used to indicate an array without given bounds
*/
/* reset to zero for us */
if
(
var
->
arrsize
<
0
)
var
->
arrsize
=
0
;
if
(
var
->
varcharsize
<
0
)
var
->
varcharsize
=
0
;
var
->
next
=
NULL
;
if
(
indicator
)
{
var
->
ind_type
=
va_arg
(
APREF
,
enum
ECPGttype
);
var
->
ind_pointer
=
va_arg
(
APREF
,
char
*
);
var
->
ind_varcharsize
=
va_arg
(
APREF
,
long
);
var
->
ind_arrsize
=
va_arg
(
APREF
,
long
);
var
->
ind_offset
=
va_arg
(
APREF
,
long
);
if
(
var
->
ind_type
!=
ECPGt_NO_INDICATOR
&&
(
var
->
ind_arrsize
==
0
||
var
->
ind_varcharsize
==
0
))
var
->
ind_value
=
*
((
char
**
)
(
var
->
ind_pointer
));
else
var
->
ind_value
=
var
->
ind_pointer
;
/*
* negative values are used to indicate an array without given bounds
*/
/* reset to zero for us */
if
(
var
->
ind_arrsize
<
0
)
var
->
ind_arrsize
=
0
;
if
(
var
->
ind_varcharsize
<
0
)
var
->
ind_varcharsize
=
0
;
}
}
/*
* create a list of variables
* The variables are listed with input variables preceding outputvariables
* The end of each group is marked by an end marker.
* per variable we list:
* type - as defined in ecpgtype.h
* value - where to store the data
* varcharsize - length of string in case we have a stringvariable, else 0
* arraysize - 0 for pointer (we don't know the size of the array),
* 1 for simple variable, size for arrays
* offset - offset between ith and (i+1)th entry in an array,
* normally that means sizeof(type)
* ind_type - type of indicator variable
* ind_value - pointer to indicator variable
* ind_varcharsize - empty
* ind_arraysize - arraysize of indicator array
* ind_offset - indicator offset
*/
static
bool
create_statement
(
int
lineno
,
int
compat
,
int
force_indicator
,
struct
connection
*
connection
,
struct
statement
**
stmt
,
const
char
*
query
,
va_list
APREF
)
{
struct
variable
**
list
=
&
((
*
stmt
)
->
inlist
);
enum
ECPGttype
type
;
if
(
!
(
*
stmt
=
(
struct
statement
*
)
ECPGalloc
(
sizeof
(
struct
statement
),
lineno
)))
return
false
;
(
*
stmt
)
->
command
=
ECPGstrdup
(
query
,
lineno
);
(
*
stmt
)
->
connection
=
connection
;
(
*
stmt
)
->
lineno
=
lineno
;
(
*
stmt
)
->
compat
=
compat
;
(
*
stmt
)
->
force_indicator
=
force_indicator
;
list
=
&
((
*
stmt
)
->
inlist
);
type
=
va_arg
(
APREF
,
enum
ECPGttype
);
while
(
type
!=
ECPGt_EORT
)
{
if
(
type
==
ECPGt_EOIT
)
list
=
&
((
*
stmt
)
->
outlist
);
else
{
struct
variable
*
var
,
*
ptr
;
if
(
!
(
var
=
(
struct
variable
*
)
ECPGalloc
(
sizeof
(
struct
variable
),
lineno
)))
return
false
;
ECPGget_variable
(
ap
,
type
,
var
,
true
);
/* if variable is NULL, the statement hasn't been prepared */
if
(
var
->
pointer
==
NULL
)
{
ECPGraise
(
lineno
,
ECPG_INVALID_STMT
,
ECPG_SQLSTATE_INVALID_SQL_STATEMENT_NAME
,
NULL
);
ECPGfree
(
var
);
return
false
;
}
for
(
ptr
=
*
list
;
ptr
&&
ptr
->
next
;
ptr
=
ptr
->
next
);
if
(
ptr
==
NULL
)
*
list
=
var
;
else
ptr
->
next
=
var
;
}
type
=
va_arg
(
APREF
,
enum
ECPGttype
);
}
return
(
true
);
}
static
void
free_variable
(
struct
variable
*
var
)
{
...
...
@@ -1519,6 +1389,8 @@ ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name,
struct
connection
*
con
;
bool
status
;
char
*
oldlocale
;
enum
ECPGttype
type
;
struct
variable
**
list
;
/* Make sure we do NOT honor the locale for numeric input/output */
/* since the database wants the standard decimal point */
...
...
@@ -1540,17 +1412,128 @@ ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name,
/* construct statement in our own structure */
va_start
(
args
,
query
);
#if defined(__GNUC__) && (defined (__powerpc__) || defined(__amd64__) || defined(__x86_64__))
if
(
create_statement
(
lineno
,
compat
,
force_indicator
,
con
,
&
stmt
,
query
,
args
)
==
false
)
#else
if
(
create_statement
(
lineno
,
compat
,
force_indicator
,
con
,
&
stmt
,
query
,
&
args
)
==
false
)
#endif
/*
* create a list of variables
* The variables are listed with input variables preceding outputvariables
* The end of each group is marked by an end marker.
* per variable we list:
* type - as defined in ecpgtype.h
* value - where to store the data
* varcharsize - length of string in case we have a stringvariable, else 0
* arraysize - 0 for pointer (we don't know the size of the array),
* 1 for simple variable, size for arrays
* offset - offset between ith and (i+1)th entry in an array,
* normally that means sizeof(type)
* ind_type - type of indicator variable
* ind_value - pointer to indicator variable
* ind_varcharsize - empty
* ind_arraysize - arraysize of indicator array
* ind_offset - indicator offset
*/
if
(
!
(
stmt
=
(
struct
statement
*
)
ECPGalloc
(
sizeof
(
struct
statement
),
lineno
)))
{
setlocale
(
LC_NUMERIC
,
oldlocale
);
ECPGfree
(
oldlocale
);
free_statement
(
stmt
);
return
(
false
);
va_end
(
args
);
return
false
;
}
stmt
->
command
=
ECPGstrdup
(
query
,
lineno
);
stmt
->
connection
=
con
;
stmt
->
lineno
=
lineno
;
stmt
->
compat
=
compat
;
stmt
->
force_indicator
=
force_indicator
;
list
=
&
(
stmt
->
inlist
);
type
=
va_arg
(
args
,
enum
ECPGttype
);
while
(
type
!=
ECPGt_EORT
)
{
if
(
type
==
ECPGt_EOIT
)
list
=
&
(
stmt
->
outlist
);
else
{
struct
variable
*
var
,
*
ptr
;
if
(
!
(
var
=
(
struct
variable
*
)
ECPGalloc
(
sizeof
(
struct
variable
),
lineno
)))
{
setlocale
(
LC_NUMERIC
,
oldlocale
);
ECPGfree
(
oldlocale
);
free_statement
(
stmt
);
va_end
(
args
);
return
false
;
}
var
->
type
=
type
;
var
->
pointer
=
va_arg
(
args
,
char
*
);
var
->
varcharsize
=
va_arg
(
args
,
long
);
var
->
arrsize
=
va_arg
(
args
,
long
);
var
->
offset
=
va_arg
(
args
,
long
);
if
(
var
->
arrsize
==
0
||
var
->
varcharsize
==
0
)
var
->
value
=
*
((
char
**
)
(
var
->
pointer
));
else
var
->
value
=
var
->
pointer
;
/*
* negative values are used to indicate an array without given bounds
*/
/* reset to zero for us */
if
(
var
->
arrsize
<
0
)
var
->
arrsize
=
0
;
if
(
var
->
varcharsize
<
0
)
var
->
varcharsize
=
0
;
var
->
next
=
NULL
;
var
->
ind_type
=
va_arg
(
args
,
enum
ECPGttype
);
var
->
ind_pointer
=
va_arg
(
args
,
char
*
);
var
->
ind_varcharsize
=
va_arg
(
args
,
long
);
var
->
ind_arrsize
=
va_arg
(
args
,
long
);
var
->
ind_offset
=
va_arg
(
args
,
long
);
if
(
var
->
ind_type
!=
ECPGt_NO_INDICATOR
&&
(
var
->
ind_arrsize
==
0
||
var
->
ind_varcharsize
==
0
))
var
->
ind_value
=
*
((
char
**
)
(
var
->
ind_pointer
));
else
var
->
ind_value
=
var
->
ind_pointer
;
/*
* negative values are used to indicate an array without given bounds
*/
/* reset to zero for us */
if
(
var
->
ind_arrsize
<
0
)
var
->
ind_arrsize
=
0
;
if
(
var
->
ind_varcharsize
<
0
)
var
->
ind_varcharsize
=
0
;
/* if variable is NULL, the statement hasn't been prepared */
if
(
var
->
pointer
==
NULL
)
{
ECPGraise
(
lineno
,
ECPG_INVALID_STMT
,
ECPG_SQLSTATE_INVALID_SQL_STATEMENT_NAME
,
NULL
);
ECPGfree
(
var
);
setlocale
(
LC_NUMERIC
,
oldlocale
);
ECPGfree
(
oldlocale
);
free_statement
(
stmt
);
va_end
(
args
);
return
false
;
}
for
(
ptr
=
*
list
;
ptr
&&
ptr
->
next
;
ptr
=
ptr
->
next
);
if
(
ptr
==
NULL
)
*
list
=
var
;
else
ptr
->
next
=
var
;
}
type
=
va_arg
(
args
,
enum
ECPGttype
);
}
va_end
(
args
);
/* are we connected? */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录