1
1
/* -------------------------------------------------------------------------
2
2
* pg_dumplo
3
3
*
4
- * $PostgreSQL: pgsql/contrib/pg_dumplo/lo_export.c,v 1.12 2003 /11/29 19:51:35 pgsql Exp $
4
+ * $PostgreSQL: pgsql/contrib/pg_dumplo/lo_export.c,v 1.13 2004 /11/28 23:49:49 tgl Exp $
5
5
*
6
- * Karel Zak 1999-2000
6
+ * Karel Zak 1999-2004
7
7
* -------------------------------------------------------------------------
8
8
*/
9
9
@@ -29,7 +29,7 @@ load_lolist(LODumpMaster * pgLO)
29
29
LOlist * ll ;
30
30
int i ;
31
31
int n ;
32
-
32
+
33
33
/*
34
34
* Now find any candidate tables who have columns of type oid.
35
35
*
@@ -39,15 +39,16 @@ load_lolist(LODumpMaster * pgLO)
39
39
* NOTE: the system oid column is ignored, as it has attnum < 1. This
40
40
* shouldn't matter for correctness, but it saves time.
41
41
*/
42
- pgLO -> res = PQexec (pgLO -> conn ,
43
- "SELECT c.relname, a.attname "
44
- "FROM pg_class c, pg_attribute a, pg_type t "
42
+ pgLO -> res = PQexec (pgLO -> conn , "SELECT c.relname, a.attname, n.nspname "
43
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_attribute a, "
44
+ " pg_catalog. pg_type t, pg_catalog.pg_namespace n "
45
45
"WHERE a.attnum > 0 "
46
46
" AND a.attrelid = c.oid "
47
47
" AND a.atttypid = t.oid "
48
48
" AND t.typname = 'oid' "
49
49
" AND c.relkind = 'r' "
50
- " AND c.relname NOT LIKE 'pg_%'" );
50
+ " AND c.relname NOT LIKE 'pg_%' "
51
+ " AND n.oid = c.relnamespace" );
51
52
52
53
if (PQresultStatus (pgLO -> res ) != PGRES_TUPLES_OK )
53
54
{
@@ -63,6 +64,7 @@ load_lolist(LODumpMaster * pgLO)
63
64
}
64
65
65
66
pgLO -> lolist = (LOlist * ) malloc ((n + 1 ) * sizeof (LOlist ));
67
+ memset (pgLO -> lolist , 0 , (n + 1 ) * sizeof (LOlist ));
66
68
67
69
if (!pgLO -> lolist )
68
70
{
@@ -74,8 +76,8 @@ load_lolist(LODumpMaster * pgLO)
74
76
{
75
77
ll -> lo_table = strdup (PQgetvalue (pgLO -> res , i , 0 ));
76
78
ll -> lo_attr = strdup (PQgetvalue (pgLO -> res , i , 1 ));
79
+ ll -> lo_schema = strdup (PQgetvalue (pgLO -> res , i , 2 ));
77
80
}
78
- ll -> lo_table = ll -> lo_attr = (char * ) NULL ;
79
81
80
82
PQclear (pgLO -> res );
81
83
}
@@ -98,7 +100,7 @@ pglo_export(LODumpMaster * pgLO)
98
100
fprintf (pgLO -> index , "#\tHost: %s\n" , pgLO -> host );
99
101
fprintf (pgLO -> index , "#\tDatabase: %s\n" , pgLO -> db );
100
102
fprintf (pgLO -> index , "#\tUser: %s\n" , pgLO -> user );
101
- fprintf (pgLO -> index , "#\n# oid\ttable\tattribut\tinfile\n#\n" );
103
+ fprintf (pgLO -> index , "#\n# oid\ttable\tattribut\tinfile\tschema\ n#\n" );
102
104
}
103
105
104
106
pgLO -> counter = 0 ;
@@ -109,8 +111,9 @@ pglo_export(LODumpMaster * pgLO)
109
111
* Query: find the LOs referenced by this column
110
112
*/
111
113
snprintf (Qbuff , QUERY_BUFSIZ ,
112
- "SELECT DISTINCT l.loid FROM \"%s\" x, pg_largeobject l WHERE x.\"%s\" = l.loid" ,
113
- ll -> lo_table , ll -> lo_attr );
114
+ "SELECT DISTINCT l.loid FROM \"%s\".\"%s\" x, pg_catalog.pg_largeobject l "
115
+ "WHERE x.\"%s\" = l.loid" ,
116
+ ll -> lo_schema , ll -> lo_table , ll -> lo_attr );
114
117
115
118
/* puts(Qbuff); */
116
119
@@ -124,8 +127,8 @@ pglo_export(LODumpMaster * pgLO)
124
127
else if ((tuples = PQntuples (pgLO -> res )) == 0 )
125
128
{
126
129
if (!pgLO -> quiet && pgLO -> action == ACTION_EXPORT_ATTR )
127
- printf ("%s: no large objects in \"%s\".\"%s\"\n" ,
128
- progname , ll -> lo_table , ll -> lo_attr );
130
+ printf ("%s: no large objects in \"%s\".\"%s\".\"%s\" \n" ,
131
+ progname , ll -> lo_schema , ll -> lo_table , ll -> lo_attr );
129
132
}
130
133
else
131
134
{
@@ -140,7 +143,7 @@ pglo_export(LODumpMaster * pgLO)
140
143
{
141
144
142
145
snprintf (path , BUFSIZ , "%s/%s/%s" , pgLO -> space , pgLO -> db ,
143
- ll -> lo_table );
146
+ ll -> lo_schema );
144
147
145
148
if (mkdir (path , DIR_UMASK ) == -1 )
146
149
{
@@ -150,9 +153,21 @@ pglo_export(LODumpMaster * pgLO)
150
153
exit (RE_ERROR );
151
154
}
152
155
}
153
-
156
+
154
157
snprintf (path , BUFSIZ , "%s/%s/%s/%s" , pgLO -> space , pgLO -> db ,
155
- ll -> lo_table , ll -> lo_attr );
158
+ ll -> lo_schema , ll -> lo_table );
159
+
160
+ if (mkdir (path , DIR_UMASK ) == -1 )
161
+ {
162
+ if (errno != EEXIST )
163
+ {
164
+ perror (path );
165
+ exit (RE_ERROR );
166
+ }
167
+ }
168
+
169
+ snprintf (path , BUFSIZ , "%s/%s/%s/%s/%s" , pgLO -> space , pgLO -> db ,
170
+ ll -> lo_schema , ll -> lo_table , ll -> lo_attr );
156
171
157
172
if (mkdir (path , DIR_UMASK ) == -1 )
158
173
{
@@ -164,8 +179,8 @@ pglo_export(LODumpMaster * pgLO)
164
179
}
165
180
166
181
if (!pgLO -> quiet )
167
- printf ("dump %s.%s (%d large obj)\n" ,
168
- ll -> lo_table , ll -> lo_attr , tuples );
182
+ printf ("dump %s.%s.%s (%d large obj)\n" ,
183
+ ll -> lo_schema , ll -> lo_table , ll -> lo_attr , tuples );
169
184
}
170
185
171
186
pgLO -> counter += tuples ;
@@ -180,20 +195,22 @@ pglo_export(LODumpMaster * pgLO)
180
195
181
196
if (pgLO -> action == ACTION_SHOW )
182
197
{
183
- printf ("%s.%s: %u\n" , ll -> lo_table , ll -> lo_attr , lo );
198
+ printf ("%s.%s.%s : %u\n" , ll -> lo_schema , ll -> lo_table , ll -> lo_attr , lo );
184
199
continue ;
185
200
}
186
201
187
- snprintf (path , BUFSIZ , "%s/%s/%s/%s/%s" , pgLO -> space ,
188
- pgLO -> db , ll -> lo_table , ll -> lo_attr , val );
202
+ snprintf (path , BUFSIZ , "%s/%s/%s/%s/%s/%s " , pgLO -> space ,
203
+ pgLO -> db , ll -> lo_schema , ll -> lo_table , ll -> lo_attr , val );
189
204
190
205
if (lo_export (pgLO -> conn , lo , path ) < 0 )
191
206
fprintf (stderr , "%s: lo_export failed:\n%s" , progname ,
192
207
PQerrorMessage (pgLO -> conn ));
193
208
194
209
else
195
- fprintf (pgLO -> index , "%s\t%s\t%s\t%s/%s/%s/%s\n" , val ,
196
- ll -> lo_table , ll -> lo_attr , pgLO -> db , ll -> lo_table , ll -> lo_attr , val );
210
+ fprintf (pgLO -> index , "%s\t%s\t%s\t%s/%s/%s/%s/%s\t%s\n" ,
211
+ val , ll -> lo_table , ll -> lo_attr , pgLO -> db ,
212
+ ll -> lo_schema , ll -> lo_table , ll -> lo_attr ,
213
+ val , ll -> lo_schema );
197
214
}
198
215
}
199
216
0 commit comments