Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
fc795099
Commit
fc795099
authored
Jan 13, 1998
by
Marc G. Fournier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Should fix it all, Peter?
parent
06bad780
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
633 deletions
+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
No files found.
src/interfaces/jdbc/JDBC_Test.java
deleted
100644 → 0
View file @
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
deleted
100644 → 0
View file @
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
());
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment