Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
32a4c300
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,发现更多精彩内容 >>
提交
32a4c300
编写于
11月 14, 2001
作者:
M
Michael Meskes
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added Christof's patches.
上级
ebb93323
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
281 addition
and
200 deletion
+281
-200
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ChangeLog
+4
-0
src/interfaces/ecpg/README.dynSQL
src/interfaces/ecpg/README.dynSQL
+2
-12
src/interfaces/ecpg/include/ecpglib.h
src/interfaces/ecpg/include/ecpglib.h
+2
-0
src/interfaces/ecpg/lib/connect.c
src/interfaces/ecpg/lib/connect.c
+13
-13
src/interfaces/ecpg/lib/data.c
src/interfaces/ecpg/lib/data.c
+3
-3
src/interfaces/ecpg/lib/descriptor.c
src/interfaces/ecpg/lib/descriptor.c
+98
-80
src/interfaces/ecpg/lib/error.c
src/interfaces/ecpg/lib/error.c
+2
-2
src/interfaces/ecpg/lib/execute.c
src/interfaces/ecpg/lib/execute.c
+109
-61
src/interfaces/ecpg/lib/extern.h
src/interfaces/ecpg/lib/extern.h
+25
-7
src/interfaces/ecpg/lib/memory.c
src/interfaces/ecpg/lib/memory.c
+3
-3
src/interfaces/ecpg/lib/misc.c
src/interfaces/ecpg/lib/misc.c
+8
-8
src/interfaces/ecpg/lib/pg_type.h
src/interfaces/ecpg/lib/pg_type.h
+3
-2
src/interfaces/ecpg/lib/prepare.c
src/interfaces/ecpg/lib/prepare.c
+5
-5
src/interfaces/ecpg/test/Makefile
src/interfaces/ecpg/test/Makefile
+2
-2
src/interfaces/ecpg/test/dyntest.pgc
src/interfaces/ecpg/test/dyntest.pgc
+1
-1
src/interfaces/ecpg/test/dyntest2.pgc
src/interfaces/ecpg/test/dyntest2.pgc
+1
-1
未找到文件。
src/interfaces/ecpg/ChangeLog
浏览文件 @
32a4c300
...
...
@@ -1146,5 +1146,9 @@ Sun Oct 21 14:19:42 CEST 2001
Fri Nov 2 16:16:25 CET 2001
- Synced preproc.y with gram.y.
Wed Nov 14 11:50:27 CET 2001
- Added several patches by Christof Petig <christof.petig@wtal.de>.
- Set ecpg version to 2.9.0.
- Set library version to 3.3.0.
src/interfaces/ecpg/README.dynSQL
浏览文件 @
32a4c300
descriptor statements have the following shortcomings
- up to now the only reasonable statement is
FETCH ... INTO SQL DESCRIPTOR <name>
no input variables allowed!
- input descriptors (USING DESCRIPTOR <name>) are not supported
Reason: to fully support dynamic SQL the frontend/backend communication
should change to recognize input parameters.
Since this is not likely to happen in the near future and you
can cover the same functionality with the existing infrastructure
I'll leave the work to someone else.
- string buffer overflow does not always generate warnings
(beware: terminating 0 may be missing because strncpy is used)
:var=data sets sqlwarn accordingly (but not indicator)
- char variables pointing to NULL are not allocated on demand
- string truncation does not show up in indicator
(using s[n]printf), I'll leave the work to someone else.
src/interfaces/ecpg/include/ecpglib.h
浏览文件 @
32a4c300
...
...
@@ -67,6 +67,8 @@ void ECPGraise(int line, int code, const char *str);
bool
ECPGget_desc_header
(
int
,
char
*
,
int
*
);
bool
ECPGget_desc
(
int
,
char
*
,
int
,...);
/* dynamic result allocation */
void
ECPGfree_auto_mem
(
void
);
#ifdef __cplusplus
}
...
...
src/interfaces/ecpg/lib/connect.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.1
4 2001/10/31 04:49:44 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.1
5 2001/11/14 11:11:49 meskes
Exp $ */
#include "postgres_fe.h"
...
...
@@ -12,7 +12,7 @@ static struct connection *all_connections = NULL,
*
actual_connection
=
NULL
;
struct
connection
*
get_connection
(
const
char
*
connection_name
)
ECPG
get_connection
(
const
char
*
connection_name
)
{
struct
connection
*
con
=
all_connections
;
...
...
@@ -63,10 +63,10 @@ ecpg_finish(struct connection * act)
bool
ECPGsetcommit
(
int
lineno
,
const
char
*
mode
,
const
char
*
connection_name
)
{
struct
connection
*
con
=
get_connection
(
connection_name
);
struct
connection
*
con
=
ECPG
get_connection
(
connection_name
);
PGresult
*
results
;
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
return
(
false
);
ECPGlog
(
"ECPGsetcommit line %d action = %s connection = %s
\n
"
,
lineno
,
mode
,
con
->
name
);
...
...
@@ -106,9 +106,9 @@ ECPGsetcommit(int lineno, const char *mode, const char *connection_name)
bool
ECPGsetconn
(
int
lineno
,
const
char
*
connection_name
)
{
struct
connection
*
con
=
get_connection
(
connection_name
);
struct
connection
*
con
=
ECPG
get_connection
(
connection_name
);
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
return
(
false
);
actual_connection
=
con
;
...
...
@@ -269,9 +269,9 @@ ECPGconnect(int lineno, const char *name, const char *user, const char *passwd,
*
realname
=
NULL
,
*
options
=
NULL
;
init_sqlca
();
ECPG
init_sqlca
();
if
((
this
=
(
struct
connection
*
)
ecpg_
alloc
(
sizeof
(
struct
connection
),
lineno
))
==
NULL
)
if
((
this
=
(
struct
connection
*
)
ECPG
alloc
(
sizeof
(
struct
connection
),
lineno
))
==
NULL
)
return
false
;
if
(
dbname
==
NULL
&&
connection_name
==
NULL
)
...
...
@@ -393,9 +393,9 @@ ECPGconnect(int lineno, const char *name, const char *user, const char *passwd,
/* add connection to our list */
if
(
connection_name
!=
NULL
)
this
->
name
=
ecpg_
strdup
(
connection_name
,
lineno
);
this
->
name
=
ECPG
strdup
(
connection_name
,
lineno
);
else
this
->
name
=
ecpg_
strdup
(
realname
,
lineno
);
this
->
name
=
ECPG
strdup
(
realname
,
lineno
);
this
->
cache_head
=
NULL
;
...
...
@@ -465,7 +465,7 @@ ECPGdisconnect(int lineno, const char *connection_name)
if
(
strcmp
(
connection_name
,
"ALL"
)
==
0
)
{
init_sqlca
();
ECPG
init_sqlca
();
for
(
con
=
all_connections
;
con
;)
{
struct
connection
*
f
=
con
;
...
...
@@ -476,9 +476,9 @@ ECPGdisconnect(int lineno, const char *connection_name)
}
else
{
con
=
get_connection
(
connection_name
);
con
=
ECPG
get_connection
(
connection_name
);
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
return
(
false
);
else
ecpg_finish
(
con
);
...
...
src/interfaces/ecpg/lib/data.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.1
8 2001/11/05 17:46:37 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.1
9 2001/11/14 11:11:49 meskes
Exp $ */
#include "postgres_fe.h"
...
...
@@ -12,14 +12,14 @@
#include "sqlca.h"
bool
get_data
(
const
PGresult
*
results
,
int
act_tuple
,
int
act_field
,
int
lineno
,
ECPG
get_data
(
const
PGresult
*
results
,
int
act_tuple
,
int
act_field
,
int
lineno
,
enum
ECPGttype
type
,
enum
ECPGttype
ind_type
,
void
*
var
,
void
*
ind
,
long
varcharsize
,
long
offset
,
bool
isarray
)
{
char
*
pval
=
(
char
*
)
PQgetvalue
(
results
,
act_tuple
,
act_field
);
ECPGlog
(
"get_data line %d: RESULT: %s
\n
"
,
lineno
,
pval
?
pval
:
""
);
ECPGlog
(
"
ECPG
get_data line %d: RESULT: %s
\n
"
,
lineno
,
pval
?
pval
:
""
);
/* pval is a pointer to the value */
/* let's check is it really is an array if it should be one */
...
...
src/interfaces/ecpg/lib/descriptor.c
浏览文件 @
32a4c300
/* dynamic SQL support routines
*
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.1
8 2001/11/05 17:46:37 momjian
Exp $
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.1
9 2001/11/14 11:11:49 meskes
Exp $
*/
#include "postgres_fe.h"
#include "pg_type.h"
#include "ecpgtype.h"
#include "ecpglib.h"
...
...
@@ -30,14 +31,16 @@ ECPGDynamicType_DDT(Oid type)
{
switch
(
type
)
{
case
1082
:
return
SQL3_DDT_DATE
;
/* date */
case
1083
:
return
SQL3_DDT_TIME
;
/* time */
case
1184
:
return
SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE
;
/* datetime */
case
1296
:
return
SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE
;
/* timestamp */
case
DATEOID
:
return
SQL3_DDT_DATE
;
case
TIMEOID
:
return
SQL3_DDT_TIME
;
case
TIMESTAMPOID
:
return
SQL3_DDT_TIMESTAMP
;
case
TIMESTAMPTZOID
:
return
SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE
;
case
TIMETZOID
:
return
SQL3_DDT_TIME_WITH_TIME_ZONE
;
default:
return
SQL3_DDT_ILLEGAL
;
}
...
...
@@ -139,11 +142,10 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
va_list
args
;
PGresult
*
ECPGresult
=
ECPGresultByDescriptor
(
lineno
,
desc_name
);
enum
ECPGdtype
type
;
bool
Indicator_seen
=
false
,
Data_seen
=
false
;
int
ntuples
,
act_tuple
;
struct
variable
data_var
;
va_start
(
args
,
index
);
if
(
!
ECPGresult
)
return
(
false
);
...
...
@@ -165,7 +167,11 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
--
index
;
type
=
va_arg
(
args
,
enum
ECPGdtype
);
memset
(
&
data_var
,
0
,
sizeof
data_var
);
data_var
.
type
=
ECPGt_EORT
;
data_var
.
ind_type
=
ECPGt_NO_INDICATOR
;
while
(
type
!=
ECPGd_EODT
)
{
char
type_str
[
20
];
...
...
@@ -184,26 +190,27 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
switch
(
type
)
{
case
(
ECPGd_indicator
):
data_var
.
ind_type
=
vartype
;
data_var
.
ind_pointer
=
var
;
data_var
.
ind_varcharsize
=
varcharsize
;
data_var
.
ind_arrsize
=
arrsize
;
data_var
.
ind_offset
=
offset
;
if
(
data_var
.
ind_arrsize
==
0
||
data_var
.
ind_varcharsize
==
0
)
data_var
.
ind_value
=
*
((
void
**
)
(
data_var
.
ind_pointer
));
else
data_var
.
ind_value
=
data_var
.
ind_pointer
;
break
;
/*
* this is like ECPGexecute missing : allocate arrays,
* perhaps this should go into a common function !!
*/
if
(
ntuples
>
arrsize
)
{
ECPGlog
(
"ECPGget_desc line %d: Incorrect number of matches: %d don't fit into array of %d
\n
"
,
lineno
,
ntuples
,
arrsize
);
ECPGraise
(
lineno
,
ECPG_TOO_MANY_MATCHES
,
NULL
);
return
false
;
}
Indicator_seen
=
true
;
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
-
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
)))
return
(
false
);
var
=
(
char
*
)
var
+
offset
;
ECPGlog
(
"ECPGget_desc: INDICATOR[%d] = %d
\n
"
,
act_tuple
,
-
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
));
}
case
ECPGd_data
:
data_var
.
type
=
vartype
;
data_var
.
pointer
=
var
;
data_var
.
varcharsize
=
varcharsize
;
data_var
.
arrsize
=
arrsize
;
data_var
.
offset
=
offset
;
if
(
data_var
.
arrsize
==
0
||
data_var
.
varcharsize
==
0
)
data_var
.
value
=
*
((
void
**
)
(
data_var
.
pointer
));
else
data_var
.
value
=
data_var
.
pointer
;
break
;
case
ECPGd_name
:
...
...
@@ -239,29 +246,6 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
ECPGlog
(
"ECPGget_desc: PRECISION = %d
\n
"
,
PQfmod
(
ECPGresult
,
index
)
>>
16
);
break
;
case
ECPGd_ret_length
:
case
ECPGd_ret_octet
:
/*
* this is like ECPGexecute missing : allocate arrays,
* perhaps this should go into a common function !!
*/
if
(
ntuples
>
arrsize
)
{
ECPGlog
(
"ECPGget_desc line %d: Incorrect number of matches: %d don't fit into array of %d
\n
"
,
lineno
,
ntuples
,
arrsize
);
ECPGraise
(
lineno
,
ECPG_TOO_MANY_MATCHES
,
NULL
);
return
false
;
}
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
PQgetlength
(
ECPGresult
,
act_tuple
,
index
)))
return
(
false
);
var
=
(
char
*
)
var
+
offset
;
ECPGlog
(
"ECPGget_desc: RETURNED[%d] = %d
\n
"
,
act_tuple
,
PQgetlength
(
ECPGresult
,
act_tuple
,
index
));
}
break
;
case
ECPGd_octet
:
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
PQfsize
(
ECPGresult
,
index
)))
return
(
false
);
...
...
@@ -289,38 +273,45 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
ECPGlog
(
"ECPGget_desc: TYPE = %d
\n
"
,
ECPGDynamicType_DDT
(
PQftype
(
ECPGresult
,
index
)));
break
;
case
ECPGd_data
:
case
ECPGd_cardinality
:
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
PQntuples
(
ECPGresult
)))
return
(
false
);
ECPGlog
(
"ECPGget_desc: CARDINALITY = %d
\n
"
,
PQntuples
(
ECPGresult
));
break
;
case
ECPGd_ret_length
:
case
ECPGd_ret_octet
:
/*
* this is like ECPGexecute missing : allocate arrays,
* perhaps this should go into a common function !!
* this is like ECPGstore_result
*/
if
(
ntuples
>
arrsize
)
if
(
arrsize
>
0
&&
ntuples
>
arrsize
)
{
ECPGlog
(
"ECPGget_desc line %d: Incorrect number of matches: %d don't fit into array of %d
\n
"
,
lineno
,
ntuples
,
arrsize
);
ECPGraise
(
lineno
,
ECPG_TOO_MANY_MATCHES
,
NULL
);
return
false
;
}
Data_seen
=
true
;
/* allocate storage if needed */
if
(
arrsize
==
0
&&
var
!=
NULL
&&
*
(
void
**
)
var
==
NULL
)
{
void
*
mem
=
(
void
*
)
ECPGalloc
(
offset
*
ntuples
,
lineno
);
*
(
void
**
)
var
=
mem
;
ECPGadd_mem
(
mem
,
lineno
);
var
=
mem
;
}
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
if
(
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
))
continue
;
/* do not touch data on null value */
if
(
!
get_data
(
ECPGresult
,
act_tuple
,
index
,
lineno
,
vartype
,
ECPGt_NO_INDICATOR
,
var
,
NULL
,
varcharsize
,
offset
,
false
))
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
PQgetlength
(
ECPGresult
,
act_tuple
,
index
)))
return
(
false
);
var
=
(
char
*
)
var
+
offset
;
ECPGlog
(
"ECPGget_desc: RETURNED[%d] = %d
\n
"
,
act_tuple
,
PQgetlength
(
ECPGresult
,
act_tuple
,
index
));
}
break
;
case
ECPGd_cardinality
:
if
(
!
get_int_item
(
lineno
,
var
,
vartype
,
PQntuples
(
ECPGresult
)))
return
(
false
);
ECPGlog
(
"ECPGget_desc: CARDINALITY = %d
\n
"
,
PQntuples
(
ECPGresult
));
break
;
default:
snprintf
(
type_str
,
sizeof
(
type_str
),
"%d"
,
type
);
ECPGraise
(
lineno
,
ECPG_UNKNOWN_DESCRIPTOR_ITEM
,
type_str
);
...
...
@@ -330,18 +321,45 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
type
=
va_arg
(
args
,
enum
ECPGdtype
);
}
if
(
Data_seen
&&
!
Indicator_seen
)
if
(
data_var
.
type
!=
ECPGt_EORT
)
{
struct
statement
stmt
;
memset
(
&
stmt
,
0
,
sizeof
stmt
);
stmt
.
lineno
=
lineno
;
/* desparate try to guess something sensible */
stmt
.
connection
=
ECPGget_connection
(
NULL
);
ECPGstore_result
(
ECPGresult
,
index
,
&
stmt
,
&
data_var
);
}
else
if
(
data_var
.
ind_type
!=
ECPGt_NO_INDICATOR
)
{
/*
* this is like ECPGstore_result
* but since we don't have a data variable at hand, we can't call it
*/
if
(
data_var
.
ind_arrsize
>
0
&&
ntuples
>
data_var
.
ind_arrsize
)
{
ECPGlog
(
"ECPGget_desc line %d: Incorrect number of matches (indicator): %d don't fit into array of %d
\n
"
,
lineno
,
ntuples
,
data_var
.
ind_arrsize
);
ECPGraise
(
lineno
,
ECPG_TOO_MANY_MATCHES
,
NULL
);
return
false
;
}
/* allocate storage if needed */
if
(
data_var
.
ind_arrsize
==
0
&&
data_var
.
ind_pointer
!=
NULL
&&
data_var
.
ind_value
==
NULL
)
{
void
*
mem
=
(
void
*
)
ECPGalloc
(
data_var
.
ind_offset
*
ntuples
,
lineno
);
*
(
void
**
)
data_var
.
ind_pointer
=
mem
;
ECPGadd_mem
(
mem
,
lineno
);
data_var
.
ind_value
=
mem
;
}
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
if
(
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
))
{
ECPGraise
(
lineno
,
ECPG_MISSING_INDICATOR
,
NULL
);
if
(
!
get_int_item
(
lineno
,
data_var
.
ind_value
,
data_var
.
ind_type
,
-
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
)))
return
(
false
);
}
data_var
.
ind_value
=
(
char
*
)
data_var
.
ind_value
+
data_var
.
ind_offset
;
ECPGlog
(
"ECPGget_desc: INDICATOR[%d] = %d
\n
"
,
act_tuple
,
-
PQgetisnull
(
ECPGresult
,
act_tuple
,
index
));
}
}
return
(
true
);
}
...
...
@@ -369,10 +387,10 @@ ECPGdeallocate_desc(int line, const char *name)
bool
ECPGallocate_desc
(
int
line
,
const
char
*
name
)
{
struct
descriptor
*
new
=
(
struct
descriptor
*
)
ecpg_
alloc
(
sizeof
(
struct
descriptor
),
line
);
struct
descriptor
*
new
=
(
struct
descriptor
*
)
ECPG
alloc
(
sizeof
(
struct
descriptor
),
line
);
new
->
next
=
all_descriptors
;
new
->
name
=
ecpg_
alloc
(
strlen
(
name
)
+
1
,
line
);
new
->
name
=
ECPG
alloc
(
strlen
(
name
)
+
1
,
line
);
new
->
result
=
PQmakeEmptyPGresult
(
NULL
,
0
);
strcpy
(
new
->
name
,
name
);
all_descriptors
=
new
;
...
...
src/interfaces/ecpg/lib/error.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/error.c,v 1.1
2 2001/10/18 20:32:58 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/error.c,v 1.1
3 2001/11/14 11:11:49 meskes
Exp $ */
#include "postgres_fe.h"
...
...
@@ -154,7 +154,7 @@ ECPGraise(int line, int code, const char *str)
ECPGlog
(
"raising sqlcode %d in line %d, '%s'.
\n
"
,
code
,
line
,
sqlca
.
sqlerrm
.
sqlerrmc
);
/* free all memory we have allocated for the user */
free_auto_mem
();
ECPG
free_auto_mem
();
}
/* print out an error message */
...
...
src/interfaces/ecpg/lib/execute.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.3
1 2001/11/05 17:46:37 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.3
2 2001/11/14 11:11:49 meskes
Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
...
...
@@ -55,22 +55,6 @@ struct sqlca sqlca =
}
};
struct
variable
{
enum
ECPGttype
type
;
void
*
value
;
void
*
pointer
;
long
varcharsize
;
long
arrsize
;
long
offset
;
enum
ECPGttype
ind_type
;
void
*
ind_value
;
long
ind_varcharsize
;
long
ind_arrsize
;
long
ind_offset
;
struct
variable
*
next
;
};
/* keep a list of memory we allocated for the user */
static
struct
auto_mem
{
...
...
@@ -78,17 +62,17 @@ static struct auto_mem
struct
auto_mem
*
next
;
}
*
auto_allocs
=
NULL
;
static
void
add_mem
(
void
*
ptr
,
int
lineno
)
void
ECPG
add_mem
(
void
*
ptr
,
int
lineno
)
{
struct
auto_mem
*
am
=
(
struct
auto_mem
*
)
ecpg_
alloc
(
sizeof
(
struct
auto_mem
),
lineno
);
struct
auto_mem
*
am
=
(
struct
auto_mem
*
)
ECPG
alloc
(
sizeof
(
struct
auto_mem
),
lineno
);
am
->
pointer
=
ptr
;
am
->
next
=
auto_allocs
;
auto_allocs
=
am
;
}
void
free_auto_mem
(
void
)
ECPG
free_auto_mem
(
void
)
{
struct
auto_mem
*
am
;
...
...
@@ -112,7 +96,7 @@ static
char
*
quote_postgres
(
char
*
arg
,
int
lineno
)
{
char
*
res
=
(
char
*
)
ecpg_
alloc
(
2
*
strlen
(
arg
)
+
3
,
lineno
);
char
*
res
=
(
char
*
)
ECPG
alloc
(
2
*
strlen
(
arg
)
+
3
,
lineno
);
int
i
,
ri
=
0
;
...
...
@@ -168,7 +152,7 @@ create_statement(int lineno, struct connection * connection, struct statement **
struct
variable
**
list
=
&
((
*
stmt
)
->
inlist
);
enum
ECPGttype
type
;
if
(
!
(
*
stmt
=
(
struct
statement
*
)
ecpg_
alloc
(
sizeof
(
struct
statement
),
lineno
)))
if
(
!
(
*
stmt
=
(
struct
statement
*
)
ECPG
alloc
(
sizeof
(
struct
statement
),
lineno
)))
return
false
;
(
*
stmt
)
->
command
=
query
;
...
...
@@ -188,7 +172,7 @@ create_statement(int lineno, struct connection * connection, struct statement **
struct
variable
*
var
,
*
ptr
;
if
(
!
(
var
=
(
struct
variable
*
)
ecpg_
alloc
(
sizeof
(
struct
variable
),
lineno
)))
if
(
!
(
var
=
(
struct
variable
*
)
ECPG
alloc
(
sizeof
(
struct
variable
),
lineno
)))
return
false
;
var
->
type
=
type
;
...
...
@@ -212,12 +196,18 @@ create_statement(int lineno, struct connection * connection, struct statement **
var
->
value
=
var
->
pointer
;
var
->
ind_type
=
va_arg
(
ap
,
enum
ECPGttype
);
var
->
ind_
value
=
va_arg
(
ap
,
void
*
);
var
->
ind_
pointer
=
va_arg
(
ap
,
void
*
);
var
->
ind_varcharsize
=
va_arg
(
ap
,
long
);
var
->
ind_arrsize
=
va_arg
(
ap
,
long
);
var
->
ind_offset
=
va_arg
(
ap
,
long
);
var
->
next
=
NULL
;
if
(
var
->
ind_type
!=
ECPGt_NO_INDICATOR
&&
(
var
->
ind_arrsize
==
0
||
var
->
ind_varcharsize
==
0
))
var
->
ind_value
=
*
((
void
**
)
(
var
->
ind_pointer
));
else
var
->
ind_value
=
var
->
ind_pointer
;
for
(
ptr
=
*
list
;
ptr
&&
ptr
->
next
;
ptr
=
ptr
->
next
);
if
(
ptr
==
NULL
)
...
...
@@ -285,7 +275,7 @@ static void
ECPGtypeinfocache_push
(
struct
ECPGtype_information_cache
**
cache
,
int
oid
,
bool
isarray
,
int
lineno
)
{
struct
ECPGtype_information_cache
*
new_entry
=
(
struct
ECPGtype_information_cache
*
)
ecpg_
alloc
(
sizeof
(
struct
ECPGtype_information_cache
),
lineno
);
=
(
struct
ECPGtype_information_cache
*
)
ECPG
alloc
(
sizeof
(
struct
ECPGtype_information_cache
),
lineno
);
new_entry
->
oid
=
oid
;
new_entry
->
isarray
=
isarray
;
...
...
@@ -347,6 +337,7 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
DATEOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
TIMEOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
TIMESTAMPOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
TIMESTAMPTZOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
INTERVALOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
TIMETZOID
,
false
,
stmt
->
lineno
);
ECPGtypeinfocache_push
(
&
(
stmt
->
connection
->
cache_head
),
ZPBITOID
,
false
,
stmt
->
lineno
);
...
...
@@ -360,7 +351,7 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
return
cache_entry
->
isarray
;
}
array_query
=
(
char
*
)
ecpg_
alloc
(
strlen
(
"select typelem from pg_type where oid="
)
+
11
,
stmt
->
lineno
);
array_query
=
(
char
*
)
ECPG
alloc
(
strlen
(
"select typelem from pg_type where oid="
)
+
11
,
stmt
->
lineno
);
sprintf
(
array_query
,
"select typelem from pg_type where oid=%d"
,
type
);
query
=
PQexec
(
stmt
->
connection
->
connection
,
array_query
);
free
(
array_query
);
...
...
@@ -430,17 +421,33 @@ ECPGstore_result(const PGresult *results, int act_field,
{
case
ECPGt_char
:
case
ECPGt_unsigned_char
:
var
->
varcharsize
=
0
;
/* check strlen for each tuple */
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
if
(
!
var
->
varcharsize
&&
!
var
->
arrsize
)
{
int
len
=
strlen
(
PQgetvalue
(
results
,
act_tuple
,
act_field
))
+
1
;
/* special mode for handling char**foo=0 */
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
len
+=
strlen
(
PQgetvalue
(
results
,
act_tuple
,
act_field
))
+
1
;
}
len
*=
var
->
offset
;
/* should be 1, but YMNK */
len
+=
(
ntuples
+
1
)
*
sizeof
(
char
*
);
if
(
len
>
var
->
varcharsize
)
var
->
varcharsize
=
len
;
ECPGlog
(
"ECPGstore_result: line %d: allocating %d bytes for %d tuples (char**=0)"
,
stmt
->
lineno
,
len
,
ntuples
);
}
else
{
var
->
varcharsize
=
0
;
/* check strlen for each tuple */
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
;
act_tuple
++
)
{
int
len
=
strlen
(
PQgetvalue
(
results
,
act_tuple
,
act_field
))
+
1
;
if
(
len
>
var
->
varcharsize
)
var
->
varcharsize
=
len
;
}
var
->
offset
*=
var
->
varcharsize
;
len
=
var
->
offset
*
ntuples
;
}
var
->
offset
*=
var
->
varcharsize
;
len
=
var
->
offset
*
ntuples
;
break
;
case
ECPGt_varchar
:
len
=
ntuples
*
(
var
->
varcharsize
+
sizeof
(
int
));
...
...
@@ -449,17 +456,58 @@ ECPGstore_result(const PGresult *results, int act_field,
len
=
var
->
offset
*
ntuples
;
break
;
}
var
->
value
=
(
void
*
)
ecpg_
alloc
(
len
,
stmt
->
lineno
);
var
->
value
=
(
void
*
)
ECPG
alloc
(
len
,
stmt
->
lineno
);
*
((
void
**
)
var
->
pointer
)
=
var
->
value
;
add_mem
(
var
->
value
,
stmt
->
lineno
);
ECPGadd_mem
(
var
->
value
,
stmt
->
lineno
);
}
/* allocate indicator variable if needed */
if
((
var
->
ind_arrsize
==
0
||
var
->
ind_varcharsize
==
0
)
&&
var
->
ind_value
==
NULL
&&
var
->
ind_pointer
!=
NULL
)
{
int
len
=
var
->
ind_offset
*
ntuples
;
var
->
ind_value
=
(
void
*
)
ECPGalloc
(
len
,
stmt
->
lineno
);
*
((
void
**
)
var
->
ind_pointer
)
=
var
->
ind_value
;
ECPGadd_mem
(
var
->
ind_value
,
stmt
->
lineno
);
}
/* fill the variable with the tuple(s) */
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
&&
status
;
act_tuple
++
)
if
(
!
var
->
varcharsize
&&
!
var
->
arrsize
&&
(
var
->
type
==
ECPGt_char
||
var
->
type
==
ECPGt_unsigned_char
))
{
/* special mode for handling char**foo=0 */
/* filling the array of (char*)s */
char
**
current_string
=
(
char
**
)
var
->
value
;
/* storing the data (after the last array element) */
char
*
current_data_location
=
(
char
*
)
&
current_string
[
ntuples
+
1
];
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
&&
status
;
act_tuple
++
)
{
int
len
=
strlen
(
PQgetvalue
(
results
,
act_tuple
,
act_field
))
+
1
;
if
(
!
ECPGget_data
(
results
,
act_tuple
,
act_field
,
stmt
->
lineno
,
var
->
type
,
var
->
ind_type
,
current_data_location
,
var
->
ind_value
,
len
,
0
,
isarray
))
status
=
false
;
else
{
*
current_string
=
current_data_location
;
current_data_location
+=
len
;
current_string
++
;
}
}
/* terminate the list */
*
current_string
=
NULL
;
}
else
{
if
(
!
get_data
(
results
,
act_tuple
,
act_field
,
stmt
->
lineno
,
var
->
type
,
var
->
ind_type
,
var
->
value
,
var
->
ind_value
,
var
->
varcharsize
,
var
->
offset
,
isarray
))
status
=
false
;
for
(
act_tuple
=
0
;
act_tuple
<
ntuples
&&
status
;
act_tuple
++
)
{
if
(
!
ECPGget_data
(
results
,
act_tuple
,
act_field
,
stmt
->
lineno
,
var
->
type
,
var
->
ind_type
,
var
->
value
,
var
->
ind_value
,
var
->
varcharsize
,
var
->
offset
,
isarray
))
status
=
false
;
}
}
return
status
;
}
...
...
@@ -515,7 +563,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
int
element
;
case
ECPGt_short
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -535,7 +583,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_int
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -555,7 +603,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_unsigned_short
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -575,7 +623,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_unsigned_int
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -595,7 +643,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_long
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -615,7 +663,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_unsigned_long
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -635,7 +683,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
#ifdef HAVE_LONG_LONG_INT_64
case
ECPGt_long_long
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
25
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
25
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -655,7 +703,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_unsigned_long_long
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
25
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
25
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -675,7 +723,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
#endif
/* HAVE_LONG_LONG_INT_64 */
case
ECPGt_float
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -695,7 +743,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_double
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -715,7 +763,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break
;
case
ECPGt_bool
:
if
(
!
(
mallocedval
=
ecpg_
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
var
->
arrsize
*
20
,
stmt
->
lineno
)))
return
false
;
if
(
var
->
arrsize
>
1
)
...
...
@@ -758,7 +806,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
/* set slen to string length if type is char * */
int
slen
=
(
var
->
varcharsize
==
0
)
?
strlen
((
char
*
)
var
->
value
)
:
var
->
varcharsize
;
if
(
!
(
newcopy
=
ecpg_
alloc
(
slen
+
1
,
stmt
->
lineno
)))
if
(
!
(
newcopy
=
ECPG
alloc
(
slen
+
1
,
stmt
->
lineno
)))
return
false
;
strncpy
(
newcopy
,
(
char
*
)
var
->
value
,
slen
);
...
...
@@ -778,7 +826,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
{
int
slen
=
strlen
((
char
*
)
var
->
value
);
if
(
!
(
mallocedval
=
ecpg_
alloc
(
slen
+
1
,
stmt
->
lineno
)))
if
(
!
(
mallocedval
=
ECPG
alloc
(
slen
+
1
,
stmt
->
lineno
)))
return
false
;
strncpy
(
mallocedval
,
(
char
*
)
var
->
value
,
slen
);
...
...
@@ -793,7 +841,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
struct
ECPGgeneric_varchar
*
variable
=
(
struct
ECPGgeneric_varchar
*
)
(
var
->
value
);
if
(
!
(
newcopy
=
(
char
*
)
ecpg_
alloc
(
variable
->
len
+
1
,
stmt
->
lineno
)))
if
(
!
(
newcopy
=
(
char
*
)
ECPG
alloc
(
variable
->
len
+
1
,
stmt
->
lineno
)))
return
false
;
strncpy
(
newcopy
,
variable
->
arr
,
variable
->
len
);
...
...
@@ -829,7 +877,7 @@ ECPGexecute(struct statement * stmt)
PGnotify
*
notify
;
struct
variable
*
var
;
copiedquery
=
ecpg_
strdup
(
stmt
->
command
,
stmt
->
lineno
);
copiedquery
=
ECPG
strdup
(
stmt
->
command
,
stmt
->
lineno
);
/*
* Now, if the type is one of the fill in types then we take the
...
...
@@ -853,7 +901,7 @@ ECPGexecute(struct statement * stmt)
* Now tobeinserted points to an area that is to be inserted at
* the first %s
*/
if
(
!
(
newcopy
=
(
char
*
)
ecpg_
alloc
(
strlen
(
copiedquery
)
+
strlen
(
tobeinserted
)
+
1
,
stmt
->
lineno
)))
if
(
!
(
newcopy
=
(
char
*
)
ECPG
alloc
(
strlen
(
copiedquery
)
+
strlen
(
tobeinserted
)
+
1
,
stmt
->
lineno
)))
return
false
;
strcpy
(
newcopy
,
copiedquery
);
...
...
@@ -1054,7 +1102,7 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
{
va_list
args
;
struct
statement
*
stmt
;
struct
connection
*
con
=
get_connection
(
connection_name
);
struct
connection
*
con
=
ECPG
get_connection
(
connection_name
);
bool
status
;
char
*
oldlocale
;
...
...
@@ -1063,7 +1111,7 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
oldlocale
=
strdup
(
setlocale
(
LC_NUMERIC
,
NULL
));
setlocale
(
LC_NUMERIC
,
"C"
);
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
{
setlocale
(
LC_NUMERIC
,
oldlocale
);
free
(
oldlocale
);
...
...
src/interfaces/ecpg/lib/extern.h
浏览文件 @
32a4c300
...
...
@@ -3,14 +3,15 @@
/* Here are some methods used by the lib. */
/* Returns a pointer to a string containing a simple type name. */
void
free_auto_mem
(
void
);
bool
get_data
(
const
PGresult
*
,
int
,
int
,
int
,
enum
ECPGttype
type
,
void
ECPGadd_mem
(
void
*
ptr
,
int
lineno
);
bool
ECPGget_data
(
const
PGresult
*
,
int
,
int
,
int
,
enum
ECPGttype
type
,
enum
ECPGttype
,
void
*
,
void
*
,
long
,
long
,
bool
);
struct
connection
*
get_connection
(
const
char
*
);
void
init_sqlca
(
void
);
char
*
ecpg_
alloc
(
long
,
int
);
bool
ecpg_
init
(
const
struct
connection
*
,
const
char
*
,
const
int
);
char
*
ecpg_
strdup
(
const
char
*
,
int
);
struct
connection
*
ECPG
get_connection
(
const
char
*
);
void
ECPG
init_sqlca
(
void
);
char
*
ECPG
alloc
(
long
,
int
);
bool
ECPG
init
(
const
struct
connection
*
,
const
char
*
,
const
int
);
char
*
ECPG
strdup
(
const
char
*
,
int
);
const
char
*
ECPGtype_name
(
enum
ECPGttype
);
unsigned
int
ECPGDynamicType
(
Oid
);
...
...
@@ -62,6 +63,23 @@ struct descriptor
struct
descriptor
*
next
;
};
struct
variable
{
enum
ECPGttype
type
;
void
*
value
;
void
*
pointer
;
long
varcharsize
;
long
arrsize
;
long
offset
;
enum
ECPGttype
ind_type
;
void
*
ind_value
;
void
*
ind_pointer
;
long
ind_varcharsize
;
long
ind_arrsize
;
long
ind_offset
;
struct
variable
*
next
;
};
PGresult
**
ECPGdescriptor_lvalue
(
int
line
,
const
char
*
descriptor
);
...
...
src/interfaces/ecpg/lib/memory.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/memory.c,v 1.
6 2001/10/05 17:37:07
meskes Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/memory.c,v 1.
7 2001/11/14 11:11:49
meskes Exp $ */
#include "postgres_fe.h"
...
...
@@ -8,7 +8,7 @@
#include "extern.h"
char
*
ecpg_
alloc
(
long
size
,
int
lineno
)
ECPG
alloc
(
long
size
,
int
lineno
)
{
char
*
new
=
(
char
*
)
calloc
(
1L
,
size
);
...
...
@@ -23,7 +23,7 @@ ecpg_alloc(long size, int lineno)
}
char
*
ecpg_
strdup
(
const
char
*
string
,
int
lineno
)
ECPG
strdup
(
const
char
*
string
,
int
lineno
)
{
char
*
new
=
strdup
(
string
);
...
...
src/interfaces/ecpg/lib/misc.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/misc.c,v 1.
9 2001/10/30 05:38:56 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/misc.c,v 1.
10 2001/11/14 11:11:49 meskes
Exp $ */
#include "postgres_fe.h"
...
...
@@ -40,15 +40,15 @@ static int simple_debug = 0;
static
FILE
*
debugstream
=
NULL
;
void
init_sqlca
(
void
)
ECPG
init_sqlca
(
void
)
{
memcpy
((
char
*
)
&
sqlca
,
(
char
*
)
&
sqlca_init
,
sizeof
(
sqlca
));
}
bool
ecpg_
init
(
const
struct
connection
*
con
,
const
char
*
connection_name
,
const
int
lineno
)
ECPG
init
(
const
struct
connection
*
con
,
const
char
*
connection_name
,
const
int
lineno
)
{
init_sqlca
();
ECPG
init_sqlca
();
if
(
con
==
NULL
)
{
ECPGraise
(
lineno
,
ECPG_NO_CONN
,
connection_name
?
connection_name
:
"NULL"
);
...
...
@@ -61,9 +61,9 @@ ecpg_init(const struct connection * con, const char *connection_name, const int
bool
ECPGstatus
(
int
lineno
,
const
char
*
connection_name
)
{
struct
connection
*
con
=
get_connection
(
connection_name
);
struct
connection
*
con
=
ECPG
get_connection
(
connection_name
);
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
return
(
false
);
/* are we connected? */
...
...
@@ -80,9 +80,9 @@ bool
ECPGtrans
(
int
lineno
,
const
char
*
connection_name
,
const
char
*
transaction
)
{
PGresult
*
res
;
struct
connection
*
con
=
get_connection
(
connection_name
);
struct
connection
*
con
=
ECPG
get_connection
(
connection_name
);
if
(
!
ecpg_
init
(
con
,
connection_name
,
lineno
))
if
(
!
ECPG
init
(
con
,
connection_name
,
lineno
))
return
(
false
);
ECPGlog
(
"ECPGtrans line %d action = %s connection = %s
\n
"
,
lineno
,
transaction
,
con
->
name
);
...
...
src/interfaces/ecpg/lib/pg_type.h
浏览文件 @
32a4c300
...
...
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pg_type.h,v 1.
5 2001/11/05 17:46:37 momjian
Exp $
* $Id: pg_type.h,v 1.
6 2001/11/14 11:11:49 meskes
Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
...
...
@@ -62,7 +62,8 @@
#define VARCHAROID 1043
#define DATEOID 1082
#define TIMEOID 1083
#define TIMESTAMPOID 1184
#define TIMESTAMPOID 1114
#define TIMESTAMPTZOID 1184
#define INTERVALOID 1186
#define TIMETZOID 1266
#define ZPBITOID 1560
...
...
src/interfaces/ecpg/lib/prepare.c
浏览文件 @
32a4c300
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/prepare.c,v 1.1
0 2001/11/05 17:46:37 momjian
Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/prepare.c,v 1.1
1 2001/11/14 11:11:49 meskes
Exp $ */
#include "postgres_fe.h"
...
...
@@ -69,11 +69,11 @@ ECPGprepare(int lineno, char *name, char *variable)
return
false
;
}
this
=
(
struct
prepared_statement
*
)
ecpg_
alloc
(
sizeof
(
struct
prepared_statement
),
lineno
);
this
=
(
struct
prepared_statement
*
)
ECPG
alloc
(
sizeof
(
struct
prepared_statement
),
lineno
);
if
(
!
this
)
return
false
;
stmt
=
(
struct
statement
*
)
ecpg_
alloc
(
sizeof
(
struct
statement
),
lineno
);
stmt
=
(
struct
statement
*
)
ECPG
alloc
(
sizeof
(
struct
statement
),
lineno
);
if
(
!
stmt
)
{
free
(
this
);
...
...
@@ -83,14 +83,14 @@ ECPGprepare(int lineno, char *name, char *variable)
/* create statement */
stmt
->
lineno
=
lineno
;
stmt
->
connection
=
NULL
;
stmt
->
command
=
ecpg_
strdup
(
variable
,
lineno
);
stmt
->
command
=
ECPG
strdup
(
variable
,
lineno
);
stmt
->
inlist
=
stmt
->
outlist
=
NULL
;
/* if we have C variables in our statment replace them with '?' */
replace_variables
(
stmt
->
command
);
/* add prepared statement to our list */
this
->
name
=
ecpg_
strdup
(
name
,
lineno
);
this
->
name
=
ECPG
strdup
(
name
,
lineno
);
this
->
stmt
=
stmt
;
if
(
prep_stmts
==
NULL
)
...
...
src/interfaces/ecpg/test/Makefile
浏览文件 @
32a4c300
# $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Makefile,v 1.3
1 2001/08/11 10:52:09 petere
Exp $
# $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Makefile,v 1.3
2 2001/11/14 11:11:49 meskes
Exp $
subdir
=
src/interfaces/ecpg/test
top_builddir
=
../../../..
...
...
@@ -8,7 +8,7 @@ override CPPFLAGS := -I$(srcdir)/../include $(CPPFLAGS)
ECPG
=
../preproc/ecpg
-I
$(srcdir)
/../include
TESTS
=
test1 test2 test3 test4 perftest dyntest dyntest2 test_notice test_code100 test_init
TESTS
=
test1 test2 test3 test4 perftest dyntest dyntest2 test_notice test_code100 test_init
testdynalloc
all
:
$(TESTS)
...
...
src/interfaces/ecpg/test/dyntest.pgc
浏览文件 @
32a4c300
...
...
@@ -2,7 +2,7 @@
*
* Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
*
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.
8 2001/08/11 10:52:09 petere
Exp $
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.
9 2001/11/14 11:11:49 meskes
Exp $
*/
#include <stdio.h>
...
...
src/interfaces/ecpg/test/dyntest2.pgc
浏览文件 @
32a4c300
...
...
@@ -2,7 +2,7 @@
*
* Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
*
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest2.pgc,v 1.
2 2001/08/11 10:52:09 petere
Exp $
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest2.pgc,v 1.
3 2001/11/14 11:11:49 meskes
Exp $
*/
#include <stdio.h>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录