Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
df6e5044
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,发现更多精彩内容 >>
提交
df6e5044
编写于
4月 13, 1999
作者:
M
Michael Meskes
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
*** empty log message ***
上级
adf5422d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
107 addition
and
49 deletion
+107
-49
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ChangeLog
+12
-0
src/interfaces/ecpg/include/ecpglib.h
src/interfaces/ecpg/include/ecpglib.h
+1
-0
src/interfaces/ecpg/lib/ecpglib.c
src/interfaces/ecpg/lib/ecpglib.c
+85
-8
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/pgc.l
+9
-41
未找到文件。
src/interfaces/ecpg/ChangeLog
浏览文件 @
df6e5044
...
...
@@ -544,5 +544,17 @@ Mon Mar 22 19:22:38 CET 1999
- Fixed incorrect password entry in parser.
- Made no_auto_trans available for each connection seperately.
Sat Apr 10 20:10:50 CEST 1999
- Allow ecpg handle a floating point constants.
- Fix ecpg runtime library memory leak (patch by Masaaki Sakaida).
Mon Apr 12 17:56:14 CEST 1999
- Fixed ECPG variable handling.
- Make no_auto_trans be accessible via SET command.
- Do not eat comments so line numbering should be correct.
- Set library version to 3.0.0
- Set ecpg version to 2.6.0
src/interfaces/ecpg/include/ecpglib.h
浏览文件 @
df6e5044
...
...
@@ -7,6 +7,7 @@ extern "C"
void
ECPGdebug
(
int
,
FILE
*
);
bool
ECPGstatus
(
int
,
const
char
*
);
bool
ECPGsetcommit
(
int
,
const
char
*
,
const
char
*
);
bool
ECPGsetconn
(
int
,
const
char
*
);
bool
ECPGconnect
(
int
,
const
char
*
,
const
char
*
,
const
char
*
,
const
char
*
,
int
);
bool
ECPGdo
(
int
,
const
char
*
,
char
*
,...);
...
...
src/interfaces/ecpg/lib/ecpglib.c
浏览文件 @
df6e5044
...
...
@@ -370,6 +370,34 @@ create_statement(int lineno, struct connection *connection, struct statement **
return
(
true
);
}
static
void
free_variable
(
struct
variable
*
var
)
{
struct
variable
*
var_next
;
if
(
var
==
(
struct
variable
*
)
NULL
)
return
;
var_next
=
var
->
next
;
free
(
var
);
while
(
var_next
)
{
var
=
var_next
;
var_next
=
var
->
next
;
free
(
var
);
}
}
static
void
free_statement
(
struct
statement
*
stmt
)
{
if
(
stmt
==
(
struct
statement
*
)
NULL
)
return
;
free_variable
(
stmt
->
inlist
);
free_variable
(
stmt
->
outlist
);
free
(
stmt
);
}
static
char
*
next_insert
(
char
*
text
)
{
...
...
@@ -981,7 +1009,6 @@ ECPGexecute(struct statement * stmt)
status
=
false
;
}
PQclear
(
results
);
break
;
case
PGRES_EMPTY_QUERY
:
/* do nothing */
...
...
@@ -1017,6 +1044,7 @@ ECPGexecute(struct statement * stmt)
status
=
false
;
break
;
}
PQclear
(
results
);
}
/* check for asynchronous returns */
...
...
@@ -1037,10 +1065,11 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
va_list
args
;
struct
statement
*
stmt
;
struct
connection
*
con
=
get_connection
(
connection_name
);
bool
status
;
if
(
con
==
NULL
)
{
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d."
,
connection_name
,
lineno
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d."
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
(
false
);
}
...
...
@@ -1057,7 +1086,9 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
return
false
;
}
return
(
ECPGexecute
(
stmt
));
status
=
ECPGexecute
(
stmt
);
free_statement
(
stmt
);
return
(
status
);
}
bool
...
...
@@ -1067,7 +1098,7 @@ ECPGstatus(int lineno, const char *connection_name)
if
(
con
==
NULL
)
{
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
,
lineno
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
(
false
);
}
...
...
@@ -1090,7 +1121,7 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
if
(
con
==
NULL
)
{
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
,
lineno
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
(
false
);
}
...
...
@@ -1125,6 +1156,52 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
return
true
;
}
bool
ECPGsetcommit
(
int
lineno
,
const
char
*
mode
,
const
char
*
connection_name
)
{
struct
connection
*
con
=
get_connection
(
connection_name
);
PGresult
*
results
;
if
(
con
)
{
if
(
con
->
no_auto_trans
==
true
&&
strncmp
(
mode
,
"ON"
,
strlen
(
"ON"
))
==
0
)
{
if
(
con
->
committed
)
{
if
((
results
=
PQexec
(
con
->
connection
,
"begin transaction"
))
==
NULL
)
{
register_error
(
ECPG_TRANS
,
"Error in transaction processing line %d."
,
lineno
);
return
false
;
}
PQclear
(
results
);
con
->
committed
=
false
;
}
con
->
no_auto_trans
=
false
;
}
else
if
(
con
->
no_auto_trans
==
false
&&
strncmp
(
mode
,
"OFF"
,
strlen
(
"OFF"
))
==
0
)
{
if
(
!
con
->
committed
)
{
if
((
results
=
PQexec
(
con
->
connection
,
"commit"
))
==
NULL
)
{
register_error
(
ECPG_TRANS
,
"Error in transaction processing line %d."
,
lineno
);
return
false
;
}
PQclear
(
results
);
con
->
committed
=
true
;
}
con
->
no_auto_trans
=
true
;
}
}
else
{
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
false
;
}
return
true
;
}
bool
ECPGsetconn
(
int
lineno
,
const
char
*
connection_name
)
{
...
...
@@ -1137,7 +1214,7 @@ ECPGsetconn(int lineno, const char *connection_name)
}
else
{
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
,
lineno
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
false
;
}
}
...
...
@@ -1207,8 +1284,8 @@ ECPGdisconnect(int lineno, const char *connection_name)
if
(
con
==
NULL
)
{
ECPGlog
(
"disconnect: not connected to connection %s
\n
"
,
connection_name
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
,
lineno
);
ECPGlog
(
"disconnect: not connected to connection %s
\n
"
,
connection_name
?
connection_name
:
"NULL"
);
register_error
(
ECPG_NO_CONN
,
"No such connection %s in line %d"
,
connection_name
?
connection_name
:
"NULL"
,
lineno
);
return
false
;
}
else
...
...
src/interfaces/ecpg/preproc/pgc.l
浏览文件 @
df6e5044
...
...
@@ -178,17 +178,18 @@ cppline {space}*#.*(\\{space}*\n)*\n*
%%
<SQL>{comment} { /* ignore */ }
{xcline} {
/* ignore */
}
{xcline} {
ECHO;
}
<xc>{xcstar} {
/* ignore */
}
<xc>{xcstar} {
ECHO;
}
{xcstart} {
before_comment = YYSTATE;
ECHO;
BEGIN(xc);
}
<xc>{xcstop} { BEGIN(before_comment); }
<xc>{xcstop} {
ECHO;
BEGIN(before_comment); }
<xc>{xcinside} {
/* ignore */
}
<xc>{xcinside} {
ECHO;
}
<SQL>{xbstart} {
BEGIN(xb);
...
...
@@ -376,7 +377,7 @@ cppline {space}*#.*(\\{space}*\n)*\n*
}
}
}
<SQL>{integer}/{space}*-{number} {
<
C,
SQL>{integer}/{space}*-{number} {
char* endptr;
BEGIN(xm);
...
...
@@ -393,7 +394,7 @@ cppline {space}*#.*(\\{space}*\n)*\n*
}
return ICONST;
}
<SQL>{real}/{space}*-{number} {
<
C,
SQL>{real}/{space}*-{number} {
char* endptr;
BEGIN(xm);
...
...
@@ -403,7 +404,7 @@ cppline {space}*#.*(\\{space}*\n)*\n*
yyerror("ERROR: Bad float8 input");
return FCONST;
}
<SQL>{integer} {
<
C,
SQL>{integer} {
char* endptr;
errno = 0;
...
...
@@ -419,7 +420,7 @@ cppline {space}*#.*(\\{space}*\n)*\n*
}
return ICONST;
}
<SQL>{real} {
<
C,
SQL>{real} {
char* endptr;
errno = 0;
...
...
@@ -428,39 +429,6 @@ cppline {space}*#.*(\\{space}*\n)*\n*
yyerror("ERROR: Bad float input");
return FCONST;
}
<C>{integer}/{space}*-{number} {
char* endptr;
BEGIN(xm);
errno = 0;
yylval.ival = strtol((char *)yytext,&endptr,10);
if (*endptr != '\0' || errno == ERANGE)
{
errno = 0;
yylval.dval = strtod(((char *)yytext),&endptr);
if (*endptr != '\0' || errno == ERANGE)
yyerror("ERROR: Bad integer input");
yyerror("WARNING: Integer input is out of range; promoted to float");
return FCONST;
}
return ICONST;
}
<C>{integer} {
char* endptr;
errno = 0;
yylval.ival = strtol((char *)yytext,&endptr,10);
if (*endptr != '\0' || errno == ERANGE)
{
errno = 0;
yylval.dval = strtod(((char *)yytext),&endptr);
if (*endptr != '\0' || errno == ERANGE)
yyerror("ERROR: Bad integer input");
yyerror("WARNING: Integer input is out of range; promoted to float");
return FCONST;
}
return ICONST;
}
<SQL>:{identifier}(("->"|\.){identifier})* {
yylval.str = mm_strdup((char*)yytext+1);
return(CVARIABLE);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录