Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
fc795099
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,发现更多精彩内容 >>
提交
fc795099
编写于
1月 13, 1998
作者:
M
Marc G. Fournier
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Should fix it all, Peter?
上级
06bad780
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
0 addition
and
633 deletion
+0
-633
src/interfaces/jdbc/JDBC_Test.java
src/interfaces/jdbc/JDBC_Test.java
+0
-171
src/interfaces/jdbc/postgresql/PGlobj.java
src/interfaces/jdbc/postgresql/PGlobj.java
+0
-462
未找到文件。
src/interfaces/jdbc/JDBC_Test.java
已删除
100644 → 0
浏览文件 @
06bad780
import
java.io.*
;
import
java.lang.*
;
import
java.sql.*
;
class
JDBC_Test
{
public
JDBC_Test
()
{
}
public
static
void
main
(
String
argv
[])
{
if
(
argv
.
length
<
3
)
{
System
.
err
.
println
(
"java JDBC_Test jdbc-url user password [debug]"
);
System
.
exit
(
1
);
}
String
url
=
new
String
(
argv
[
0
]);
String
usr
=
new
String
(
argv
[
1
]);
String
pwd
=
new
String
(
argv
[
2
]);
Connection
db
;
Statement
s
;
// This line outputs debug information to stderr. To enable this, simply
// add an extra parameter to the command line
if
(
argv
.
length
>
3
)
DriverManager
.
setLogStream
(
System
.
err
);
// Load the driver
try
{
Class
.
forName
(
"postgresql.Driver"
);
}
catch
(
ClassNotFoundException
e
)
{
System
.
err
.
println
(
"Exception: "
+
e
.
toString
());
}
// Lets do a few things -- it doesn't do everything, but
// it tests out basic functionality
try
{
//----------------------------------------
// Connect to database
System
.
out
.
println
(
"Connecting to Database URL = "
+
url
);
db
=
DriverManager
.
getConnection
(
url
,
usr
,
pwd
);
System
.
out
.
println
(
"Connected...Now creating a statement"
);
s
=
db
.
createStatement
();
//----------------------------------------
// test DateStyle & Warnings
System
.
out
.
println
(
"Ok... now set European date style"
);
s
.
executeUpdate
(
"set datestyle='european'"
);
System
.
out
.
println
(
"and see what style we are now using (handled by warnings)"
);
s
.
executeUpdate
(
"show datestyle"
);
SQLWarning
sw
=
db
.
getWarnings
();
while
(
sw
!=
null
)
{
System
.
out
.
println
(
"--> "
+
sw
.
getMessage
());
sw
=
sw
.
getNextWarning
();
}
db
.
clearWarnings
();
//----------------------------------------
// Creating a table
System
.
out
.
println
(
"Ok...now we will create a table"
);
s
.
executeUpdate
(
"create table test (a int2, b int2,c timestamp,d date)"
);
//----------------------------------------
// Simple inserts
System
.
out
.
println
(
"Now we will insert some columns"
);
s
.
executeUpdate
(
"insert into test values (1, 1,'now','now')"
);
s
.
executeUpdate
(
"insert into test values (2, 1,'now','01-11-1997')"
);
// As we are in european, this should mean 1 November 1997
s
.
executeUpdate
(
"insert into test values (3, 1,'now','11-01-1997')"
);
// As we are in european, this should mean 11 January 1997
System
.
out
.
println
(
"Inserted some data"
);
//----------------------------------------
// Now a select (see seperate method at end)
System
.
out
.
println
(
"Now lets try a select"
);
select
(
s
,
""
);
//----------------------------------------
// Now run some tests
runTests
(
db
,
s
);
//----------------------------------------
// Dropping a table
System
.
out
.
println
(
"Ok...dropping the table"
);
s
.
executeUpdate
(
"drop table test"
);
//----------------------------------------
// Closing the connection
System
.
out
.
println
(
"Now closing the connection"
);
s
.
close
();
db
.
close
();
//----------------------------------------
}
catch
(
SQLException
e
)
{
System
.
out
.
println
(
"Exception: "
+
e
.
toString
());
}
}
/**
* This performs some tests - not really part of an example, hence
* they are in a seperate method.
*/
public
static
void
runTests
(
Connection
db
,
Statement
s
)
throws
SQLException
{
//----------------------------------------
// This is a bug at the moment... when you use set datestyle
// it must be followed by show datestyle
System
.
out
.
println
(
"Now switch to US date format"
);
s
.
executeUpdate
(
"set datestyle='US'"
);
s
.
executeUpdate
(
"show datestyle"
);
System
.
out
.
println
(
"Now lets try a select"
);
select
(
s
,
""
);
//----------------------------------------
// Inserting dates using PreparedStatement
System
.
out
.
println
(
"Ok, now a test using PreparedStatement"
);
Date
dt
=
new
Date
(
97
,
11
,
1
);
PreparedStatement
ps
=
db
.
prepareStatement
(
"insert into test values (?,?,'now',?)"
);
// first insert in US style
s
.
executeUpdate
(
"set datestyle='US'"
);
s
.
executeUpdate
(
"show datestyle"
);
ps
.
setInt
(
1
,
8
);
ps
.
setInt
(
2
,
8
);
ps
.
setDate
(
3
,
dt
);
ps
.
executeUpdate
();
// second insert in European style
s
.
executeUpdate
(
"set datestyle='european'"
);
s
.
executeUpdate
(
"show datestyle"
);
ps
.
setInt
(
1
,
9
);
ps
.
setInt
(
2
,
9
);
ps
.
setDate
(
3
,
dt
);
ps
.
executeUpdate
();
System
.
out
.
println
(
"Now run the select again - first as European"
);
select
(
s
,
"where a>7"
);
s
.
executeUpdate
(
"set datestyle='US'"
);
s
.
executeUpdate
(
"show datestyle"
);
System
.
out
.
println
(
"Then as US"
);
select
(
s
,
"where a>7"
);
}
/**
* This performs a select. It's seperate because the tests use it in
* multiple places.
* @param s Statement to run under
* @throws SQLException
*/
public
static
void
select
(
Statement
s
,
String
sql
)
throws
SQLException
{
sql
=
"select a, b,c,d from test "
+
sql
;
System
.
out
.
println
(
"\nQuery: "
+
sql
);
ResultSet
rs
=
s
.
executeQuery
(
sql
);
System
.
out
.
println
(
"row a b c d 'd as string'"
);
System
.
out
.
println
(
"-------------------------------------------------------------------------------"
);
int
i
=
0
;
while
(
rs
.
next
())
{
int
a
=
rs
.
getInt
(
"a"
);
// Example of retriving by column name
int
b
=
rs
.
getInt
(
"b"
);
Timestamp
c
=
rs
.
getTimestamp
(
3
);
// Example of by column number
java
.
sql
.
Date
d
=
rs
.
getDate
(
4
);
// Note, java.sql.Date here
System
.
out
.
println
(
"row "
+
i
+
" "
+
a
+
" "
+
b
+
" "
+
c
+
" "
+
d
+
" '"
+
rs
.
getString
(
4
)+
"'"
);
i
++;
}
rs
.
close
();
}
}
src/interfaces/jdbc/postgresql/PGlobj.java
已删除
100644 → 0
浏览文件 @
06bad780
// Java Interface to Postgres
// $Id: PGlobj.java,v 1.1 1997/09/20 02:21:22 scrappy Exp $
// Copyright (c) 1997 Peter T Mount
package
postgresql
;
import
java.sql.*
;
import
java.math.*
;
import
java.net.*
;
import
java.io.*
;
import
java.util.*
;
/**
* This class implements the large object interface to postgresql.
*
* It provides the basic methods required to run the interface, plus
* a pair of methods that provide InputStream and OutputStream classes
* for this object.
*/
public
class
PGlobj
{
// This table contains the function oid's used by the backend
private
Hashtable
func
=
new
Hashtable
();
protected
postgresql
.
Connection
conn
;
/**
* These are the values for mode, taken from libpq-fs.h
*/
public
static
final
int
INV_ARCHIVE
=
0x00010000
;
public
static
final
int
INV_WRITE
=
0x00020000
;
public
static
final
int
INV_READ
=
0x00040000
;
/**
* These are the functions that implement the interface
*/
private
static
final
String
OPEN
=
"lo_open"
;
private
static
final
String
CLOSE
=
"lo_close"
;
private
static
final
String
CREATE
=
"lo_creat"
;
private
static
final
String
UNLINK
=
"lo_unlink"
;
private
static
final
String
SEEK
=
"lo_lseek"
;
private
static
final
String
TELL
=
"lo_tell"
;
private
static
final
String
READ
=
"loread"
;
private
static
final
String
WRITE
=
"lowrite"
;
/**
* This creates the interface
*/
public
PGlobj
(
Connection
conn
)
throws
SQLException
{
if
(!(
conn
instanceof
postgresql
.
Connection
))
throw
new
SQLException
(
"PGlobj: Wrong connection class"
);
this
.
conn
=
(
postgresql
.
Connection
)
conn
;
ResultSet
res
=
(
postgresql
.
ResultSet
)
conn
.
createStatement
().
executeQuery
(
"select proname, oid from pg_proc"
+
" where proname = 'lo_open'"
+
" or proname = 'lo_close'"
+
" or proname = 'lo_creat'"
+
" or proname = 'lo_unlink'"
+
" or proname = 'lo_lseek'"
+
" or proname = 'lo_tell'"
+
" or proname = 'loread'"
+
" or proname = 'lowrite'"
);
if
(
res
==
null
)
throw
new
SQLException
(
"failed to initialise large object interface"
);
while
(
res
.
next
())
{
func
.
put
(
res
.
getString
(
1
),
new
Integer
(
res
.
getInt
(
2
)));
DriverManager
.
println
(
"PGlobj:func "
+
res
.
getString
(
1
)+
" oid="
+
res
.
getInt
(
2
));
}
res
.
close
();
}
// this returns the oid of the function
private
int
getFunc
(
String
name
)
throws
SQLException
{
Integer
i
=
(
Integer
)
func
.
get
(
name
);
if
(
i
==
null
)
throw
new
SQLException
(
"unknown function: "
+
name
);
return
i
.
intValue
();
}
/**
* This calls a function on the backend
* @param fnid oid of the function to run
* @param args array containing args, 3 ints per arg
*/
public
int
PQfn
(
int
fnid
,
int
args
[])
throws
SQLException
{
return
PQfn
(
fnid
,
args
,
null
,
0
,
0
);
}
// fix bug in 6.1.1
public
void
writeInt
(
DataOutputStream
data
,
int
i
)
throws
IOException
{
data
.
writeByte
((
i
>>
24
)&
0xff
);
data
.
writeByte
(
i
&
0xff
);
data
.
writeByte
((
i
>>
8
)
&
0xff
);
data
.
writeByte
((
i
>>
16
)&
0xff
);
}
/**
* This calls a function on the backend
* @param fnid oid of the function to run
* @param args array containing args, 3 ints per arg
* @param buf byte array to write into, null returns result as an integer
* @param off offset in array
* @param len number of bytes to read
*/
public
int
PQfn
(
int
fnid
,
int
args
[],
byte
buf
[],
int
off
,
int
len
)
throws
SQLException
{
//ByteArrayOutputStream b = new ByteArrayOutputStream();
//DataOutputStream data = new DataOutputStream(b);
int
in
=
-
1
;
try
{
int
al
=
args
.
length
/
3
;
// For some reason, the backend takes these in the reverse order
byte
b
[]
=
new
byte
[
2
+
4
+
4
];
int
bp
=
0
;
b
[
bp
++]=
'F'
;
b
[
bp
++]=
0
;
b
[
bp
++]=(
byte
)((
fnid
)&
0xff
);
b
[
bp
++]=(
byte
)((
fnid
>>
24
)&
0xff
);
b
[
bp
++]=(
byte
)((
fnid
>>
16
)&
0xff
);
b
[
bp
++]=(
byte
)((
fnid
>>
8
)&
0xff
);
b
[
bp
++]=(
byte
)((
al
)&
0xff
);
b
[
bp
++]=(
byte
)((
al
>>
24
)&
0xff
);
b
[
bp
++]=(
byte
)((
al
>>
16
)&
0xff
);
b
[
bp
++]=(
byte
)((
al
>>
8
)&
0xff
);
conn
.
pg_stream
.
Send
(
b
);
//conn.pg_stream.SendChar('F');
//conn.pg_stream.SendInteger(fnid,4);
//conn.pg_stream.SendInteger(args.length / 3,4);
int
l
=
args
.
length
-
1
;
if
(
args
[
l
]==
0
)
l
--;
for
(
int
i
=
0
;
i
<
l
;
i
++)
conn
.
pg_stream
.
SendInteger
(
args
[
i
],
4
);
if
(
args
[
args
.
length
-
1
]==
0
)
conn
.
pg_stream
.
Send
(
buf
,
off
,
len
);
}
catch
(
Exception
e
)
{
throw
new
SQLException
(
"lo_open failed"
);
}
//try {
if
((
in
=
conn
.
pg_stream
.
ReceiveChar
())!=
'V'
)
{
if
(
in
==
'E'
)
throw
new
SQLException
(
conn
.
pg_stream
.
ReceiveString
(
4096
));
throw
new
SQLException
(
"lobj: expected 'V' from backend, got "
+((
char
)
in
));
}
while
(
true
)
{
in
=
conn
.
pg_stream
.
ReceiveChar
();
switch
(
in
)
{
case
'G'
:
if
(
buf
==
null
)
in
=
conn
.
pg_stream
.
ReceiveInteger
(
4
);
else
conn
.
pg_stream
.
Receive
(
buf
,
off
,
len
);
conn
.
pg_stream
.
ReceiveChar
();
return
in
;
case
'E'
:
throw
new
SQLException
(
"lobj: error - "
+
conn
.
pg_stream
.
ReceiveString
(
4096
));
case
'N'
:
conn
.
pg_stream
.
ReceiveString
(
4096
);
break
;
case
'0'
:
return
-
1
;
default
:
throw
new
SQLException
(
"lobj: protocol error"
);
}
}
// } catch(IOException ioe) {
// throw new SQLException("lobj: Network error - "+ioe);
//}
}
/**
* This opens a large object. It returns a handle that is used to
* access the object.
*/
public
int
open
(
int
lobjId
,
int
mode
)
throws
SQLException
{
int
args
[]
=
new
int
[
2
*
3
];
args
[
0
]
=
args
[
3
]
=
4
;
args
[
1
]
=
args
[
4
]
=
1
;
args
[
2
]
=
lobjId
;
args
[
5
]
=
mode
;
int
fd
=
PQfn
(
getFunc
(
OPEN
),
args
);
if
(
fd
<
0
)
throw
new
SQLException
(
"lo_open: no object"
);
seek
(
fd
,
0
);
return
fd
;
}
/**
* This closes a large object.
*/
public
void
close
(
int
fd
)
throws
SQLException
{
int
args
[]
=
new
int
[
1
*
3
];
args
[
0
]
=
4
;
args
[
1
]
=
1
;
args
[
2
]
=
fd
;
// flush/close streams here?
PQfn
(
getFunc
(
CLOSE
),
args
);
}
/**
* This reads a block of bytes from the large object
* @param fd descriptor for an open large object
* @param buf byte array to write into
* @param off offset in array
* @param len number of bytes to read
*/
public
void
read
(
int
fd
,
byte
buf
[],
int
off
,
int
len
)
throws
SQLException
{
int
args
[]
=
new
int
[
2
*
3
];
args
[
0
]
=
args
[
3
]
=
4
;
args
[
1
]
=
args
[
4
]
=
1
;
args
[
2
]
=
fd
;
args
[
5
]
=
len
;
PQfn
(
getFunc
(
READ
),
args
,
buf
,
off
,
len
);
}
/**
* This writes a block of bytes to an open large object
* @param fd descriptor for an open large object
* @param buf byte array to write into
* @param off offset in array
* @param len number of bytes to read
*/
public
void
write
(
int
fd
,
byte
buf
[],
int
off
,
int
len
)
throws
SQLException
{
int
args
[]
=
new
int
[
2
*
3
];
args
[
0
]
=
args
[
3
]
=
4
;
args
[
1
]
=
args
[
4
]
=
1
;
args
[
2
]
=
fd
;
args
[
5
]
=
0
;
PQfn
(
getFunc
(
WRITE
),
args
,
buf
,
off
,
len
);
}
/**
* This sets the current read or write location on a large object.
* @param fd descriptor of an open large object
* @param off offset in object
*/
public
void
seek
(
int
fd
,
int
off
)
throws
SQLException
{
int
args
[]
=
new
int
[
3
*
3
];
args
[
0
]
=
args
[
3
]
=
args
[
6
]
=
4
;
args
[
1
]
=
args
[
4
]
=
args
[
7
]
=
1
;
args
[
2
]
=
fd
;
args
[
5
]
=
off
;
args
[
8
]
=
0
;
// SEEK
PQfn
(
getFunc
(
SEEK
),
args
);
}
/**
* This creates a new large object.
*
* the mode is a bitmask describing different attributes of the new object
*
* returns the oid of the large object created.
*/
public
int
create
(
int
mode
)
throws
SQLException
{
int
args
[]
=
new
int
[
1
*
3
];
args
[
0
]
=
4
;
args
[
1
]
=
1
;
args
[
2
]
=
mode
;
return
PQfn
(
getFunc
(
CREATE
),
args
);
}
/**
* This returns the current location within the large object
*/
public
int
tell
(
int
fd
)
throws
SQLException
{
int
args
[]
=
new
int
[
1
*
3
];
args
[
0
]
=
4
;
args
[
1
]
=
1
;
args
[
2
]
=
fd
;
return
PQfn
(
getFunc
(
TELL
),
args
);
}
/**
* This removes a large object from the database
*/
public
void
unlink
(
int
fd
)
throws
SQLException
{
int
args
[]
=
new
int
[
1
*
3
];
args
[
0
]
=
4
;
args
[
1
]
=
1
;
args
[
2
]
=
fd
;
PQfn
(
getFunc
(
UNLINK
),
args
);
}
/**
* This returns an InputStream based on an object
*/
public
InputStream
getInputStream
(
int
fd
)
throws
SQLException
{
return
(
InputStream
)
new
PGlobjInput
(
this
,
fd
);
}
/**
* This returns an OutputStream based on an object
*/
public
OutputStream
getOutputStream
(
int
fd
)
throws
SQLException
{
return
(
OutputStream
)
new
PGlobjOutput
(
this
,
fd
);
}
/**
* As yet, the lo_import and lo_export functions are not implemented.
*/
}
// This class implements an InputStream based on a large object
//
// Note: Unlike most InputStreams, this one supports mark()/reset()
//
class
PGlobjInput
extends
InputStream
{
private
PGlobj
obj
;
private
int
fd
;
private
int
mp
;
// mark position
private
int
rl
;
// read limit
// This creates an Input stream based for a large object
public
PGlobjInput
(
PGlobj
obj
,
int
fd
)
{
this
.
obj
=
obj
;
this
.
fd
=
fd
;
}
public
int
read
()
throws
IOException
{
byte
b
[]
=
new
byte
[
1
];
read
(
b
,
0
,
1
);
return
(
int
)
b
[
0
];
}
public
int
read
(
byte
b
[],
int
off
,
int
len
)
throws
IOException
{
try
{
obj
.
read
(
fd
,
b
,
off
,
len
);
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
return
len
;
}
public
long
skip
(
long
n
)
throws
IOException
{
try
{
int
cp
=
obj
.
tell
(
fd
);
obj
.
seek
(
fd
,
cp
+(
int
)
n
);
return
obj
.
tell
(
fd
)
-
cp
;
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
}
public
synchronized
void
mark
(
int
readLimit
)
{
try
{
mp
=
obj
.
tell
(
fd
);
rl
=
readLimit
;
}
catch
(
SQLException
e
)
{
// We should throw an exception here, but mark() doesn't ;-(
}
}
public
void
reset
()
throws
IOException
{
try
{
int
cp
=
obj
.
tell
(
fd
);
if
((
cp
-
mp
)>
rl
)
throw
new
IOException
(
"mark invalidated"
);
obj
.
seek
(
fd
,
mp
);
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
}
public
boolean
markSupported
()
{
return
true
;
}
public
void
close
()
throws
IOException
{
try
{
obj
.
close
(
fd
);
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
}
}
// This class implements an OutputStream to a large object
class
PGlobjOutput
extends
OutputStream
{
private
PGlobj
obj
;
private
int
fd
;
// This creates an Input stream based for a large object
public
PGlobjOutput
(
PGlobj
obj
,
int
fd
)
{
this
.
obj
=
obj
;
this
.
fd
=
fd
;
}
public
void
write
(
int
i
)
throws
IOException
{
byte
b
[]
=
new
byte
[
1
];
b
[
0
]
=
(
byte
)
i
;
write
(
b
,
0
,
1
);
}
public
void
write
(
byte
b
[],
int
off
,
int
len
)
throws
IOException
{
try
{
obj
.
write
(
fd
,
b
,
off
,
len
);
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
}
public
void
close
()
throws
IOException
{
try
{
obj
.
close
(
fd
);
}
catch
(
SQLException
e
)
{
throw
new
IOException
(
e
.
toString
());
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录