Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
755a8733
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,发现更多精彩内容 >>
提交
755a8733
编写于
2月 10, 2001
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Run pgindent over ODBC source. We couldn't do this years ago because we
weren't the master source. We are now, and it really needs it.
上级
505a828a
变更
44
展开全部
隐藏空白更改
内联
并排
Showing
44 changed file
with
10952 addition
and
9161 deletion
+10952
-9161
src/interfaces/odbc/bind.c
src/interfaces/odbc/bind.c
+193
-148
src/interfaces/odbc/bind.h
src/interfaces/odbc/bind.h
+30
-23
src/interfaces/odbc/columninfo.c
src/interfaces/odbc/columninfo.c
+47
-44
src/interfaces/odbc/columninfo.h
src/interfaces/odbc/columninfo.h
+17
-16
src/interfaces/odbc/connection.c
src/interfaces/odbc/connection.c
+713
-597
src/interfaces/odbc/connection.h
src/interfaces/odbc/connection.h
+116
-105
src/interfaces/odbc/convert.c
src/interfaces/odbc/convert.c
+1023
-855
src/interfaces/odbc/convert.h
src/interfaces/odbc/convert.h
+37
-36
src/interfaces/odbc/dlg_specific.c
src/interfaces/odbc/dlg_specific.c
+509
-478
src/interfaces/odbc/dlg_specific.h
src/interfaces/odbc/dlg_specific.h
+70
-60
src/interfaces/odbc/drvconn.c
src/interfaces/odbc/drvconn.c
+183
-159
src/interfaces/odbc/environ.c
src/interfaces/odbc/environ.c
+384
-347
src/interfaces/odbc/environ.h
src/interfaces/odbc/environ.h
+12
-11
src/interfaces/odbc/execute.c
src/interfaces/odbc/execute.c
+360
-257
src/interfaces/odbc/gpps.c
src/interfaces/odbc/gpps.c
+168
-180
src/interfaces/odbc/gpps.h
src/interfaces/odbc/gpps.h
+20
-13
src/interfaces/odbc/info.c
src/interfaces/odbc/info.c
+2013
-1617
src/interfaces/odbc/iodbc.h
src/interfaces/odbc/iodbc.h
+64
-64
src/interfaces/odbc/isql.h
src/interfaces/odbc/isql.h
+167
-166
src/interfaces/odbc/isqlext.h
src/interfaces/odbc/isqlext.h
+672
-658
src/interfaces/odbc/lobj.c
src/interfaces/odbc/lobj.c
+48
-50
src/interfaces/odbc/lobj.h
src/interfaces/odbc/lobj.h
+18
-18
src/interfaces/odbc/misc.c
src/interfaces/odbc/misc.c
+83
-64
src/interfaces/odbc/misc.h
src/interfaces/odbc/misc.h
+40
-38
src/interfaces/odbc/options.c
src/interfaces/odbc/options.c
+488
-422
src/interfaces/odbc/parse.c
src/interfaces/odbc/parse.c
+345
-227
src/interfaces/odbc/pgtypes.c
src/interfaces/odbc/pgtypes.c
+649
-493
src/interfaces/odbc/pgtypes.h
src/interfaces/odbc/pgtypes.h
+63
-64
src/interfaces/odbc/psqlodbc.c
src/interfaces/odbc/psqlodbc.c
+48
-45
src/interfaces/odbc/psqlodbc.h
src/interfaces/odbc/psqlodbc.h
+87
-69
src/interfaces/odbc/qresult.c
src/interfaces/odbc/qresult.c
+289
-232
src/interfaces/odbc/qresult.h
src/interfaces/odbc/qresult.h
+67
-60
src/interfaces/odbc/resource.h
src/interfaces/odbc/resource.h
+49
-49
src/interfaces/odbc/results.c
src/interfaces/odbc/results.c
+665
-525
src/interfaces/odbc/setup.c
src/interfaces/odbc/setup.c
+315
-289
src/interfaces/odbc/socket.c
src/interfaces/odbc/socket.c
+143
-126
src/interfaces/odbc/socket.h
src/interfaces/odbc/socket.h
+28
-25
src/interfaces/odbc/statement.c
src/interfaces/odbc/statement.c
+438
-307
src/interfaces/odbc/statement.h
src/interfaces/odbc/statement.h
+123
-96
src/interfaces/odbc/tuple.c
src/interfaces/odbc/tuple.c
+24
-20
src/interfaces/odbc/tuple.h
src/interfaces/odbc/tuple.h
+19
-16
src/interfaces/odbc/tuplelist.c
src/interfaces/odbc/tuplelist.c
+108
-78
src/interfaces/odbc/tuplelist.h
src/interfaces/odbc/tuplelist.h
+16
-13
src/tools/pgindent/README
src/tools/pgindent/README
+1
-1
未找到文件。
src/interfaces/odbc/bind.c
浏览文件 @
755a8733
/* Module:
bind.c
/* Module:
bind.c
*
* Description:
This module contains routines related to binding
*
columns and parameters.
* Description:
This module contains routines related to binding
*
columns and parameters.
*
* Classes:
BindInfoClass, ParameterInfoClass
* Classes:
BindInfoClass, ParameterInfoClass
*
* API functions:
SQLBindParameter, SQLBindCol, SQLDescribeParam, SQLNumParams,
*
SQLParamOptions(NI)
* API functions:
SQLBindParameter, SQLBindCol, SQLDescribeParam, SQLNumParams,
*
SQLParamOptions(NI)
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -33,39 +33,44 @@
#include "sqlext.h"
#endif
/* Bind parameters on a statement handle */
RETCODE
SQL_API
SQLBindParameter
(
HSTMT
hstmt
,
UWORD
ipar
,
SWORD
fParamType
,
SWORD
fCType
,
SWORD
fSqlType
,
UDWORD
cbColDef
,
SWORD
ibScale
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
FAR
*
pcbValue
)
/* Bind parameters on a statement handle */
RETCODE
SQL_API
SQLBindParameter
(
HSTMT
hstmt
,
UWORD
ipar
,
SWORD
fParamType
,
SWORD
fCType
,
SWORD
fSqlType
,
UDWORD
cbColDef
,
SWORD
ibScale
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
FAR
*
pcbValue
)
{
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLBindParameter"
;
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLBindParameter"
;
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"%s: entering...
\n
"
,
func
);
if
(
!
stmt
)
{
if
(
!
stmt
)
{
SC_log_error
(
func
,
""
,
NULL
);
return
SQL_INVALID_HANDLE
;
}
if
(
stmt
->
parameters_allocated
<
ipar
)
{
if
(
stmt
->
parameters_allocated
<
ipar
)
{
ParameterInfoClass
*
old_parameters
;
int
i
,
old_parameters_allocated
;
int
i
,
old_parameters_allocated
;
old_parameters
=
stmt
->
parameters
;
old_parameters_allocated
=
stmt
->
parameters_allocated
;
stmt
->
parameters
=
(
ParameterInfoClass
*
)
malloc
(
sizeof
(
ParameterInfoClass
)
*
(
ipar
));
if
(
!
stmt
->
parameters
)
{
stmt
->
parameters
=
(
ParameterInfoClass
*
)
malloc
(
sizeof
(
ParameterInfoClass
)
*
(
ipar
));
if
(
!
stmt
->
parameters
)
{
stmt
->
errornumber
=
STMT_NO_MEMORY_ERROR
;
stmt
->
errormsg
=
"Could not allocate memory for statement parameters"
;
SC_log_error
(
func
,
""
,
stmt
);
...
...
@@ -75,18 +80,23 @@ static char *func="SQLBindParameter";
stmt
->
parameters_allocated
=
ipar
;
/* copy the old parameters over */
for
(
i
=
0
;
i
<
old_parameters_allocated
;
i
++
)
{
for
(
i
=
0
;
i
<
old_parameters_allocated
;
i
++
)
{
/* a structure copy should work */
stmt
->
parameters
[
i
]
=
old_parameters
[
i
];
}
/* get rid of the old parameters, if there were any */
if
(
old_parameters
)
if
(
old_parameters
)
free
(
old_parameters
);
/* zero out the newly allocated parameters (in case they skipped some, */
/*
* zero out the newly allocated parameters (in case they skipped
* some,
*/
/* so we don't accidentally try to use them later) */
for
(;
i
<
stmt
->
parameters_allocated
;
i
++
)
{
for
(;
i
<
stmt
->
parameters_allocated
;
i
++
)
{
stmt
->
parameters
[
i
].
buflen
=
0
;
stmt
->
parameters
[
i
].
buffer
=
0
;
stmt
->
parameters
[
i
].
used
=
0
;
...
...
@@ -102,7 +112,8 @@ static char *func="SQLBindParameter";
}
}
ipar
--
;
/* use zero based column numbers for the below part */
ipar
--
;
/* use zero based column numbers for the
* below part */
/* store the given info */
stmt
->
parameters
[
ipar
].
buflen
=
cbValueMax
;
...
...
@@ -114,74 +125,84 @@ static char *func="SQLBindParameter";
stmt
->
parameters
[
ipar
].
precision
=
cbColDef
;
stmt
->
parameters
[
ipar
].
scale
=
ibScale
;
/* If rebinding a parameter that had data-at-exec stuff in it,
then free that stuff
*/
if
(
stmt
->
parameters
[
ipar
].
EXEC_used
)
{
/*
* If rebinding a parameter that had data-at-exec stuff in it, then
* free that stuff
*/
if
(
stmt
->
parameters
[
ipar
].
EXEC_used
)
{
free
(
stmt
->
parameters
[
ipar
].
EXEC_used
);
stmt
->
parameters
[
ipar
].
EXEC_used
=
NULL
;
}
if
(
stmt
->
parameters
[
ipar
].
EXEC_buffer
)
{
if
(
stmt
->
parameters
[
ipar
].
EXEC_buffer
)
{
if
(
stmt
->
parameters
[
ipar
].
SQLType
!=
SQL_LONGVARBINARY
)
free
(
stmt
->
parameters
[
ipar
].
EXEC_buffer
);
stmt
->
parameters
[
ipar
].
EXEC_buffer
=
NULL
;
}
/*
Data at exec macro only valid for C char/binary data */
/*
Data at exec macro only valid for C char/binary data */
if
((
fSqlType
==
SQL_LONGVARBINARY
||
fSqlType
==
SQL_LONGVARCHAR
)
&&
pcbValue
&&
*
pcbValue
<=
SQL_LEN_DATA_AT_EXEC_OFFSET
)
stmt
->
parameters
[
ipar
].
data_at_exec
=
TRUE
;
else
stmt
->
parameters
[
ipar
].
data_at_exec
=
FALSE
;
mylog
(
"SQLBindParamater: ipar=%d, paramType=%d, fCType=%d, fSqlType=%d, cbColDef=%d, ibScale=%d, rgbValue=%d, *pcbValue = %d, data_at_exec = %d
\n
"
,
ipar
,
fParamType
,
fCType
,
fSqlType
,
cbColDef
,
ibScale
,
rgbValue
,
pcbValue
?
*
pcbValue
:
-
777
,
stmt
->
parameters
[
ipar
].
data_at_exec
);
mylog
(
"SQLBindParamater: ipar=%d, paramType=%d, fCType=%d, fSqlType=%d, cbColDef=%d, ibScale=%d, rgbValue=%d, *pcbValue = %d, data_at_exec = %d
\n
"
,
ipar
,
fParamType
,
fCType
,
fSqlType
,
cbColDef
,
ibScale
,
rgbValue
,
pcbValue
?
*
pcbValue
:
-
777
,
stmt
->
parameters
[
ipar
].
data_at_exec
);
return
SQL_SUCCESS
;
}
/* - - - - - - - - - */
/* Associate a user-supplied buffer with a database column. */
RETCODE
SQL_API
SQLBindCol
(
HSTMT
hstmt
,
UWORD
icol
,
SWORD
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
FAR
*
pcbValue
)
/* - - - - - - - - - */
/* Associate a user-supplied buffer with a database column. */
RETCODE
SQL_API
SQLBindCol
(
HSTMT
hstmt
,
UWORD
icol
,
SWORD
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
FAR
*
pcbValue
)
{
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLBindCol"
;
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLBindCol"
;
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"**** SQLBindCol: stmt = %u, icol = %d
\n
"
,
stmt
,
icol
);
mylog
(
"**** SQLBindCol: stmt = %u, icol = %d
\n
"
,
stmt
,
icol
);
if
(
!
stmt
)
{
if
(
!
stmt
)
{
SC_log_error
(
func
,
""
,
NULL
);
return
SQL_INVALID_HANDLE
;
}
SC_clear_error
(
stmt
);
if
(
stmt
->
status
==
STMT_EXECUTING
)
{
if
(
stmt
->
status
==
STMT_EXECUTING
)
{
stmt
->
errormsg
=
"Can't bind columns while statement is still executing."
;
stmt
->
errornumber
=
STMT_SEQUENCE_ERROR
;
SC_log_error
(
func
,
""
,
stmt
);
return
SQL_ERROR
;
}
/* If the bookmark column is being bound, then just save it */
if
(
icol
==
0
)
{
/* If the bookmark column is being bound, then just save it */
if
(
icol
==
0
)
{
if
(
rgbValue
==
NULL
)
{
if
(
rgbValue
==
NULL
)
{
stmt
->
bookmark
.
buffer
=
NULL
;
stmt
->
bookmark
.
used
=
NULL
;
}
else
{
/* Make sure it is the bookmark data type */
if
(
fCType
!=
SQL_C_BOOKMARK
)
{
else
{
/* Make sure it is the bookmark data type */
if
(
fCType
!=
SQL_C_BOOKMARK
)
{
stmt
->
errormsg
=
"Column 0 is not of type SQL_C_BOOKMARK"
;
stmt
->
errornumber
=
STMT_PROGRAM_TYPE_OUT_OF_RANGE
;
SC_log_error
(
func
,
""
,
stmt
);
...
...
@@ -194,37 +215,42 @@ mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol);
return
SQL_SUCCESS
;
}
/*
allocate enough bindings if not already done */
/*
Most likely, execution of a statement would have setup the */
/*
necessary bindings. But some apps call BindCol before any */
/*
statement is executed. */
if
(
icol
>
stmt
->
bindings_allocated
)
/*
allocate enough bindings if not already done */
/*
Most likely, execution of a statement would have setup the */
/*
necessary bindings. But some apps call BindCol before any */
/*
statement is executed. */
if
(
icol
>
stmt
->
bindings_allocated
)
extend_bindings
(
stmt
,
icol
);
/* check to see if the bindings were allocated */
if
(
!
stmt
->
bindings
)
{
/* check to see if the bindings were allocated */
if
(
!
stmt
->
bindings
)
{
stmt
->
errormsg
=
"Could not allocate memory for bindings."
;
stmt
->
errornumber
=
STMT_NO_MEMORY_ERROR
;
SC_log_error
(
func
,
""
,
stmt
);
return
SQL_ERROR
;
}
icol
--
;
/* use zero based col numbers from here out */
icol
--
;
/* use zero based col numbers from here
* out */
/*
Reset for SQLGetData */
/*
Reset for SQLGetData */
stmt
->
bindings
[
icol
].
data_left
=
-
1
;
if
(
rgbValue
==
NULL
)
{
if
(
rgbValue
==
NULL
)
{
/* we have to unbind the column */
stmt
->
bindings
[
icol
].
buflen
=
0
;
stmt
->
bindings
[
icol
].
buffer
=
NULL
;
stmt
->
bindings
[
icol
].
used
=
NULL
;
stmt
->
bindings
[
icol
].
used
=
NULL
;
stmt
->
bindings
[
icol
].
returntype
=
SQL_C_CHAR
;
}
else
{
}
else
{
/* ok, bind that column */
stmt
->
bindings
[
icol
].
buflen
=
cbValueMax
;
stmt
->
bindings
[
icol
].
buffer
=
rgbValue
;
stmt
->
bindings
[
icol
].
used
=
pcbValue
;
stmt
->
bindings
[
icol
].
buflen
=
cbValueMax
;
stmt
->
bindings
[
icol
].
buffer
=
rgbValue
;
stmt
->
bindings
[
icol
].
used
=
pcbValue
;
stmt
->
bindings
[
icol
].
returntype
=
fCType
;
mylog
(
" bound buffer[%d] = %u
\n
"
,
icol
,
stmt
->
bindings
[
icol
].
buffer
);
...
...
@@ -233,34 +259,37 @@ mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol);
return
SQL_SUCCESS
;
}
/*
- - - - - - - -
- */
/*
- - - - - - - -
- */
/*
Returns the description of a parameter marker. */
/*
Returns the description of a parameter marker. */
/* This function is listed as not being supported by SQLGetFunctions() because it is */
/* used to describe "parameter markers" (not bound parameters), in which case, */
/* the dbms should return info on the markers. Since Postgres doesn't support that, */
/* it is best to say this function is not supported and let the application assume a */
/* data type (most likely varchar). */
RETCODE
SQL_API
SQLDescribeParam
(
HSTMT
hstmt
,
UWORD
ipar
,
SWORD
FAR
*
pfSqlType
,
UDWORD
FAR
*
pcbColDef
,
SWORD
FAR
*
pibScale
,
SWORD
FAR
*
pfNullable
)
RETCODE
SQL_API
SQLDescribeParam
(
HSTMT
hstmt
,
UWORD
ipar
,
SWORD
FAR
*
pfSqlType
,
UDWORD
FAR
*
pcbColDef
,
SWORD
FAR
*
pibScale
,
SWORD
FAR
*
pfNullable
)
{
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLDescribeParam"
;
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
static
char
*
func
=
"SQLDescribeParam"
;
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"%s: entering...
\n
"
,
func
);
if
(
!
stmt
)
{
if
(
!
stmt
)
{
SC_log_error
(
func
,
""
,
NULL
);
return
SQL_INVALID_HANDLE
;
}
if
(
(
ipar
<
1
)
||
(
ipar
>
stmt
->
parameters_allocated
)
)
{
if
((
ipar
<
1
)
||
(
ipar
>
stmt
->
parameters_allocated
))
{
stmt
->
errormsg
=
"Invalid parameter number for SQLDescribeParam."
;
stmt
->
errornumber
=
STMT_BAD_PARAMETER_NUMBER_ERROR
;
SC_log_error
(
func
,
""
,
stmt
);
...
...
@@ -269,41 +298,45 @@ static char *func = "SQLDescribeParam";
ipar
--
;
/* This implementation is not very good, since it is supposed to describe */
/* parameter markers, not bound parameters. */
if
(
pfSqlType
)
/*
* This implementation is not very good, since it is supposed to
* describe
*/
/* parameter markers, not bound parameters. */
if
(
pfSqlType
)
*
pfSqlType
=
stmt
->
parameters
[
ipar
].
SQLType
;
if
(
pcbColDef
)
if
(
pcbColDef
)
*
pcbColDef
=
stmt
->
parameters
[
ipar
].
precision
;
if
(
pibScale
)
if
(
pibScale
)
*
pibScale
=
stmt
->
parameters
[
ipar
].
scale
;
if
(
pfNullable
)
if
(
pfNullable
)
*
pfNullable
=
pgtype_nullable
(
stmt
,
stmt
->
parameters
[
ipar
].
paramType
);
return
SQL_SUCCESS
;
}
/*
- - - - - - - -
- */
/*
- - - - - - - -
- */
/*
Sets multiple values (arrays) for the set of parameter markers. */
/*
Sets multiple values (arrays) for the set of parameter markers. */
RETCODE
SQL_API
SQLParamOptions
(
HSTMT
hstmt
,
UDWORD
crow
,
UDWORD
FAR
*
pirow
)
RETCODE
SQL_API
SQLParamOptions
(
HSTMT
hstmt
,
UDWORD
crow
,
UDWORD
FAR
*
pirow
)
{
static
char
*
func
=
"SQLParamOptions"
;
static
char
*
func
=
"SQLParamOptions"
;
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"%s: entering...
\n
"
,
func
);
SC_log_error
(
func
,
"Function not implemented"
,
(
StatementClass
*
)
hstmt
);
return
SQL_ERROR
;
}
/*
- - - - - - - -
- */
/*
- - - - - - - -
- */
/* This function should really talk to the dbms to determine the number of */
/* "parameter markers" (not bound parameters) in the statement. But, since */
...
...
@@ -312,43 +345,51 @@ static char *func = "SQLParamOptions";
/* like it does for SQLDescribeParam is that some applications don't care and try */
/* to call it anyway. */
/* If the statement does not have parameters, it should just return 0. */
RETCODE
SQL_API
SQLNumParams
(
HSTMT
hstmt
,
SWORD
FAR
*
pcpar
)
RETCODE
SQL_API
SQLNumParams
(
HSTMT
hstmt
,
SWORD
FAR
*
pcpar
)
{
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
char
in_quote
=
FALSE
;
unsigned
int
i
;
static
char
*
func
=
"SQLNumParams"
;
StatementClass
*
stmt
=
(
StatementClass
*
)
hstmt
;
char
in_quote
=
FALSE
;
unsigned
int
i
;
static
char
*
func
=
"SQLNumParams"
;
mylog
(
"%s: entering...
\n
"
,
func
);
mylog
(
"%s: entering...
\n
"
,
func
);
if
(
!
stmt
)
{
if
(
!
stmt
)
{
SC_log_error
(
func
,
""
,
NULL
);
return
SQL_INVALID_HANDLE
;
}
if
(
pcpar
)
*
pcpar
=
0
;
else
{
else
{
SC_log_error
(
func
,
"pcpar was null"
,
stmt
);
return
SQL_ERROR
;
}
if
(
!
stmt
->
statement
)
{
if
(
!
stmt
->
statement
)
{
/* no statement has been allocated */
stmt
->
errormsg
=
"SQLNumParams called with no statement ready."
;
stmt
->
errornumber
=
STMT_SEQUENCE_ERROR
;
SC_log_error
(
func
,
""
,
stmt
);
return
SQL_ERROR
;
}
else
{
}
else
{
for
(
i
=
0
;
i
<
strlen
(
stmt
->
statement
);
i
++
)
{
for
(
i
=
0
;
i
<
strlen
(
stmt
->
statement
);
i
++
)
{
if
(
stmt
->
statement
[
i
]
==
'?'
&&
!
in_quote
)
if
(
stmt
->
statement
[
i
]
==
'?'
&&
!
in_quote
)
(
*
pcpar
)
++
;
else
{
else
{
if
(
stmt
->
statement
[
i
]
==
'\''
)
in_quote
=
(
in_quote
?
FALSE
:
TRUE
);
}
...
...
@@ -359,20 +400,20 @@ static char *func = "SQLNumParams";
}
/********************************************************************
*
Bindings Implementation
*
Bindings Implementation
*/
BindInfoClass
*
create_empty_bindings
(
int
num_columns
)
{
BindInfoClass
*
new_bindings
;
int
i
;
BindInfoClass
*
new_bindings
;
int
i
;
new_bindings
=
(
BindInfoClass
*
)
malloc
(
num_columns
*
sizeof
(
BindInfoClass
));
if
(
!
new_bindings
)
{
new_bindings
=
(
BindInfoClass
*
)
malloc
(
num_columns
*
sizeof
(
BindInfoClass
));
if
(
!
new_bindings
)
return
0
;
}
for
(
i
=
0
;
i
<
num_columns
;
i
++
)
{
for
(
i
=
0
;
i
<
num_columns
;
i
++
)
{
new_bindings
[
i
].
buflen
=
0
;
new_bindings
[
i
].
buffer
=
NULL
;
new_bindings
[
i
].
used
=
NULL
;
...
...
@@ -383,23 +424,26 @@ int i;
}
void
extend_bindings
(
StatementClass
*
stmt
,
int
num_columns
)
extend_bindings
(
StatementClass
*
stmt
,
int
num_columns
)
{
static
char
*
func
=
"extend_bindings"
;
BindInfoClass
*
new_bindings
;
int
i
;
static
char
*
func
=
"extend_bindings"
;
BindInfoClass
*
new_bindings
;
int
i
;
mylog
(
"%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d
\n
"
,
func
,
stmt
,
stmt
->
bindings_allocated
,
num_columns
);
mylog
(
"%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d
\n
"
,
func
,
stmt
,
stmt
->
bindings_allocated
,
num_columns
);
/* if we have too few, allocate room for more, and copy the old */
/* entries into the new structure */
if
(
stmt
->
bindings_allocated
<
num_columns
)
{
if
(
stmt
->
bindings_allocated
<
num_columns
)
{
new_bindings
=
create_empty_bindings
(
num_columns
);
if
(
!
new_bindings
)
{
mylog
(
"%s: unable to create %d new bindings from %d old bindings
\n
"
,
func
,
num_columns
,
stmt
->
bindings_allocated
);
if
(
!
new_bindings
)
{
mylog
(
"%s: unable to create %d new bindings from %d old bindings
\n
"
,
func
,
num_columns
,
stmt
->
bindings_allocated
);
if
(
stmt
->
bindings
)
{
if
(
stmt
->
bindings
)
{
free
(
stmt
->
bindings
);
stmt
->
bindings
=
NULL
;
}
...
...
@@ -407,8 +451,9 @@ mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func,
return
;
}
if
(
stmt
->
bindings
)
{
for
(
i
=
0
;
i
<
stmt
->
bindings_allocated
;
i
++
)
if
(
stmt
->
bindings
)
{
for
(
i
=
0
;
i
<
stmt
->
bindings_allocated
;
i
++
)
new_bindings
[
i
]
=
stmt
->
bindings
[
i
];
free
(
stmt
->
bindings
);
...
...
@@ -417,14 +462,14 @@ mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func,
stmt
->
bindings
=
new_bindings
;
stmt
->
bindings_allocated
=
num_columns
;
}
/*
There is no reason to zero out extra bindings if there are */
/*
more than needed. If an app has allocated extra bindings, */
/*
let it worry about it by unbinding those columns. */
}
/*
There is no reason to zero out extra bindings if there are */
/*
more than needed. If an app has allocated extra bindings, */
/*
let it worry about it by unbinding those columns. */
/*
SQLBindCol(1..) ... SQLBindCol(10...)
# got 10 bindings */
/*
SQLExecDirect(...) # returns 5 cols */
/*
SQLExecDirect(...)
# returns 10 cols (now OK) */
/*
SQLBindCol(1..) ... SQLBindCol(10...)
# got 10 bindings */
/*
SQLExecDirect(...) # returns 5 cols */
/*
SQLExecDirect(...)
# returns 10 cols (now OK) */
mylog
(
"exit extend_bindings
\n
"
);
}
src/interfaces/odbc/bind.h
浏览文件 @
755a8733
/* File:
bind.h
/* File:
bind.h
*
* Description:
See "bind.c"
* Description:
See "bind.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -15,33 +15,40 @@
/*
* BindInfoClass -- stores information about a bound column
*/
struct
BindInfoClass_
{
Int4
buflen
;
/* size of buffer */
Int4
data_left
;
/* amount of data left to read (SQLGetData) */
char
*
buffer
;
/* pointer to the buffer */
Int4
*
used
;
/* used space in the buffer (for strings not counting the '\0') */
Int2
returntype
;
/* kind of conversion to be applied when returning (SQL_C_DEFAULT, SQL_C_CHAR...) */
struct
BindInfoClass_
{
Int4
buflen
;
/* size of buffer */
Int4
data_left
;
/* amount of data left to read
* (SQLGetData) */
char
*
buffer
;
/* pointer to the buffer */
Int4
*
used
;
/* used space in the buffer (for strings
* not counting the '\0') */
Int2
returntype
;
/* kind of conversion to be applied when
* returning (SQL_C_DEFAULT,
* SQL_C_CHAR...) */
};
/*
* ParameterInfoClass -- stores information about a bound parameter
*/
struct
ParameterInfoClass_
{
Int4
buflen
;
char
*
buffer
;
Int4
*
used
;
Int2
paramType
;
Int2
CType
;
Int2
SQLType
;
UInt4
precision
;
Int2
scale
;
Oid
lobj_oid
;
Int4
*
EXEC_used
;
/* amount of data OR the oid of the large object */
char
*
EXEC_buffer
;
/* the data or the FD of the large object */
char
data_at_exec
;
struct
ParameterInfoClass_
{
Int4
buflen
;
char
*
buffer
;
Int4
*
used
;
Int2
paramType
;
Int2
CType
;
Int2
SQLType
;
UInt4
precision
;
Int2
scale
;
Oid
lobj_oid
;
Int4
*
EXEC_used
;
/* amount of data OR the oid of the large
* object */
char
*
EXEC_buffer
;
/* the data or the FD of the large object */
char
data_at_exec
;
};
BindInfoClass
*
create_empty_bindings
(
int
num_columns
);
void
extend_bindings
(
StatementClass
*
stmt
,
int
num_columns
);
void
extend_bindings
(
StatementClass
*
stmt
,
int
num_columns
);
#endif
src/interfaces/odbc/columninfo.c
浏览文件 @
755a8733
/* Module:
columninfo.c
/* Module:
columninfo.c
*
* Description:
This module contains routines related to
*
reading and storing the field information from a query.
* Description:
This module contains routines related to
*
reading and storing the field information from a query.
*
* Classes:
ColumnInfoClass (Functions prefix: "CI_")
* Classes:
ColumnInfoClass (Functions prefix: "CI_")
*
* API functions:
none
* API functions:
none
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -20,11 +20,12 @@
ColumnInfoClass
*
CI_Constructor
()
{
ColumnInfoClass
*
rv
;
ColumnInfoClass
*
rv
;
rv
=
(
ColumnInfoClass
*
)
malloc
(
sizeof
(
ColumnInfoClass
));
if
(
rv
)
{
if
(
rv
)
{
rv
->
num_fields
=
0
;
rv
->
name
=
NULL
;
rv
->
adtid
=
NULL
;
...
...
@@ -37,28 +38,28 @@ ColumnInfoClass *rv;
}
void
CI_Destructor
(
ColumnInfoClass
*
self
)
CI_Destructor
(
ColumnInfoClass
*
self
)
{
CI_free_memory
(
self
);
free
(
self
);
}
/*
Read in field descriptions.
If self is not null, then also store the information.
/*
Read in field descriptions.
If self is not null, then also store the information.
If self is null, then just read, don't store.
*/
char
CI_read_fields
(
ColumnInfoClass
*
self
,
ConnectionClass
*
conn
)
CI_read_fields
(
ColumnInfoClass
*
self
,
ConnectionClass
*
conn
)
{
Int2
lf
;
int
new_num_fields
;
Oid
new_adtid
;
Int2
new_adtsize
;
Int4
new_atttypmod
=
-
1
;
char
new_field_name
[
MAX_MESSAGE_LEN
+
1
];
SocketClass
*
sock
;
ConnInfo
*
ci
;
Int2
lf
;
int
new_num_fields
;
Oid
new_adtid
;
Int2
new_adtsize
;
Int4
new_atttypmod
=
-
1
;
char
new_field_name
[
MAX_MESSAGE_LEN
+
1
];
SocketClass
*
sock
;
ConnInfo
*
ci
;
sock
=
CC_get_socket
(
conn
);
ci
=
&
conn
->
connInfo
;
...
...
@@ -68,24 +69,27 @@ ConnInfo *ci;
mylog
(
"num_fields = %d
\n
"
,
new_num_fields
);
if
(
self
)
{
/* according to that allocate memory */
if
(
self
)
{
/* according to that allocate memory */
CI_set_num_fields
(
self
,
new_num_fields
);
}
/* now read in the descriptions */
for
(
lf
=
0
;
lf
<
new_num_fields
;
lf
++
)
{
for
(
lf
=
0
;
lf
<
new_num_fields
;
lf
++
)
{
SOCK_get_string
(
sock
,
new_field_name
,
MAX_MESSAGE_LEN
);
new_adtid
=
(
Oid
)
SOCK_get_int
(
sock
,
4
);
new_adtsize
=
(
Int2
)
SOCK_get_int
(
sock
,
2
);
/* If 6.4 protocol, then read the atttypmod field */
if
(
PG_VERSION_GE
(
conn
,
6
.
4
))
{
/* If 6.4 protocol, then read the atttypmod field */
if
(
PG_VERSION_GE
(
conn
,
6
.
4
))
{
mylog
(
"READING ATTTYPMOD
\n
"
);
new_atttypmod
=
(
Int4
)
SOCK_get_int
(
sock
,
4
);
/*
Subtract the header length */
/*
Subtract the header length */
new_atttypmod
-=
4
;
if
(
new_atttypmod
<
0
)
new_atttypmod
=
-
1
;
...
...
@@ -104,17 +108,18 @@ ConnInfo *ci;
void
CI_free_memory
(
ColumnInfoClass
*
self
)
CI_free_memory
(
ColumnInfoClass
*
self
)
{
register
Int2
lf
;
int
num_fields
=
self
->
num_fields
;
register
Int2
lf
;
int
num_fields
=
self
->
num_fields
;
for
(
lf
=
0
;
lf
<
num_fields
;
lf
++
)
{
if
(
self
->
name
[
lf
])
free
(
self
->
name
[
lf
]);
for
(
lf
=
0
;
lf
<
num_fields
;
lf
++
)
{
if
(
self
->
name
[
lf
])
free
(
self
->
name
[
lf
]);
}
/*
Safe to call even if null */
/*
Safe to call even if null */
free
(
self
->
name
);
free
(
self
->
adtid
);
free
(
self
->
adtsize
);
...
...
@@ -124,35 +129,33 @@ int num_fields = self->num_fields;
}
void
CI_set_num_fields
(
ColumnInfoClass
*
self
,
int
new_num_fields
)
CI_set_num_fields
(
ColumnInfoClass
*
self
,
int
new_num_fields
)
{
CI_free_memory
(
self
);
/* always safe to call */
CI_free_memory
(
self
);
/* always safe to call */
self
->
num_fields
=
new_num_fields
;
self
->
name
=
(
char
**
)
malloc
(
sizeof
(
char
*
)
*
self
->
num_fields
);
self
->
adtid
=
(
Oid
*
)
malloc
(
sizeof
(
Oid
)
*
self
->
num_fields
);
self
->
adtsize
=
(
Int2
*
)
malloc
(
sizeof
(
Int2
)
*
self
->
num_fields
);
self
->
name
=
(
char
**
)
malloc
(
sizeof
(
char
*
)
*
self
->
num_fields
);
self
->
adtid
=
(
Oid
*
)
malloc
(
sizeof
(
Oid
)
*
self
->
num_fields
);
self
->
adtsize
=
(
Int2
*
)
malloc
(
sizeof
(
Int2
)
*
self
->
num_fields
);
self
->
display_size
=
(
Int2
*
)
malloc
(
sizeof
(
Int2
)
*
self
->
num_fields
);
self
->
atttypmod
=
(
Int4
*
)
malloc
(
sizeof
(
Int4
)
*
self
->
num_fields
);
}
void
CI_set_field_info
(
ColumnInfoClass
*
self
,
int
field_num
,
char
*
new_name
,
Oid
new_adtid
,
Int2
new_adtsize
,
Int4
new_atttypmod
)
CI_set_field_info
(
ColumnInfoClass
*
self
,
int
field_num
,
char
*
new_name
,
Oid
new_adtid
,
Int2
new_adtsize
,
Int4
new_atttypmod
)
{
/* check bounds */
if
((
field_num
<
0
)
||
(
field_num
>=
self
->
num_fields
))
{
if
((
field_num
<
0
)
||
(
field_num
>=
self
->
num_fields
))
return
;
}
/* store the info */
self
->
name
[
field_num
]
=
strdup
(
new_name
);
self
->
name
[
field_num
]
=
strdup
(
new_name
);
self
->
adtid
[
field_num
]
=
new_adtid
;
self
->
adtsize
[
field_num
]
=
new_adtsize
;
self
->
atttypmod
[
field_num
]
=
new_atttypmod
;
self
->
display_size
[
field_num
]
=
0
;
}
src/interfaces/odbc/columninfo.h
浏览文件 @
755a8733
/* File:
columninfo.h
/* File:
columninfo.h
*
* Description:
See "columninfo.c"
* Description:
See "columninfo.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -12,13 +12,14 @@
#include "psqlodbc.h"
struct
ColumnInfoClass_
{
Int2
num_fields
;
char
**
name
;
/* list of type names */
Oid
*
adtid
;
/* list of type ids */
Int2
*
adtsize
;
/* list type sizes */
Int2
*
display_size
;
/* the display size (longest row) */
Int4
*
atttypmod
;
/* the length of bpchar/varchar */
struct
ColumnInfoClass_
{
Int2
num_fields
;
char
**
name
;
/* list of type names */
Oid
*
adtid
;
/* list of type ids */
Int2
*
adtsize
;
/* list type sizes */
Int2
*
display_size
;
/* the display size (longest row) */
Int4
*
atttypmod
;
/* the length of bpchar/varchar */
};
#define CI_get_num_fields(self) (self->num_fields)
...
...
@@ -29,15 +30,15 @@ struct ColumnInfoClass_ {
#define CI_get_atttypmod(self, col) (self->atttypmod[col])
ColumnInfoClass
*
CI_Constructor
(
void
);
void
CI_Destructor
(
ColumnInfoClass
*
self
);
void
CI_free_memory
(
ColumnInfoClass
*
self
);
char
CI_read_fields
(
ColumnInfoClass
*
self
,
ConnectionClass
*
conn
);
void
CI_Destructor
(
ColumnInfoClass
*
self
);
void
CI_free_memory
(
ColumnInfoClass
*
self
);
char
CI_read_fields
(
ColumnInfoClass
*
self
,
ConnectionClass
*
conn
);
/* functions for setting up the fields from within the program, */
/* without reading from a socket */
void
CI_set_num_fields
(
ColumnInfoClass
*
self
,
int
new_num_fields
);
void
CI_set_field_info
(
ColumnInfoClass
*
self
,
int
field_num
,
char
*
new_name
,
Oid
new_adtid
,
Int2
new_adtsize
,
Int4
atttypmod
);
void
CI_set_num_fields
(
ColumnInfoClass
*
self
,
int
new_num_fields
);
void
CI_set_field_info
(
ColumnInfoClass
*
self
,
int
field_num
,
char
*
new_name
,
Oid
new_adtid
,
Int2
new_adtsize
,
Int4
atttypmod
);
#endif
src/interfaces/odbc/connection.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/connection.h
浏览文件 @
755a8733
/* File:
connection.h
/* File:
connection.h
*
* Description:
See "connection.c"
* Description:
See "connection.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -27,12 +27,15 @@
#endif
typedef
enum
{
CONN_NOT_CONNECTED
,
/* Connection has not been established */
CONN_CONNECTED
,
/* Connection is up and has been established */
CONN_DOWN
,
/* Connection is broken */
CONN_EXECUTING
/* the connection is currently executing a statement */
}
CONN_Status
;
typedef
enum
{
CONN_NOT_CONNECTED
,
/* Connection has not been established */
CONN_CONNECTED
,
/* Connection is up and has been
* established */
CONN_DOWN
,
/* Connection is broken */
CONN_EXECUTING
/* the connection is currently executing a
* statement */
}
CONN_Status
;
/* These errors have general sql error state */
#define CONNECTION_SERVER_NOT_REACHED 101
...
...
@@ -50,7 +53,7 @@ typedef enum {
#define CONN_INIREAD_ERROR 201
#define CONN_OPENDB_ERROR 202
#define CONN_STMT_ALLOC_ERROR 203
#define CONN_IN_USE 204
#define CONN_IN_USE 204
#define CONN_UNSUPPORTED_OPTION 205
/* Used by SetConnectoption to indicate unsupported options */
#define CONN_INVALID_ARGUMENT_NO 206
...
...
@@ -110,38 +113,39 @@ typedef unsigned int ProtocolVersion;
/* This startup packet is to support latest Postgres protocol */
typedef
struct
_StartupPacket
{
ProtocolVersion
protoVersion
;
char
database
[
SM_DATABASE
];
char
user
[
SM_USER
];
char
options
[
SM_OPTIONS
];
char
unused
[
SM_UNUSED
];
char
tty
[
SM_TTY
];
ProtocolVersion
protoVersion
;
char
database
[
SM_DATABASE
];
char
user
[
SM_USER
];
char
options
[
SM_OPTIONS
];
char
unused
[
SM_UNUSED
];
char
tty
[
SM_TTY
];
}
StartupPacket
;
/* Structure to hold all the connection attributes for a specific
connection (used for both registry and file, DSN and DRIVER)
*/
typedef
struct
{
char
dsn
[
MEDIUM_REGISTRY_LEN
];
char
desc
[
MEDIUM_REGISTRY_LEN
];
char
driver
[
MEDIUM_REGISTRY_LEN
];
char
server
[
MEDIUM_REGISTRY_LEN
];
char
database
[
MEDIUM_REGISTRY_LEN
];
char
username
[
MEDIUM_REGISTRY_LEN
];
char
password
[
MEDIUM_REGISTRY_LEN
];
char
conn_settings
[
LARGE_REGISTRY_LEN
];
char
protocol
[
SMALL_REGISTRY_LEN
];
char
port
[
SMALL_REGISTRY_LEN
];
char
onlyread
[
SMALL_REGISTRY_LEN
];
char
fake_oid_index
[
SMALL_REGISTRY_LEN
];
char
show_oid_column
[
SMALL_REGISTRY_LEN
];
char
row_versioning
[
SMALL_REGISTRY_LEN
];
char
show_system_tables
[
SMALL_REGISTRY_LEN
];
char
translation_dll
[
MEDIUM_REGISTRY_LEN
];
char
translation_option
[
SMALL_REGISTRY_LEN
];
char
focus_password
;
}
ConnInfo
;
typedef
struct
{
char
dsn
[
MEDIUM_REGISTRY_LEN
];
char
desc
[
MEDIUM_REGISTRY_LEN
];
char
driver
[
MEDIUM_REGISTRY_LEN
];
char
server
[
MEDIUM_REGISTRY_LEN
];
char
database
[
MEDIUM_REGISTRY_LEN
];
char
username
[
MEDIUM_REGISTRY_LEN
];
char
password
[
MEDIUM_REGISTRY_LEN
];
char
conn_settings
[
LARGE_REGISTRY_LEN
];
char
protocol
[
SMALL_REGISTRY_LEN
];
char
port
[
SMALL_REGISTRY_LEN
];
char
onlyread
[
SMALL_REGISTRY_LEN
];
char
fake_oid_index
[
SMALL_REGISTRY_LEN
];
char
show_oid_column
[
SMALL_REGISTRY_LEN
];
char
row_versioning
[
SMALL_REGISTRY_LEN
];
char
show_system_tables
[
SMALL_REGISTRY_LEN
];
char
translation_dll
[
MEDIUM_REGISTRY_LEN
];
char
translation_option
[
SMALL_REGISTRY_LEN
];
char
focus_password
;
}
ConnInfo
;
/*
* Macros to compare the server's version with a specified version
...
...
@@ -160,15 +164,15 @@ typedef struct {
#define SERVER_VERSION_LE(conn, major, minor) (! SERVER_VERSION_GT(conn, major, minor))
#define SERVER_VERSION_LT(conn, major, minor) (! SERVER_VERSION_GE(conn, major, minor))
/*#if ! defined(HAVE_CONFIG_H) || defined(HAVE_STRINGIZE)*/
#define
STRING_AFTER_DOT(string) (strchr(#string, '.') + 1)
#define
STRING_AFTER_DOT(string) (strchr(#string, '.') + 1)
/*#else
#define
STRING_AFTER_DOT(str) (strchr("str", '.') + 1)
#define
STRING_AFTER_DOT(str) (strchr("str", '.') + 1)
#endif*/
/*
* Simplified macros to compare the server's version with a
* specified version
* Note: Never pass a variable as the second parameter.
*
It must be a decimal constant of the form %d.%d .
*
It must be a decimal constant of the form %d.%d .
*/
#define PG_VERSION_GT(conn, ver) \
(SERVER_VERSION_GT(conn, (int) ver, atoi(STRING_AFTER_DOT(ver))))
...
...
@@ -180,9 +184,10 @@ typedef struct {
#define PG_VERSION_LT(conn, ver) (! PG_VERSION_GE(conn, ver))
/* This is used to store cached table information in the connection */
struct
col_info
{
QResultClass
*
result
;
char
name
[
MAX_TABLE_LEN
+
1
];
struct
col_info
{
QResultClass
*
result
;
char
name
[
MAX_TABLE_LEN
+
1
];
};
/* Translation DLL entry points */
...
...
@@ -194,52 +199,58 @@ struct col_info {
#define HINSTANCE void *
#endif
typedef
BOOL
(
FAR
WINAPI
*
DataSourceToDriverProc
)
(
UDWORD
,
SWORD
,
PTR
,
SDWORD
,
PTR
,
SDWORD
,
SDWORD
FAR
*
,
UCHAR
FAR
*
,
SWORD
,
SWORD
FAR
*
);
typedef
BOOL
(
FAR
WINAPI
*
DriverToDataSourceProc
)
(
UDWORD
,
SWORD
,
PTR
,
SDWORD
,
PTR
,
SDWORD
,
SDWORD
FAR
*
,
UCHAR
FAR
*
,
SWORD
,
SWORD
FAR
*
);
typedef
BOOL
(
FAR
WINAPI
*
DataSourceToDriverProc
)
(
UDWORD
,
SWORD
,
PTR
,
SDWORD
,
PTR
,
SDWORD
,
SDWORD
FAR
*
,
UCHAR
FAR
*
,
SWORD
,
SWORD
FAR
*
);
typedef
BOOL
(
FAR
WINAPI
*
DriverToDataSourceProc
)
(
UDWORD
,
SWORD
,
PTR
,
SDWORD
,
PTR
,
SDWORD
,
SDWORD
FAR
*
,
UCHAR
FAR
*
,
SWORD
,
SWORD
FAR
*
);
/******* The Connection handle ************/
struct
ConnectionClass_
{
HENV
henv
;
/* environment this connection was created on */
struct
ConnectionClass_
{
HENV
henv
;
/* environment this connection was created
* on */
StatementOptions
stmtOptions
;
char
*
errormsg
;
int
errornumber
;
CONN_Status
status
;
ConnInfo
connInfo
;
StatementClass
**
stmts
;
int
num_stmts
;
SocketClass
*
sock
;
int
lobj_type
;
int
ntables
;
COL_INFO
**
col_info
;
long
translation_option
;
HINSTANCE
translation_handle
;
DataSourceToDriverProc
DataSourceToDriver
;
DriverToDataSourceProc
DriverToDataSource
;
char
transact_status
;
/* Is a transaction is currently in progress */
char
errormsg_created
;
/* has an informative error msg been created? */
char
pg_version
[
MAX_INFO_STRING
];
/* Version of PostgreSQL we're connected to - DJP 25-1-2001 */
float
pg_version_number
;
Int2
pg_version_major
;
Int2
pg_version_minor
;
char
*
errormsg
;
int
errornumber
;
CONN_Status
status
;
ConnInfo
connInfo
;
StatementClass
**
stmts
;
int
num_stmts
;
SocketClass
*
sock
;
int
lobj_type
;
int
ntables
;
COL_INFO
**
col_info
;
long
translation_option
;
HINSTANCE
translation_handle
;
DataSourceToDriverProc
DataSourceToDriver
;
DriverToDataSourceProc
DriverToDataSource
;
char
transact_status
;
/* Is a transaction is currently in
* progress */
char
errormsg_created
;
/* has an informative error msg
* been created? */
char
pg_version
[
MAX_INFO_STRING
];
/* Version of PostgreSQL
* we're connected to -
* DJP 25-1-2001 */
float
pg_version_number
;
Int2
pg_version_major
;
Int2
pg_version_minor
;
};
...
...
@@ -252,31 +263,31 @@ struct ConnectionClass_ {
#define CC_is_onlyread(x) (x->connInfo.onlyread[0] == '1')
/*
for CC_DSN_info */
/*
for CC_DSN_info */
#define CONN_DONT_OVERWRITE 0
#define CONN_OVERWRITE 1
#define CONN_OVERWRITE 1
/* prototypes */
ConnectionClass
*
CC_Constructor
(
void
);
char
CC_Destructor
(
ConnectionClass
*
self
);
int
CC_cursor_count
(
ConnectionClass
*
self
);
char
CC_cleanup
(
ConnectionClass
*
self
);
char
CC_abort
(
ConnectionClass
*
self
);
int
CC_set_translation
(
ConnectionClass
*
self
);
char
CC_connect
(
ConnectionClass
*
self
,
char
do_password
);
char
CC_add_statement
(
ConnectionClass
*
self
,
StatementClass
*
stmt
);
char
CC_remove_statement
(
ConnectionClass
*
self
,
StatementClass
*
stmt
);
char
CC_get_error
(
ConnectionClass
*
self
,
int
*
number
,
char
**
message
);
QResultClass
*
CC_send_query
(
ConnectionClass
*
self
,
char
*
query
,
QueryInfo
*
qi
);
void
CC_clear_error
(
ConnectionClass
*
self
);
char
*
CC_create_errormsg
(
ConnectionClass
*
self
);
int
CC_send_function
(
ConnectionClass
*
conn
,
int
fnid
,
void
*
result_buf
,
int
*
actual_result_len
,
int
result_is_int
,
LO_ARG
*
argv
,
int
nargs
);
char
CC_send_settings
(
ConnectionClass
*
self
);
void
CC_lookup_lo
(
ConnectionClass
*
conn
);
void
CC_lookup_pg_version
(
ConnectionClass
*
conn
);
void
CC_initialize_pg_version
(
ConnectionClass
*
conn
);
void
CC_log_error
(
char
*
func
,
char
*
desc
,
ConnectionClass
*
self
);
char
CC_Destructor
(
ConnectionClass
*
self
);
int
CC_cursor_count
(
ConnectionClass
*
self
);
char
CC_cleanup
(
ConnectionClass
*
self
);
char
CC_abort
(
ConnectionClass
*
self
);
int
CC_set_translation
(
ConnectionClass
*
self
);
char
CC_connect
(
ConnectionClass
*
self
,
char
do_password
);
char
CC_add_statement
(
ConnectionClass
*
self
,
StatementClass
*
stmt
);
char
CC_remove_statement
(
ConnectionClass
*
self
,
StatementClass
*
stmt
);
char
CC_get_error
(
ConnectionClass
*
self
,
int
*
number
,
char
**
message
);
QResultClass
*
CC_send_query
(
ConnectionClass
*
self
,
char
*
query
,
QueryInfo
*
qi
);
void
CC_clear_error
(
ConnectionClass
*
self
);
char
*
CC_create_errormsg
(
ConnectionClass
*
self
);
int
CC_send_function
(
ConnectionClass
*
conn
,
int
fnid
,
void
*
result_buf
,
int
*
actual_result_len
,
int
result_is_int
,
LO_ARG
*
argv
,
int
nargs
);
char
CC_send_settings
(
ConnectionClass
*
self
);
void
CC_lookup_lo
(
ConnectionClass
*
conn
);
void
CC_lookup_pg_version
(
ConnectionClass
*
conn
);
void
CC_initialize_pg_version
(
ConnectionClass
*
conn
);
void
CC_log_error
(
char
*
func
,
char
*
desc
,
ConnectionClass
*
self
);
#endif
src/interfaces/odbc/convert.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/convert.h
浏览文件 @
755a8733
/* File:
convert.h
/* File:
convert.h
*
* Description:
See "convert.c"
* Description:
See "convert.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -13,39 +13,40 @@
#include "psqlodbc.h"
/* copy_and_convert results */
#define COPY_OK
0
#define COPY_UNSUPPORTED_TYPE
1
#define COPY_OK
0
#define COPY_UNSUPPORTED_TYPE
1
#define COPY_UNSUPPORTED_CONVERSION 2
#define COPY_RESULT_TRUNCATED 3
#define COPY_GENERAL_ERROR 4
#define COPY_NO_DATA_FOUND 5
typedef
struct
{
int
m
;
int
d
;
int
y
;
int
hh
;
int
mm
;
int
ss
;
}
SIMPLE_TIME
;
int
copy_and_convert_field_bindinfo
(
StatementClass
*
stmt
,
Int4
field_type
,
void
*
value
,
int
col
);
int
copy_and_convert_field
(
StatementClass
*
stmt
,
Int4
field_type
,
void
*
value
,
Int2
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
*
pcbValue
);
int
copy_statement_with_parameters
(
StatementClass
*
stmt
);
char
*
convert_escape
(
char
*
value
);
char
*
convert_money
(
char
*
s
);
char
parse_datetime
(
char
*
buf
,
SIMPLE_TIME
*
st
);
int
convert_linefeeds
(
char
*
s
,
char
*
dst
,
size_t
max
);
char
*
convert_special_chars
(
char
*
si
,
char
*
dst
,
int
used
);
int
convert_pgbinary_to_char
(
char
*
value
,
char
*
rgbValue
,
int
cbValueMax
);
int
convert_from_pgbinary
(
unsigned
char
*
value
,
unsigned
char
*
rgbValue
,
int
cbValueMax
);
int
convert_to_pgbinary
(
unsigned
char
*
in
,
char
*
out
,
int
len
);
void
encode
(
char
*
in
,
char
*
out
);
void
decode
(
char
*
in
,
char
*
out
);
int
convert_lo
(
StatementClass
*
stmt
,
void
*
value
,
Int2
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
*
pcbValue
);
#define COPY_RESULT_TRUNCATED 3
#define COPY_GENERAL_ERROR 4
#define COPY_NO_DATA_FOUND 5
typedef
struct
{
int
m
;
int
d
;
int
y
;
int
hh
;
int
mm
;
int
ss
;
}
SIMPLE_TIME
;
int
copy_and_convert_field_bindinfo
(
StatementClass
*
stmt
,
Int4
field_type
,
void
*
value
,
int
col
);
int
copy_and_convert_field
(
StatementClass
*
stmt
,
Int4
field_type
,
void
*
value
,
Int2
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
*
pcbValue
);
int
copy_statement_with_parameters
(
StatementClass
*
stmt
);
char
*
convert_escape
(
char
*
value
);
char
*
convert_money
(
char
*
s
);
char
parse_datetime
(
char
*
buf
,
SIMPLE_TIME
*
st
);
int
convert_linefeeds
(
char
*
s
,
char
*
dst
,
size_t
max
);
char
*
convert_special_chars
(
char
*
si
,
char
*
dst
,
int
used
);
int
convert_pgbinary_to_char
(
char
*
value
,
char
*
rgbValue
,
int
cbValueMax
);
int
convert_from_pgbinary
(
unsigned
char
*
value
,
unsigned
char
*
rgbValue
,
int
cbValueMax
);
int
convert_to_pgbinary
(
unsigned
char
*
in
,
char
*
out
,
int
len
);
void
encode
(
char
*
in
,
char
*
out
);
void
decode
(
char
*
in
,
char
*
out
);
int
convert_lo
(
StatementClass
*
stmt
,
void
*
value
,
Int2
fCType
,
PTR
rgbValue
,
SDWORD
cbValueMax
,
SDWORD
*
pcbValue
);
#endif
src/interfaces/odbc/dlg_specific.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/dlg_specific.h
浏览文件 @
755a8733
/* File:
dlg_specific.h
/* File:
dlg_specific.h
*
* Description:
See "dlg_specific.c"
* Description:
See "dlg_specific.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -31,41 +31,49 @@
/* INI File Stuff */
#ifndef WIN32
# define ODBC_INI ".odbc.ini"
# ifdef ODBCINSTDIR
# define ODBCINST_INI ODBCINSTDIR "/odbcinst.ini"
# else
# define ODBCINST_INI "/etc/odbcinst.ini"
# warning "location of odbcinst.ini file defaulted to /etc"
# endif
#else
/* WIN32 */
# define ODBC_INI "ODBC.INI"
/* ODBC initialization file */
# define ODBCINST_INI "ODBCINST.INI"
/* ODBC Installation file */
#endif
/* WIN32 */
#define INI_DSN DBMS_NAME
/* Name of default Datasource in ini file (not used?) */
#define INI_KDESC "Description"
/* Data source description */
#define INI_SERVER "Servername"
/* Name of Server running the Postgres service */
#define INI_PORT "Port"
/* Port on which the Postmaster is listening */
#define INI_DATABASE "Database"
/* Database Name */
#define INI_USER "Username"
/* Default User Name */
#define INI_PASSWORD "Password"
/* Default Password */
#define INI_DEBUG "Debug"
/* Debug flag */
#define INI_FETCH "Fetch"
/* Fetch Max Count */
#define INI_SOCKET "Socket"
/* Socket buffer size */
#define INI_READONLY "ReadOnly"
/* Database is read only */
#define INI_COMMLOG "CommLog"
/* Communication to backend logging */
#define INI_PROTOCOL "Protocol"
/* What protocol (6.2) */
#define INI_OPTIMIZER "Optimizer"
/* Use backend genetic optimizer */
#define INI_KSQO "Ksqo"
/* Keyset query optimization */
#define INI_CONNSETTINGS "ConnSettings"
/* Anything to send to backend on successful connection */
#define INI_UNIQUEINDEX "UniqueIndex"
/* Recognize unique indexes */
#define INI_UNKNOWNSIZES "UnknownSizes"
/* How to handle unknown result set sizes */
#define ODBC_INI ".odbc.ini"
#ifdef ODBCINSTDIR
#define ODBCINST_INI ODBCINSTDIR "/odbcinst.ini"
#else
#define ODBCINST_INI "/etc/odbcinst.ini"
#warning "location of odbcinst.ini file defaulted to /etc"
#endif
#else
/* WIN32 */
#define ODBC_INI "ODBC.INI"
/* ODBC initialization file */
#define ODBCINST_INI "ODBCINST.INI"
/* ODBC Installation file */
#endif
/* WIN32 */
#define INI_DSN DBMS_NAME
/* Name of default Datasource in
* ini file (not used?) */
#define INI_KDESC "Description"
/* Data source description */
#define INI_SERVER "Servername"
/* Name of Server running the
* Postgres service */
#define INI_PORT "Port"
/* Port on which the Postmaster is
* listening */
#define INI_DATABASE "Database"
/* Database Name */
#define INI_USER "Username"
/* Default User Name */
#define INI_PASSWORD "Password"
/* Default Password */
#define INI_DEBUG "Debug"
/* Debug flag */
#define INI_FETCH "Fetch"
/* Fetch Max Count */
#define INI_SOCKET "Socket"
/* Socket buffer size */
#define INI_READONLY "ReadOnly"
/* Database is read only */
#define INI_COMMLOG "CommLog"
/* Communication to backend
* logging */
#define INI_PROTOCOL "Protocol"
/* What protocol (6.2) */
#define INI_OPTIMIZER "Optimizer"
/* Use backend genetic optimizer */
#define INI_KSQO "Ksqo"
/* Keyset query optimization */
#define INI_CONNSETTINGS "ConnSettings"
/* Anything to send to
* backend on successful
* connection */
#define INI_UNIQUEINDEX "UniqueIndex"
/* Recognize unique indexes */
#define INI_UNKNOWNSIZES "UnknownSizes"
/* How to handle unknown
* result set sizes */
#define INI_CANCELASFREESTMT "CancelAsFreeStmt"
#define INI_USEDECLAREFETCH "UseDeclareFetch"
/* Use Declare/Fetch cursors */
#define INI_USEDECLAREFETCH "UseDeclareFetch"
/* Use Declare/Fetch
* cursors */
/* More ini stuff */
#define INI_TEXTASLONGVARCHAR "TextAsLongVarchar"
...
...
@@ -82,15 +90,16 @@
#define INI_PARSE "Parse"
#define INI_EXTRASYSTABLEPREFIXES "ExtraSysTablePrefixes"
#define INI_TRANSLATIONNAME
"TranslationName"
#define INI_TRANSLATIONDLL
"TranslationDLL"
#define INI_TRANSLATIONOPTION
"TranslationOption"
#define INI_TRANSLATIONNAME
"TranslationName"
#define INI_TRANSLATIONDLL
"TranslationDLL"
#define INI_TRANSLATIONOPTION
"TranslationOption"
/* Connection Defaults */
#define DEFAULT_PORT "5432"
#define DEFAULT_READONLY 1
#define DEFAULT_PROTOCOL "6.4"
/* the latest protocol is the default */
#define DEFAULT_PROTOCOL "6.4"
/* the latest protocol is
* the default */
#define DEFAULT_USEDECLAREFETCH 0
#define DEFAULT_TEXTASLONGVARCHAR 1
#define DEFAULT_UNKNOWNSASLONGVARCHAR 0
...
...
@@ -114,29 +123,30 @@
#define DEFAULT_EXTRASYSTABLEPREFIXES "dd_;"
/*
prototypes */
void
getGlobalDefaults
(
char
*
section
,
char
*
filename
,
char
override
);
/*
prototypes */
void
getGlobalDefaults
(
char
*
section
,
char
*
filename
,
char
override
);
#ifdef WIN32
void
SetDlgStuff
(
HWND
hdlg
,
ConnInfo
*
ci
);
void
GetDlgStuff
(
HWND
hdlg
,
ConnInfo
*
ci
);
int
CALLBACK
driver_optionsProc
(
HWND
hdlg
,
WORD
wMsg
,
WPARAM
wParam
,
LPARAM
lParam
);
int
CALLBACK
ds_optionsProc
(
HWND
hdlg
,
WORD
wMsg
,
WPARAM
wParam
,
LPARAM
lParam
);
#endif
/* WIN32 */
void
updateGlobals
(
void
);
void
writeDSNinfo
(
ConnInfo
*
ci
);
void
getDSNdefaults
(
ConnInfo
*
ci
);
void
getDSNinfo
(
ConnInfo
*
ci
,
char
overwrite
);
void
makeConnectString
(
char
*
connect_string
,
ConnInfo
*
ci
);
void
copyAttributes
(
ConnInfo
*
ci
,
char
*
attribute
,
char
*
value
);
void
SetDlgStuff
(
HWND
hdlg
,
ConnInfo
*
ci
);
void
GetDlgStuff
(
HWND
hdlg
,
ConnInfo
*
ci
);
int
CALLBACK
driver_optionsProc
(
HWND
hdlg
,
WORD
wMsg
,
WPARAM
wParam
,
LPARAM
lParam
);
int
CALLBACK
ds_optionsProc
(
HWND
hdlg
,
WORD
wMsg
,
WPARAM
wParam
,
LPARAM
lParam
);
#endif
/* WIN32 */
void
updateGlobals
(
void
);
void
writeDSNinfo
(
ConnInfo
*
ci
);
void
getDSNdefaults
(
ConnInfo
*
ci
);
void
getDSNinfo
(
ConnInfo
*
ci
,
char
overwrite
);
void
makeConnectString
(
char
*
connect_string
,
ConnInfo
*
ci
);
void
copyAttributes
(
ConnInfo
*
ci
,
char
*
attribute
,
char
*
value
);
#endif
src/interfaces/odbc/drvconn.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/environ.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/environ.h
浏览文件 @
755a8733
/* File:
environ.h
/* File:
environ.h
*
* Description:
See "environ.c"
* Description:
See "environ.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -29,17 +29,18 @@
#define ENV_ALLOC_ERROR 1
/********** Environment Handle *************/
struct
EnvironmentClass_
{
char
*
errormsg
;
int
errornumber
;
struct
EnvironmentClass_
{
char
*
errormsg
;
int
errornumber
;
};
/* Environment prototypes */
EnvironmentClass
*
EN_Constructor
(
void
);
char
EN_Destructor
(
EnvironmentClass
*
self
);
char
EN_get_error
(
EnvironmentClass
*
self
,
int
*
number
,
char
**
message
);
char
EN_add_connection
(
EnvironmentClass
*
self
,
ConnectionClass
*
conn
);
char
EN_remove_connection
(
EnvironmentClass
*
self
,
ConnectionClass
*
conn
);
void
EN_log_error
(
char
*
func
,
char
*
desc
,
EnvironmentClass
*
self
);
char
EN_Destructor
(
EnvironmentClass
*
self
);
char
EN_get_error
(
EnvironmentClass
*
self
,
int
*
number
,
char
**
message
);
char
EN_add_connection
(
EnvironmentClass
*
self
,
ConnectionClass
*
conn
);
char
EN_remove_connection
(
EnvironmentClass
*
self
,
ConnectionClass
*
conn
);
void
EN_log_error
(
char
*
func
,
char
*
desc
,
EnvironmentClass
*
self
);
#endif
src/interfaces/odbc/execute.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/gpps.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/gpps.h
浏览文件 @
755a8733
...
...
@@ -13,25 +13,32 @@
#endif
#ifdef __cplusplus
extern
"C"
{
extern
"C"
{
#endif
DWORD
GetPrivateProfileString
(
char
*
theSection
,
/* section name */
char
*
theKey
,
/* search key name */
char
*
theDefault
,
/* default value if not found */
char
*
theReturnBuffer
,
/* return valuse stored here */
size_t
theBufferLength
,
/* byte length of return buffer */
char
*
theIniFileName
);
/* pathname of ini file to search */
DWORD
GetPrivateProfileString
(
char
*
theSection
,
/* section name */
char
*
theKey
,
/* search key name */
char
*
theDefault
,
/* default value if not
* found */
char
*
theReturnBuffer
,
/* return valuse stored
* here */
size_t
theBufferLength
,
/* byte length of return
* buffer */
char
*
theIniFileName
);
/* pathname of ini file
* to search */
DWORD
WritePrivateProfileString
(
char
*
theSection
,
/* section name */
char
*
theKey
,
/* write key name */
char
*
theBuffer
,
/* input buffer */
char
*
theIniFileName
);
/* pathname of ini file to write */
DWORD
WritePrivateProfileString
(
char
*
theSection
,
/* section name */
char
*
theKey
,
/* write key name */
char
*
theBuffer
,
/* input buffer */
char
*
theIniFileName
);
/* pathname of ini file
* to write */
#ifdef __cplusplus
}
#endif
#ifndef WIN32
...
...
src/interfaces/odbc/info.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/iodbc.h
浏览文件 @
755a8733
#ifndef
_IODBC_H
#define
_IODBC_H
#
if !defined(WIN32) && !defined(WIN32_SYSTEM)
#
define
_UNIX_
#
include
<stdlib.h>
#
include
<sys/types.h>
#
define MEM_ALLOC(size)
(malloc((size_t)(size)))
#
define MEM_FREE(ptr)
{if(ptr) free(ptr);}
#
define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
#
define STRNCPY(t,s,n)
(strncpy((char*)(t), (char*)(s), (size_t)(n)))
#
define STRCAT(t, s)
(strcat((char*)(t), (char*)(s)))
#
define STRNCAT(t,s,n)
(strncat((char*)(t), (char*)(s), (size_t)(n)))
#
define STREQ(a, b)
(strcmp((char*)(a), (char*)(b)) == 0)
#
define STRLEN(str)
((str)? strlen((char*)(str)):0)
#
define
EXPORT
#
define
CALLBACK
#
define
FAR
typedef
signed
short
SSHOR
;
typedef
short
WORD
;
typedef
long
DWORD
;
typedef
WORD
WPARAM
;
typedef
DWORD
LPARAM
;
typedef
void
*
HWND
;
typedef
int
BOOL
;
#
endif
/* _UNIX_ */
#
if
defined(WIN32) || defined(WIN32_SYSTEM)
#
include
<windows.h>
#
include
<windowsx.h>
#
ifdef
_MSVC_
#
define MEM_ALLOC(size)
(fmalloc((size_t)(size)))
#
define MEM_FREE(ptr)
((ptr)? ffree((PTR)(ptr)):0))
#
define STRCPY(t, s)
(fstrcpy((char FAR*)(t), (char FAR*)(s)))
#
define STRNCPY(t,s,n)
(fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
#
define STRLEN(str)
((str)? fstrlen((char FAR*)(str)):0)
#
define STREQ(a, b)
(fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
#
endif
#
ifdef
_BORLAND_
#
define MEM_ALLOC(size)
(farmalloc((unsigned long)(size))
#
define MEM_FREE(ptr)
((ptr)? farfree((void far*)(ptr)):0)
#
define STRCPY(t, s)
(_fstrcpy((char FAR*)(t), (char FAR*)(s)))
#
define STRNCPY(t,s,n)
(_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
#
define STRLEN(str)
((str)? _fstrlen((char FAR*)(str)):0)
#
define STREQ(a, b)
(_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
#
endif
#
endif
/* WIN32 */
#
define SYSERR
(-1)
#
ifndef
NULL
#
define NULL
((void FAR*)0UL)
#
endif
#ifndef
_IODBC_H
#define
_IODBC_H
#
if !defined(WIN32) && !defined(WIN32_SYSTEM)
#
define
_UNIX_
#
include
<stdlib.h>
#
include
<sys/types.h>
#
define MEM_ALLOC(size)
(malloc((size_t)(size)))
#
define MEM_FREE(ptr)
{if(ptr) free(ptr);}
#
define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
#
define STRNCPY(t,s,n)
(strncpy((char*)(t), (char*)(s), (size_t)(n)))
#
define STRCAT(t, s)
(strcat((char*)(t), (char*)(s)))
#
define STRNCAT(t,s,n)
(strncat((char*)(t), (char*)(s), (size_t)(n)))
#
define STREQ(a, b)
(strcmp((char*)(a), (char*)(b)) == 0)
#
define STRLEN(str)
((str)? strlen((char*)(str)):0)
#
define
EXPORT
#
define
CALLBACK
#
define
FAR
typedef
signed
short
SSHOR
;
typedef
short
WORD
;
typedef
long
DWORD
;
typedef
WORD
WPARAM
;
typedef
DWORD
LPARAM
;
typedef
void
*
HWND
;
typedef
int
BOOL
;
#
endif
/* _UNIX_ */
#
if
defined(WIN32) || defined(WIN32_SYSTEM)
#
include
<windows.h>
#
include
<windowsx.h>
#
ifdef
_MSVC_
#
define MEM_ALLOC(size)
(fmalloc((size_t)(size)))
#
define MEM_FREE(ptr)
((ptr)? ffree((PTR)(ptr)):0))
#
define STRCPY(t, s)
(fstrcpy((char FAR*)(t), (char FAR*)(s)))
#
define STRNCPY(t,s,n)
(fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
#
define STRLEN(str)
((str)? fstrlen((char FAR*)(str)):0)
#
define STREQ(a, b)
(fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
#endif
#
ifdef
_BORLAND_
#
define MEM_ALLOC(size)
(farmalloc((unsigned long)(size))
#
define MEM_FREE(ptr)
((ptr)? farfree((void far*)(ptr)):0)
#
define STRCPY(t, s)
(_fstrcpy((char FAR*)(t), (char FAR*)(s)))
#
define STRNCPY(t,s,n)
(_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
#
define STRLEN(str)
((str)? _fstrlen((char FAR*)(str)):0)
#
define STREQ(a, b)
(_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
#endif
#
endif
/* WIN32 */
#
define SYSERR
(-1)
#
ifndef
NULL
#
define NULL
((void FAR*)0UL)
#endif
#endif
src/interfaces/odbc/isql.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/isqlext.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/lobj.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/lobj.h
浏览文件 @
755a8733
/* File:
lobj.h
/* File:
lobj.h
*
* Description:
See "lobj.c"
* Description:
See "lobj.c"
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -13,14 +13,15 @@
#include "psqlodbc.h"
struct
lo_arg
{
int
isint
;
int
len
;
struct
lo_arg
{
int
isint
;
int
len
;
union
{
int
integer
;
char
*
ptr
;
}
u
;
int
integer
;
char
*
ptr
;
}
u
;
};
#define LO_CREAT 957
...
...
@@ -35,14 +36,13 @@ struct lo_arg {
#define INV_WRITE 0x00020000
#define INV_READ 0x00040000
Oid
lo_creat
(
ConnectionClass
*
conn
,
int
mode
);
int
lo_open
(
ConnectionClass
*
conn
,
int
lobjId
,
int
mode
);
int
lo_close
(
ConnectionClass
*
conn
,
int
fd
);
int
lo_read
(
ConnectionClass
*
conn
,
int
fd
,
char
*
buf
,
int
len
);
int
lo_write
(
ConnectionClass
*
conn
,
int
fd
,
char
*
buf
,
int
len
);
int
lo_lseek
(
ConnectionClass
*
conn
,
int
fd
,
int
offset
,
int
len
);
int
lo_tell
(
ConnectionClass
*
conn
,
int
fd
);
int
lo_unlink
(
ConnectionClass
*
conn
,
Oid
lobjId
);
Oid
lo_creat
(
ConnectionClass
*
conn
,
int
mode
);
int
lo_open
(
ConnectionClass
*
conn
,
int
lobjId
,
int
mode
);
int
lo_close
(
ConnectionClass
*
conn
,
int
fd
);
int
lo_read
(
ConnectionClass
*
conn
,
int
fd
,
char
*
buf
,
int
len
);
int
lo_write
(
ConnectionClass
*
conn
,
int
fd
,
char
*
buf
,
int
len
);
int
lo_lseek
(
ConnectionClass
*
conn
,
int
fd
,
int
offset
,
int
len
);
int
lo_tell
(
ConnectionClass
*
conn
,
int
fd
);
int
lo_unlink
(
ConnectionClass
*
conn
,
Oid
lobjId
);
#endif
src/interfaces/odbc/misc.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/misc.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/options.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/parse.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/pgtypes.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/pgtypes.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/psqlodbc.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/psqlodbc.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/qresult.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/qresult.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/resource.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/results.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/setup.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/socket.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/socket.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/statement.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/statement.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/tuple.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/tuple.h
浏览文件 @
755a8733
/* File:
tuple.h
/* File:
tuple.h
*
* Description:
See "tuple.c"
* Description:
See "tuple.c"
*
* Important NOTE:
The TupleField structure is used both to hold backend data and
*
manual result set data. The "set_" functions and the TupleNode
*
structure are only used for manual result sets by info routines.
* Important NOTE:
The TupleField structure is used both to hold backend data and
*
manual result set data. The "set_" functions and the TupleNode
*
structure are only used for manual result sets by info routines.
*
* Comments:
See "notice.txt" for copyright and license information.
* Comments:
See "notice.txt" for copyright and license information.
*
*/
...
...
@@ -17,15 +17,18 @@
#include "psqlodbc.h"
/* Used by backend data AND manual result sets */
struct
TupleField_
{
Int4
len
;
/* length of the current Tuple */
void
*
value
;
/* an array representing the value */
struct
TupleField_
{
Int4
len
;
/* length of the current Tuple */
void
*
value
;
/* an array representing the value */
};
/* Used ONLY for manual result sets */
struct
TupleNode_
{
struct
TupleNode_
*
prev
,
*
next
;
TupleField
tuple
[
1
];
struct
TupleNode_
{
struct
TupleNode_
*
prev
,
*
next
;
TupleField
tuple
[
1
];
};
/* These macros are wrappers for the corresponding set_tuplefield functions
...
...
@@ -36,9 +39,9 @@ struct TupleNode_ {
#define set_nullfield_int2(FLD, VAL) ((VAL) != -1 ? set_tuplefield_int2(FLD, (VAL)) : set_tuplefield_null(FLD))
#define set_nullfield_int4(FLD, VAL) ((VAL) != -1 ? set_tuplefield_int4(FLD, (VAL)) : set_tuplefield_null(FLD))
void
set_tuplefield_null
(
TupleField
*
tuple_field
);
void
set_tuplefield_string
(
TupleField
*
tuple_field
,
char
*
string
);
void
set_tuplefield_int2
(
TupleField
*
tuple_field
,
Int2
value
);
void
set_tuplefield_int4
(
TupleField
*
tuple_field
,
Int4
value
);
void
set_tuplefield_null
(
TupleField
*
tuple_field
);
void
set_tuplefield_string
(
TupleField
*
tuple_field
,
char
*
string
);
void
set_tuplefield_int2
(
TupleField
*
tuple_field
,
Int2
value
);
void
set_tuplefield_int4
(
TupleField
*
tuple_field
,
Int4
value
);
#endif
src/interfaces/odbc/tuplelist.c
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/interfaces/odbc/tuplelist.h
浏览文件 @
755a8733
此差异已折叠。
点击以展开。
src/tools/pgindent/README
浏览文件 @
755a8733
...
...
@@ -3,7 +3,7 @@ This can format all PostgreSQL *.c and *.h files, excluding libpq++,
On 09/06/1997, from the top directory, I ran:
find . -name '*.[ch]' -type f -print | egrep -v '\+\+|
/odbc/|
s_lock.h' | xargs -n100 pgindent
find . -name '*.[ch]' -type f -print | egrep -v '\+\+|s_lock.h' | xargs -n100 pgindent
The stock BSD indent has two bugs. First, a comment after the word 'else'
causes the rest of the file to be ignored. Second, it silently ignores
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录