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
c2d1b391
Commit
c2d1b391
authored
Nov 22, 2000
by
Tom Lane
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Code review: minor cleanups, make the world safe for unsigned OIDs.
Improve documentation, too.
parent
90cfa9ac
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
198 additions
and
136 deletions
+198
-136
contrib/pg_dumplo/README.pg_dumplo
contrib/pg_dumplo/README.pg_dumplo
+61
-30
contrib/pg_dumplo/lo_export.c
contrib/pg_dumplo/lo_export.c
+61
-47
contrib/pg_dumplo/lo_import.c
contrib/pg_dumplo/lo_import.c
+23
-13
contrib/pg_dumplo/main.c
contrib/pg_dumplo/main.c
+21
-21
contrib/pg_dumplo/pg_dumplo.h
contrib/pg_dumplo/pg_dumplo.h
+22
-9
contrib/pg_dumplo/utils.c
contrib/pg_dumplo/utils.c
+10
-16
No files found.
contrib/pg_dumplo/README.pg_dumplo
View file @
c2d1b391
$Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/README.pg_dumplo,v 1.2 2000/11/22 00:00:55 tgl Exp $
pg_dumplo - PostgreSQL large object dumper
==========================================
By Karel Zak <zakkr@zf.jcu.cz>
Compilation:
===========
* run master ./configure in the PG source top directory
* gmake all
* gmake install
THANKS:
======
<??? I lost his e-mail ???>
* option '--all' and pg_class usage
Pavel Janík ml. <Pavel.Janik@linux.cz>
* HOWTO (the rest of this file)
How to use pg_dumplo?
How to use pg_dumplo?
=====================
=====================
...
@@ -19,7 +43,7 @@ CREATE DATABASE
...
@@ -19,7 +43,7 @@ CREATE DATABASE
Ok, our database with the name 'test' is created. Now we should create demo
Ok, our database with the name 'test' is created. Now we should create demo
table which will contain only one column with the name 'id' which will hold
table which will contain only one column with the name 'id' which will hold
the
oid number of
Large Object:
the
OID number of a
Large Object:
SnowWhite:$ psql test
SnowWhite:$ psql test
Welcome to psql, the PostgreSQL interactive terminal.
Welcome to psql, the PostgreSQL interactive terminal.
...
@@ -49,12 +73,12 @@ Object" - the file /etc/aliases. It has an oid of 19338 so we have inserted
...
@@ -49,12 +73,12 @@ Object" - the file /etc/aliases. It has an oid of 19338 so we have inserted
this oid number to the database table lo to the column id. The final SELECT
this oid number to the database table lo to the column id. The final SELECT
shows that we have one record in the table.
shows that we have one record in the table.
Now we can demonstrate the work of pg_dumplo. We will create dump directory
Now we can demonstrate the work of pg_dumplo. We will create
a
dump directory
which will contain the whole dump of large objects (/tmp/dump):
which will contain the whole dump of large objects (/tmp/dump):
mkdir -p /tmp/dump
mkdir -p /tmp/dump
Now we can dump all large objects from the database `test' which ha
s an oid
Now we can dump all large objects from the database `test' which ha
ve OIDs
stored in the column `id' in the table `lo':
stored in the column `id' in the table `lo':
SnowWhite:$ pg_dumplo -s /tmp/dump -d test -l lo.id
SnowWhite:$ pg_dumplo -s /tmp/dump -d test -l lo.id
...
@@ -73,45 +97,52 @@ SnowWhite:$ tree /tmp/dump/
...
@@ -73,45 +97,52 @@ SnowWhite:$ tree /tmp/dump/
3 directories, 2 files
3 directories, 2 files
SnowWhite:$
SnowWhite:$
Isn't it nice :-) Yes, it is, but we are on the half of our way. We should
In practice, we'd probably use
also be able to recreate the contents of the table lo and the Large Object
database when something went wrong. It is very easy, we will demonstrate
this via dropping the database and recreating it from scratch with
pg_dumplo:
SnowwWite:$ dropdb test
SnowWhite:$ pg_dumplo -s /tmp/dump -d test -e
DROP DATABASE
SnowWhite:$ createdb test
to export all large objects that are referenced by any OID-type column
CREATE DATABASE
in the database. Calling out specific column(s) with -l is only needed
for a selective dump.
Ok, our database with the name `test' is created again. We should also
For routine backup purposes, the dump directory could now be converted into
create the table `lo' again:
an archive file with tar and stored on tape. Notice that a single dump
directory can hold the dump of multiple databases.
SnowWhite:$ psql test
Now, how can we recreate the contents of the table lo and the Large Object
Welcome to psql, the PostgreSQL interactive terminal.
database when something went wrong? To do this, we expect that pg_dump is
also used to store the definition and contents of the regular tables in
the database.
Type: \copyright for distribution terms
SnowWhite:$ pg_dump test >test.backup
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
test=# CREATE TABLE lo (id oid);
Now, if we lose the database:
CREATE
test=# \q
SnowWhite:$
Now the database with the table `lo' is created again, but we do not have
SnowWhite:$ dropdb test
any information stored in it. But have the dump of complete Large Object
DROP DATABASE
database, so we can recreate the contents of the whole database from the
directory /tmp/dump:
we can recreate it and reload the regular tables from the dump file:
SnowWhite:$ createdb test
CREATE DATABASE
SnowWhite:$ psql test <test.backup
But at this point our database has no large objects in it. What's more,
the large-object-referencing columns contain the OIDs of the old large
objects, which will not be the OIDs they'll have when reloaded. Never
fear: pg_dumplo will fix the large object references at the same time
it reloads the large objects. We reload the LO data from the dump
directory like this:
SnowWhite:$ pg_dumplo -s /tmp/dump -d test -i
SnowWhite:$ pg_dumplo -s /tmp/dump -d test -i
19338 lo id test/lo/id/19338
19338 lo id test/lo/id/19338
SnowWhite:$
SnowWhite:$
And this is everything.
And this is everything. The contents of table lo will be automatically
updated to refer to the new large object OIDs.
Summary: In this small example we have shown that pg_dumplo can be used to
Summary: In this small example we have shown that pg_dumplo can be used to
completely dump the database's Large Objects very easily.
completely dump the database's Large Objects very easily.
For more information see the help ( pg_dumplo -h ).
contrib/pg_dumplo/lo_export.c
View file @
c2d1b391
/* -------------------------------------------------------------------------
* pg_dumplo
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/lo_export.c,v 1.4 2000/11/22 00:00:55 tgl Exp $
*
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
...
@@ -16,15 +26,6 @@
...
@@ -16,15 +26,6 @@
extern
int
errno
;
extern
int
errno
;
#define LOAD_LOLIST_QUERY "\
SELECT c.relname, a.attname \
FROM pg_class c, pg_attribute a, pg_type t \
WHERE a.attnum > 0 \
AND a.attrelid = c.oid \
AND a.atttypid = t.oid \
AND t.typname = 'oid' \
AND c.relname NOT LIKE 'pg_%'"
void
void
load_lolist
(
LODumpMaster
*
pgLO
)
load_lolist
(
LODumpMaster
*
pgLO
)
...
@@ -34,19 +35,33 @@ load_lolist( LODumpMaster *pgLO )
...
@@ -34,19 +35,33 @@ load_lolist( LODumpMaster *pgLO )
int
n
;
int
n
;
/* ----------
/* ----------
* Now find any candidate tables who have columns of type oid (the
* Now find any candidate tables who have columns of type oid.
* column oid is ignored, as it has attnum < 1)
*
* NOTE: System tables including pg_largeobject will be ignored.
* Otherwise we'd end up dumping all LOs, referenced or not.
*
* NOTE: the system oid column is ignored, as it has attnum < 1.
* This shouldn't matter for correctness, but it saves time.
* ----------
* ----------
*/
*/
if
(
!
(
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
LOAD_LOLIST_QUERY
)))
{
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
"SELECT c.relname, a.attname "
fprintf
(
stderr
,
"%s: Select from pg_class failed.
\n
"
,
progname
);
"FROM pg_class c, pg_attribute a, pg_type t "
exit
(
RE_ERROR
);
"WHERE a.attnum > 0 "
}
" AND a.attrelid = c.oid "
" AND a.atttypid = t.oid "
" AND t.typname = 'oid' "
" AND c.relkind = 'r' "
" AND c.relname NOT LIKE 'pg_%'"
);
if
(
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_TUPLES_OK
)
{
fprintf
(
stderr
,
"%s: Failed to get LO OIDs:
\n
%s"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
exit
(
RE_ERROR
);
}
if
((
n
=
PQntuples
(
pgLO
->
res
))
==
0
)
{
if
((
n
=
PQntuples
(
pgLO
->
res
))
==
0
)
{
fprintf
(
stderr
,
"%s: No OID columns in the database.
\n
"
,
progname
);
fprintf
(
stderr
,
"%s: No large objects in the database.
\n
"
,
progname
);
exit
(
RE_ERROR
);
exit
(
RE_ERROR
);
}
}
...
@@ -61,10 +76,9 @@ load_lolist( LODumpMaster *pgLO )
...
@@ -61,10 +76,9 @@ load_lolist( LODumpMaster *pgLO )
ll
->
lo_table
=
strdup
(
PQgetvalue
(
pgLO
->
res
,
i
,
0
));
ll
->
lo_table
=
strdup
(
PQgetvalue
(
pgLO
->
res
,
i
,
0
));
ll
->
lo_attr
=
strdup
(
PQgetvalue
(
pgLO
->
res
,
i
,
1
));
ll
->
lo_attr
=
strdup
(
PQgetvalue
(
pgLO
->
res
,
i
,
1
));
}
}
ll
->
lo_table
=
ll
->
lo_attr
=
(
char
*
)
NULL
;
PQclear
(
pgLO
->
res
);
PQclear
(
pgLO
->
res
);
ll
++
;
ll
->
lo_table
=
ll
->
lo_attr
=
(
char
*
)
NULL
;
}
}
void
void
...
@@ -91,24 +105,25 @@ pglo_export(LODumpMaster *pgLO)
...
@@ -91,24 +105,25 @@ pglo_export(LODumpMaster *pgLO)
for
(
ll
=
pgLO
->
lolist
;
ll
->
lo_table
!=
NULL
;
ll
++
)
{
for
(
ll
=
pgLO
->
lolist
;
ll
->
lo_table
!=
NULL
;
ll
++
)
{
/* ----------
/* ----------
* Query
* Query
: find the LOs referenced by this column
* ----------
* ----------
*/
*/
sprintf
(
Qbuff
,
"SELECT DISTINCT
x.
\"
%s
\"
FROM
\"
%s
\"
x, pg_largeobject l WHERE x.
\"
%s
\"
= l.loid"
,
sprintf
(
Qbuff
,
"SELECT DISTINCT
l.loid
FROM
\"
%s
\"
x, pg_largeobject l WHERE x.
\"
%s
\"
= l.loid"
,
ll
->
lo_attr
,
ll
->
lo_table
,
ll
->
lo_attr
);
ll
->
lo_table
,
ll
->
lo_attr
);
/* puts(Qbuff); */
/* puts(Qbuff); */
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
Qbuff
);
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
Qbuff
);
if
((
tuples
=
PQntuples
(
pgLO
->
res
))
==
0
)
{
if
(
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_TUPLES_OK
)
{
fprintf
(
stderr
,
"%s: Failed to get LO OIDs:
\n
%s"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
}
else
if
((
tuples
=
PQntuples
(
pgLO
->
res
))
==
0
)
{
if
(
!
pgLO
->
quiet
&&
pgLO
->
action
==
ACTION_EXPORT_ATTR
)
if
(
!
pgLO
->
quiet
&&
pgLO
->
action
==
ACTION_EXPORT_ATTR
)
printf
(
"%s: no large objects in '%s'
\n
"
,
printf
(
"%s: no large objects in
\"
%s
\"
.
\"
%s
\"\n
"
,
progname
,
ll
->
lo_table
);
progname
,
ll
->
lo_table
,
ll
->
lo_attr
);
continue
;
}
else
{
}
else
if
(
check_res
(
pgLO
))
{
int
t
;
int
t
;
char
*
val
;
char
*
val
;
...
@@ -117,9 +132,10 @@ pglo_export(LODumpMaster *pgLO)
...
@@ -117,9 +132,10 @@ pglo_export(LODumpMaster *pgLO)
* Create DIR/FILE
* Create DIR/FILE
* ----------
* ----------
*/
*/
if
(
tuples
&&
pgLO
->
action
!=
ACTION_SHOW
)
{
if
(
pgLO
->
action
!=
ACTION_SHOW
)
{
sprintf
(
path
,
"%s/%s/%s"
,
pgLO
->
space
,
pgLO
->
db
,
ll
->
lo_table
);
sprintf
(
path
,
"%s/%s/%s"
,
pgLO
->
space
,
pgLO
->
db
,
ll
->
lo_table
);
if
(
mkdir
(
path
,
DIR_UMASK
)
==
-
1
)
{
if
(
mkdir
(
path
,
DIR_UMASK
)
==
-
1
)
{
if
(
errno
!=
EEXIST
)
{
if
(
errno
!=
EEXIST
)
{
...
@@ -127,8 +143,9 @@ pglo_export(LODumpMaster *pgLO)
...
@@ -127,8 +143,9 @@ pglo_export(LODumpMaster *pgLO)
exit
(
RE_ERROR
);
exit
(
RE_ERROR
);
}
}
}
}
sprintf
(
path
,
"%s/%s"
,
path
,
ll
->
lo_attr
);
sprintf
(
path
,
"%s/%s/%s/%s"
,
pgLO
->
space
,
pgLO
->
db
,
ll
->
lo_table
,
ll
->
lo_attr
);
if
(
mkdir
(
path
,
DIR_UMASK
)
==
-
1
)
{
if
(
mkdir
(
path
,
DIR_UMASK
)
==
-
1
)
{
if
(
errno
!=
EEXIST
)
{
if
(
errno
!=
EEXIST
)
{
...
@@ -145,19 +162,14 @@ pglo_export(LODumpMaster *pgLO)
...
@@ -145,19 +162,14 @@ pglo_export(LODumpMaster *pgLO)
pgLO
->
counter
+=
tuples
;
pgLO
->
counter
+=
tuples
;
for
(
t
=
0
;
t
<
tuples
;
t
++
)
{
for
(
t
=
0
;
t
<
tuples
;
t
++
)
{
Oid
lo
;
Oid
lo
=
(
Oid
)
0
;
val
=
PQgetvalue
(
pgLO
->
res
,
t
,
0
);
val
=
PQgetvalue
(
pgLO
->
res
,
t
,
0
);
if
(
!
val
)
lo
=
atooid
(
val
);
continue
;
else
lo
=
(
Oid
)
atol
(
val
);
if
(
pgLO
->
action
==
ACTION_SHOW
)
{
if
(
pgLO
->
action
==
ACTION_SHOW
)
{
printf
(
"%s.%s: %ld
\n
"
,
ll
->
lo_table
,
printf
(
"%s.%s: %u
\n
"
,
ll
->
lo_table
,
ll
->
lo_attr
,
lo
);
ll
->
lo_attr
,
(
long
)
lo
);
continue
;
continue
;
}
}
...
@@ -165,13 +177,15 @@ pglo_export(LODumpMaster *pgLO)
...
@@ -165,13 +177,15 @@ pglo_export(LODumpMaster *pgLO)
pgLO
->
db
,
ll
->
lo_table
,
ll
->
lo_attr
,
val
);
pgLO
->
db
,
ll
->
lo_table
,
ll
->
lo_attr
,
val
);
if
(
lo_export
(
pgLO
->
conn
,
lo
,
path
)
<
0
)
if
(
lo_export
(
pgLO
->
conn
,
lo
,
path
)
<
0
)
fprintf
(
stderr
,
"%s: %s
\n
"
,
PQerrorMessage
(
pgLO
->
conn
),
progname
);
fprintf
(
stderr
,
"%s: lo_export failed:
\n
%s"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
else
else
fprintf
(
pgLO
->
index
,
"%s
\t
%s
\t
%s
\t
%s/%s/%s/%s
\n
"
,
val
,
fprintf
(
pgLO
->
index
,
"%s
\t
%s
\t
%s
\t
%s/%s/%s/%s
\n
"
,
val
,
ll
->
lo_table
,
ll
->
lo_attr
,
pgLO
->
db
,
ll
->
lo_table
,
ll
->
lo_attr
,
val
);
ll
->
lo_table
,
ll
->
lo_attr
,
pgLO
->
db
,
ll
->
lo_table
,
ll
->
lo_attr
,
val
);
}
}
}
}
}
}
PQclear
(
pgLO
->
res
);
}
}
contrib/pg_dumplo/lo_import.c
View file @
c2d1b391
/* -------------------------------------------------------------------------
* pg_dumplo
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/lo_import.c,v 1.2 2000/11/22 00:00:55 tgl Exp $
*
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
...
@@ -20,7 +30,7 @@ void
...
@@ -20,7 +30,7 @@ void
pglo_import
(
LODumpMaster
*
pgLO
)
pglo_import
(
LODumpMaster
*
pgLO
)
{
{
LOlist
loa
;
LOlist
loa
;
long
new_oid
;
Oid
new_oid
;
char
tab
[
MAX_TABLE_NAME
],
attr
[
MAX_ATTR_NAME
],
char
tab
[
MAX_TABLE_NAME
],
attr
[
MAX_ATTR_NAME
],
path
[
BUFSIZ
],
lo_path
[
BUFSIZ
],
path
[
BUFSIZ
],
lo_path
[
BUFSIZ
],
Qbuff
[
QUERY_BUFSIZ
];
Qbuff
[
QUERY_BUFSIZ
];
...
@@ -33,7 +43,7 @@ pglo_import(LODumpMaster *pgLO)
...
@@ -33,7 +43,7 @@ pglo_import(LODumpMaster *pgLO)
if
(
!
pgLO
->
remove
&&
!
pgLO
->
quiet
)
if
(
!
pgLO
->
remove
&&
!
pgLO
->
quiet
)
printf
(
Qbuff
);
printf
(
Qbuff
);
sscanf
(
Qbuff
,
"%
ld
\t
%s
\t
%s
\t
%s
\n
"
,
&
loa
.
lo_oid
,
tab
,
attr
,
path
);
sscanf
(
Qbuff
,
"%
u
\t
%s
\t
%s
\t
%s
\n
"
,
&
loa
.
lo_oid
,
tab
,
attr
,
path
);
loa
.
lo_table
=
tab
;
loa
.
lo_table
=
tab
;
loa
.
lo_attr
=
attr
;
loa
.
lo_attr
=
attr
;
...
@@ -43,7 +53,7 @@ pglo_import(LODumpMaster *pgLO)
...
@@ -43,7 +53,7 @@ pglo_import(LODumpMaster *pgLO)
* Import LO
* Import LO
* ----------
* ----------
*/
*/
if
((
new_oid
=
lo_import
(
pgLO
->
conn
,
lo_path
))
<
=
0
)
{
if
((
new_oid
=
lo_import
(
pgLO
->
conn
,
lo_path
))
=
=
0
)
{
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
...
@@ -54,12 +64,12 @@ pglo_import(LODumpMaster *pgLO)
...
@@ -54,12 +64,12 @@ pglo_import(LODumpMaster *pgLO)
if
(
pgLO
->
remove
)
{
if
(
pgLO
->
remove
)
{
notice
(
pgLO
,
FALSE
);
notice
(
pgLO
,
FALSE
);
if
(
lo_unlink
(
pgLO
->
conn
,
(
Oid
)
loa
.
lo_oid
)
<
0
)
if
(
lo_unlink
(
pgLO
->
conn
,
loa
.
lo_oid
)
<
0
)
fprintf
(
stderr
,
"%s: can't remove LO
: %ld (%s)
\n
"
,
fprintf
(
stderr
,
"%s: can't remove LO
%u:
\n
%s
"
,
progname
,
loa
.
lo_oid
,
PQerrorMessage
(
pgLO
->
conn
));
progname
,
loa
.
lo_oid
,
PQerrorMessage
(
pgLO
->
conn
));
else
if
(
!
pgLO
->
quiet
)
else
if
(
!
pgLO
->
quiet
)
printf
(
"remove old %
ld and create new %ld
\n
"
,
printf
(
"remove old %
u and create new %u
\n
"
,
loa
.
lo_oid
,
new_oid
);
loa
.
lo_oid
,
new_oid
);
notice
(
pgLO
,
TRUE
);
notice
(
pgLO
,
TRUE
);
}
}
...
@@ -70,20 +80,20 @@ pglo_import(LODumpMaster *pgLO)
...
@@ -70,20 +80,20 @@ pglo_import(LODumpMaster *pgLO)
* UPDATE oid in tab
* UPDATE oid in tab
* ----------
* ----------
*/
*/
sprintf
(
Qbuff
,
"UPDATE
%s SET %s=%ld WHERE %s=%ld
"
,
sprintf
(
Qbuff
,
"UPDATE
\"
%s
\"
SET
\"
%s
\"
=%u WHERE
\"
%s
\"
=%u
"
,
loa
.
lo_table
,
loa
.
lo_attr
,
new_oid
,
loa
.
lo_attr
,
loa
.
lo_oid
);
loa
.
lo_table
,
loa
.
lo_attr
,
new_oid
,
loa
.
lo_attr
,
loa
.
lo_oid
);
/*fprintf(stderr, Qbuff);*/
/*fprintf(stderr, Qbuff);*/
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
Qbuff
);
pgLO
->
res
=
PQexec
(
pgLO
->
conn
,
Qbuff
);
if
(
!
pgLO
->
res
&&
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_COMMAND_OK
)
{
if
(
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_COMMAND_OK
)
{
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
PQclear
(
pgLO
->
res
);
PQclear
(
pgLO
->
res
);
PQexec
(
pgLO
->
conn
,
"ROLLBACK"
);
PQexec
(
pgLO
->
conn
,
"ROLLBACK"
);
fprintf
(
stderr
,
"
\n
%s: ROLLBACK
\n
"
,
progname
);
fprintf
(
stderr
,
"
\n
%s: ROLLBACK
\n
"
,
progname
);
exit
(
RE_ERROR
);
exit
(
RE_ERROR
);
}
}
PQclear
(
pgLO
->
res
);
}
}
}
}
contrib/pg_dumplo/main.c
View file @
c2d1b391
/* -------------------------------------------------------------------------
/* -------------------------------------------------------------------------
* pg_dumplo
* pg_dumplo
*
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/main.c,v 1.
3 2000/07/03 16:03:22 momjian
Exp $
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/main.c,v 1.
4 2000/11/22 00:00:55 tgl
Exp $
*
*
* Karel Zak 1999-2000
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
* -------------------------------------------------------------------------
*/
*/
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <errno.h>
#include <errno.h>
/* We import postgres.h mostly to get the HAVE_GETOPT_LONG configure result. */
#ifndef OUT_OF_PG
#ifndef OUT_OF_PG
#include "postgres.h"
#include "postgres.h"
#endif
#endif
#include <libpq-fe.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>
#include <libpq/libpq-fs.h>
#include "pg_dumplo.h"
#ifdef HAVE_GETOPT_LONG
#ifdef HAVE_GETOPT_LONG
#include <getopt.h>
#include <getopt.h>
#define no_argument 0
#define no_argument 0
...
@@ -34,8 +35,6 @@ extern int errno;
...
@@ -34,8 +35,6 @@ extern int errno;
char
*
progname
=
NULL
;
char
*
progname
=
NULL
;
#include "pg_dumplo.h"
int
main
(
int
argc
,
char
**
argv
);
int
main
(
int
argc
,
char
**
argv
);
static
void
usage
(
void
);
static
void
usage
(
void
);
static
void
parse_lolist
(
LODumpMaster
*
pgLO
);
static
void
parse_lolist
(
LODumpMaster
*
pgLO
);
...
@@ -97,11 +96,11 @@ main(int argc, char **argv)
...
@@ -97,11 +96,11 @@ main(int argc, char **argv)
#else
#else
while
((
arg
=
getopt
(
argc
,
argv
,
"?aehu:p:qd:l:t:irs:w"
))
!=
-
1
)
{
while
((
arg
=
getopt
(
argc
,
argv
,
"?aehu:p:qd:l:t:irs:w"
))
!=
-
1
)
{
#endif
#endif
switch
(
arg
)
{
switch
(
arg
)
{
case
'?'
:
case
'?'
:
case
'h'
:
case
'h'
:
usage
();
usage
();
exit
(
RE_OK
);
exit
(
RE_OK
);
case
'u'
:
case
'u'
:
pgLO
->
user
=
strdup
(
optarg
);
pgLO
->
user
=
strdup
(
optarg
);
break
;
break
;
...
@@ -127,11 +126,11 @@ main(int argc, char **argv)
...
@@ -127,11 +126,11 @@ main(int argc, char **argv)
break
;
break
;
case
'e'
:
case
'e'
:
case
'a'
:
case
'a'
:
pgLO
->
action
=
ACTION_EXPORT_ALL
;
pgLO
->
action
=
ACTION_EXPORT_ALL
;
break
;
break
;
case
'w'
:
case
'w'
:
pgLO
->
action
=
ACTION_SHOW
;
pgLO
->
action
=
ACTION_SHOW
;
break
;
break
;
case
'r'
:
case
'r'
:
pgLO
->
remove
=
TRUE
;
pgLO
->
remove
=
TRUE
;
break
;
break
;
...
@@ -139,10 +138,10 @@ main(int argc, char **argv)
...
@@ -139,10 +138,10 @@ main(int argc, char **argv)
pgLO
->
quiet
=
TRUE
;
pgLO
->
quiet
=
TRUE
;
break
;
break
;
default:
default:
fprintf
(
stderr
,
"%s: bad arg
!
\n
"
,
progname
);
fprintf
(
stderr
,
"%s: bad arg
-%c
\n
"
,
progname
,
arg
);
usage
();
usage
();
exit
(
RE_ERROR
);
exit
(
RE_ERROR
);
}
}
}
}
}
else
{
}
else
{
usage
();
usage
();
...
@@ -172,12 +171,12 @@ main(int argc, char **argv)
...
@@ -172,12 +171,12 @@ main(int argc, char **argv)
pgLO
->
conn
=
PQsetdbLogin
(
pgLO
->
host
,
NULL
,
NULL
,
NULL
,
pgLO
->
db
,
pgLO
->
conn
=
PQsetdbLogin
(
pgLO
->
host
,
NULL
,
NULL
,
NULL
,
pgLO
->
db
,
pgLO
->
user
,
pwd
);
pgLO
->
user
,
pwd
);
if
(
PQstatus
(
pgLO
->
conn
)
==
CONNECTION_BAD
)
{
if
(
PQstatus
(
pgLO
->
conn
)
==
CONNECTION_BAD
)
{
fprintf
(
stderr
,
"%s (connection): %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
fprintf
(
stderr
,
"%s (connection): %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
exit
(
RE_ERROR
);
exit
(
RE_ERROR
);
}
}
pgLO
->
host
=
PQhost
(
pgLO
->
conn
)
?
PQhost
(
pgLO
->
conn
)
:
"localhost"
;
pgLO
->
host
=
PQhost
(
pgLO
->
conn
)
?
PQhost
(
pgLO
->
conn
)
:
"localhost"
;
pgLO
->
db
=
PQdb
(
pgLO
->
conn
);
pgLO
->
db
=
PQdb
(
pgLO
->
conn
);
pgLO
->
user
=
PQuser
(
pgLO
->
conn
);
pgLO
->
user
=
PQuser
(
pgLO
->
conn
);
...
@@ -195,6 +194,7 @@ main(int argc, char **argv)
...
@@ -195,6 +194,7 @@ main(int argc, char **argv)
case
ACTION_SHOW
:
case
ACTION_SHOW
:
case
ACTION_EXPORT_ALL
:
case
ACTION_EXPORT_ALL
:
load_lolist
(
pgLO
);
load_lolist
(
pgLO
);
/* FALL THROUGH */
case
ACTION_EXPORT_ATTR
:
case
ACTION_EXPORT_ATTR
:
pglo_export
(
pgLO
);
pglo_export
(
pgLO
);
...
...
contrib/pg_dumplo/pg_dumplo.h
View file @
c2d1b391
/* -------------------------------------------------------------------------
* pg_dumplo
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/pg_dumplo.h,v 1.2 2000/11/22 00:00:55 tgl Exp $
*
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
*/
#ifndef PG_DUMPLO_H
#define PG_DUMPLO_H
#ifndef _PG_LODUMP_H_
#include "postgres_ext.h"
#define _PG_LODUMP_H_
#define VERSION "
0.0.5
"
#define VERSION "
7.1.0
"
/* ----------
/* ----------
* Define
* Define
...
@@ -10,7 +22,7 @@
...
@@ -10,7 +22,7 @@
*/
*/
#define QUERY_BUFSIZ (8*1024)
#define QUERY_BUFSIZ (8*1024)
#define DIR_UMASK 0755
#define DIR_UMASK 0755
#define FILE_UMASK 06
66
#define FILE_UMASK 06
44
#define TRUE 1
#define TRUE 1
#define FALSE 0
#define FALSE 0
...
@@ -20,16 +32,16 @@
...
@@ -20,16 +32,16 @@
#define MAX_TABLE_NAME 128
#define MAX_TABLE_NAME 128
#define MAX_ATTR_NAME 128
#define MAX_ATTR_NAME 128
extern
char
*
progname
;
#define atooid(x) ((Oid) strtoul((x), NULL, 10))
/* ----------
/* ----------
* LO struct
* LO struct
* ----------
* ----------
*/
*/
typedef
struct
{
typedef
struct
{
char
*
lo_table
,
char
*
lo_table
,
*
lo_attr
;
*
lo_attr
;
long
lo_oid
;
Oid
lo_oid
;
}
LOlist
;
}
LOlist
;
typedef
struct
{
typedef
struct
{
...
@@ -58,11 +70,12 @@ typedef enum {
...
@@ -58,11 +70,12 @@ typedef enum {
ACTION_IMPORT
ACTION_IMPORT
}
PGLODUMP_ACTIONS
;
}
PGLODUMP_ACTIONS
;
extern
char
*
progname
;
extern
void
notice
(
LODumpMaster
*
pgLO
,
int
set
);
extern
void
notice
(
LODumpMaster
*
pgLO
,
int
set
);
extern
int
check_res
(
LODumpMaster
*
pgLO
);
extern
void
index_file
(
LODumpMaster
*
pgLO
);
extern
void
index_file
(
LODumpMaster
*
pgLO
);
extern
void
load_lolist
(
LODumpMaster
*
pgLO
);
extern
void
load_lolist
(
LODumpMaster
*
pgLO
);
extern
void
pglo_export
(
LODumpMaster
*
pgLO
);
extern
void
pglo_export
(
LODumpMaster
*
pgLO
);
extern
void
pglo_import
(
LODumpMaster
*
pgLO
);
extern
void
pglo_import
(
LODumpMaster
*
pgLO
);
#endif
/*
_PG_LODUMP
_H */
#endif
/*
PG_DUMPLO
_H */
contrib/pg_dumplo/utils.c
View file @
c2d1b391
/* -------------------------------------------------------------------------
* pg_dumplo
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/utils.c,v 1.2 2000/11/22 00:00:55 tgl Exp $
*
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
...
@@ -58,22 +68,6 @@ index_file(LODumpMaster *pgLO)
...
@@ -58,22 +68,6 @@ index_file(LODumpMaster *pgLO)
}
}
}
}
int
check_res
(
LODumpMaster
*
pgLO
)
{
if
(
!
pgLO
->
res
&&
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_COMMAND_OK
)
{
fprintf
(
stderr
,
"%s: %s
\n
"
,
progname
,
PQerrorMessage
(
pgLO
->
conn
));
PQclear
(
pgLO
->
res
);
return
FALSE
;
}
if
(
PQresultStatus
(
pgLO
->
res
)
!=
PGRES_TUPLES_OK
)
{
fprintf
(
stderr
,
"%s: Tuples is not OK.
\n
"
,
progname
);
PQclear
(
pgLO
->
res
);
return
FALSE
;
}
return
TRUE
;
}
static
static
void
Dummy_NoticeProcessor
(
void
*
arg
,
const
char
*
message
)
void
Dummy_NoticeProcessor
(
void
*
arg
,
const
char
*
message
)
{
{
...
...
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