7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/parser/Attic/dbcommands.c,v 1.9 1997/09/08 21:46:07 momjian Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/parser/Attic/dbcommands.c,v 1.10 1997/11/07 06:37:55 thomas Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
14
14
#include <stdio.h>
15
15
#include <string.h>
16
16
#include <signal.h>
17
+ #include <sys/stat.h>
17
18
18
19
#include "postgres.h"
19
20
#include "miscadmin.h" /* for DataDir */
36
37
37
38
/* non-export function prototypes */
38
39
static void
39
- check_permissions (char * command , char * dbname ,
40
+ check_permissions (char * command , char * dbpath , char * dbname ,
40
41
Oid * dbIdP , Oid * userIdP );
41
42
static HeapTuple get_pg_dbtup (char * command , char * dbname , Relation dbrel );
42
- static void stop_vacuum (char * dbname );
43
+ static void stop_vacuum (char * dbpath , char * dbname );
43
44
44
45
void
45
- createdb (char * dbname )
46
+ createdb (char * dbname , char * dbpath )
46
47
{
47
48
Oid db_id ,
48
49
user_id ;
49
50
char buf [512 ];
51
+ char * lp ,
52
+ loc [512 ];
50
53
51
54
/*
52
55
* If this call returns, the database does not exist and we're allowed
53
56
* to create databases.
54
57
*/
55
- check_permissions ("createdb" , dbname , & db_id , & user_id );
58
+ check_permissions ("createdb" , dbpath , dbname , & db_id , & user_id );
56
59
57
60
/* close virtual file descriptors so we can do system() calls */
58
61
closeAllVfds ();
59
62
60
- sprintf (buf , "mkdir %s%cbase%c%s" , DataDir , SEP_CHAR , SEP_CHAR , dbname );
61
- system (buf );
62
- sprintf (buf , "%s %s%cbase%ctemplate1%c* %s%cbase%c%s" ,
63
- COPY_CMD , DataDir , SEP_CHAR , SEP_CHAR , SEP_CHAR , DataDir ,
64
- SEP_CHAR , SEP_CHAR , dbname );
63
+ /* Now create directory for this new database */
64
+ if ((dbpath != NULL ) && (strcmp (dbpath ,dbname ) != 0 ))
65
+ {
66
+ if (* (dbpath + strlen (dbpath )- 1 ) == SEP_CHAR )
67
+ * (dbpath + strlen (dbpath )- 1 ) = '\0' ;
68
+ sprintf (loc , "%s%c%s" , dbpath , SEP_CHAR , dbname );
69
+ }
70
+ else
71
+ {
72
+ strcpy (loc , dbname );
73
+ }
74
+
75
+ lp = ExpandDatabasePath (loc );
76
+
77
+ if (mkdir (lp ,S_IRWXU ) != 0 )
78
+ elog (WARN ,"Unable to create database directory %s" ,lp );
79
+
80
+ sprintf (buf , "%s %s%cbase%ctemplate1%c* %s" ,
81
+ COPY_CMD , DataDir , SEP_CHAR , SEP_CHAR , SEP_CHAR , lp );
65
82
system (buf );
66
83
67
- /* sprintf(buf, "insert into pg_database (datname, datdba, datpath) \
68
- values (\'%s\'::char16, \'%d\'::oid, \'%s\'::text);",
69
- dbname, user_id, dbname);
70
- */
84
+ #if FALSE
71
85
sprintf (buf , "insert into pg_database (datname, datdba, datpath) \
72
- values (\'%s\', \'%d\', \'%s\');" ,
86
+ values (\'%s\'::char16 , \'%d\'::oid , \'%s\'::text );" ,
73
87
dbname , user_id , dbname );
88
+ #endif
89
+
90
+ sprintf (buf , "insert into pg_database (datname, datdba, datpath)"
91
+ " values (\'%s\', \'%d\', \'%s\');" , dbname , user_id , loc );
74
92
75
93
pg_eval (buf , (char * * ) NULL , (Oid * ) NULL , 0 );
76
94
}
@@ -80,21 +98,57 @@ destroydb(char *dbname)
80
98
{
81
99
Oid user_id ,
82
100
db_id ;
101
+ char * path ;
102
+ char dbpath [MAXPGPATH + 1 ];
83
103
char buf [512 ];
104
+ char loc [512 ];
105
+ text * dbtext ;
106
+
107
+ Relation dbrel ;
108
+ HeapTuple dbtup ;
84
109
85
110
/*
86
111
* If this call returns, the database exists and we're allowed to
87
112
* remove it.
88
113
*/
89
- check_permissions ("destroydb" , dbname , & db_id , & user_id );
114
+ check_permissions ("destroydb" , dbpath , dbname , & db_id , & user_id );
90
115
91
116
if (!OidIsValid (db_id ))
92
117
{
93
118
elog (FATAL , "impossible: pg_database instance with invalid OID." );
94
119
}
95
120
96
121
/* stop the vacuum daemon */
97
- stop_vacuum (dbname );
122
+ stop_vacuum (dbpath , dbname );
123
+
124
+ #if FALSE
125
+ dbrel = heap_openr (DatabaseRelationName );
126
+ if (!RelationIsValid (dbrel ))
127
+ elog (FATAL , "%s: cannot open relation \"%-.*s\"" ,
128
+ "destroydb" , DatabaseRelationName );
129
+
130
+ dbtup = get_pg_dbtup ("destroydb" , dbname , dbrel );
131
+
132
+ if (!HeapTupleIsValid (dbtup ))
133
+ elog (NOTICE ,"destroydb: pg_database entry not found %s" ,dbname );
134
+
135
+ dbtext = (text * ) heap_getattr (dbtup , InvalidBuffer ,
136
+ Anum_pg_database_datpath ,
137
+ RelationGetTupleDescriptor (dbrel ),
138
+ (char * ) NULL );
139
+ memcpy (loc , VARDATA (dbtext ), (VARSIZE (dbtext )- VARHDRSZ ));
140
+ * (loc + (VARSIZE (dbtext )- VARHDRSZ )) = '\0' ;
141
+
142
+ #if FALSE
143
+ if (* loc != SEP_CHAR )
144
+ {
145
+ sprintf (buf , "%s/base/%s" , DataDir , loc );
146
+ strcpy (loc , buf );
147
+ }
148
+ #endif
149
+
150
+ heap_close (dbrel );
151
+ #endif
98
152
99
153
/*
100
154
* remove the pg_database tuple FIRST, this may fail due to
@@ -108,7 +162,9 @@ destroydb(char *dbname)
108
162
* remove the data directory. If the DELETE above failed, this will
109
163
* not be reached
110
164
*/
111
- sprintf (buf , "rm -r %s/base/%s" , DataDir , dbname );
165
+ path = ExpandDatabasePath (dbpath );
166
+
167
+ sprintf (buf , "rm -r %s" , path );
112
168
system (buf );
113
169
114
170
/* drop pages for this database that are in the shared buffer cache */
@@ -160,6 +216,7 @@ get_pg_dbtup(char *command, char *dbname, Relation dbrel)
160
216
161
217
static void
162
218
check_permissions (char * command ,
219
+ char * dbpath ,
163
220
char * dbname ,
164
221
Oid * dbIdP ,
165
222
Oid * userIdP )
@@ -172,6 +229,8 @@ check_permissions(char *command,
172
229
bool dbfound ;
173
230
bool use_super ;
174
231
char * userName ;
232
+ text * dbtext ;
233
+ char path [MAXPGPATH + 1 ];
175
234
176
235
userName = GetPgUserName ();
177
236
utup = SearchSysCacheTuple (USENAME , PointerGetDatum (userName ),
@@ -228,6 +287,13 @@ check_permissions(char *command,
228
287
RelationGetTupleDescriptor (dbrel ),
229
288
(char * ) NULL );
230
289
* dbIdP = dbtup -> t_oid ;
290
+ dbtext = (text * ) heap_getattr (dbtup , InvalidBuffer ,
291
+ Anum_pg_database_datpath ,
292
+ RelationGetTupleDescriptor (dbrel ),
293
+ (char * ) NULL );
294
+
295
+ strncpy (path , VARDATA (dbtext ), (VARSIZE (dbtext )- VARHDRSZ ));
296
+ * (path + VARSIZE (dbtext )- VARHDRSZ ) = '\0' ;
231
297
}
232
298
else
233
299
{
@@ -259,21 +325,31 @@ check_permissions(char *command,
259
325
elog (WARN , "%s: database %s is not owned by you." , command , dbname );
260
326
261
327
}
262
- }
328
+
329
+ if (dbfound && !strcmp (command , "destroydb" ))
330
+ strcpy (dbpath , path );
331
+ } /* check_permissions() */
263
332
264
333
/*
265
- * stop_vacuum() -- stop the vacuum daemon on the database, if one is
266
- * running.
334
+ * stop_vacuum() -- stop the vacuum daemon on the database, if one is running.
267
335
*/
268
336
static void
269
- stop_vacuum (char * dbname )
337
+ stop_vacuum (char * dbpath , char * dbname )
270
338
{
271
339
char filename [256 ];
272
340
FILE * fp ;
273
341
int pid ;
274
342
275
- sprintf (filename , "%s%cbase%c%s%c%s.vacuum" , DataDir , SEP_CHAR , SEP_CHAR ,
343
+ if (strchr (dbpath , SEP_CHAR ) != 0 )
344
+ {
345
+ sprintf (filename , "%s%cbase%c%s%c%s.vacuum" , DataDir , SEP_CHAR , SEP_CHAR ,
276
346
dbname , SEP_CHAR , dbname );
347
+ }
348
+ else
349
+ {
350
+ sprintf (filename , "%s%c%s.vacuum" , dbpath , SEP_CHAR , dbname );
351
+ }
352
+
277
353
if ((fp = AllocateFile (filename , "r" )) != NULL )
278
354
{
279
355
fscanf (fp , "%d" , & pid );
0 commit comments