aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/dbcommands.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2002-03-01 22:45:19 +0000
committerPeter Eisentraut <peter_e@gmx.net>2002-03-01 22:45:19 +0000
commit1aac2c852a2ccd817daf2dac99cf450e7822eb20 (patch)
tree905d452d101bd6ef6024d178261556ef7cd73470 /src/backend/commands/dbcommands.c
parent851f7661154f6de6dd0cfef5fec5aa7cce0a7ae8 (diff)
downloadpostgresql-1aac2c852a2ccd817daf2dac99cf450e7822eb20.tar.gz
postgresql-1aac2c852a2ccd817daf2dac99cf450e7822eb20.zip
User and database-specific session defaults for run-time configuration
variables. New commands ALTER DATABASE ... SET and ALTER USER ... SET.
Diffstat (limited to 'src/backend/commands/dbcommands.c')
-rw-r--r--src/backend/commands/dbcommands.c79
1 files changed, 78 insertions, 1 deletions
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 712df38ec51..3de94de9c6e 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.83 2002/02/24 20:20:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.84 2002/03/01 22:45:08 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -32,8 +32,10 @@
#include "miscadmin.h"
#include "storage/freespace.h"
#include "storage/sinval.h"
+#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
+#include "utils/guc.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"
@@ -287,6 +289,7 @@ createdb(const char *dbname, const char *dbowner,
DirectFunctionCall1(textin, CStringGetDatum(dbpath ? dbpath : ""));
memset(new_record_nulls, ' ', sizeof(new_record_nulls));
+ new_record_nulls[Anum_pg_database_datconfig - 1] = 'n';
tuple = heap_formtuple(pg_database_dsc, new_record, new_record_nulls);
@@ -447,6 +450,80 @@ dropdb(const char *dbname)
/*
+ * ALTER DATABASE name SET ...
+ */
+void
+AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
+{
+ char *valuestr;
+ HeapTuple tuple,
+ newtuple;
+ Relation rel;
+ ScanKeyData scankey;
+ HeapScanDesc scan;
+ Datum repl_val[Natts_pg_database];
+ char repl_null[Natts_pg_database];
+ char repl_repl[Natts_pg_database];
+ int i;
+
+ valuestr = (stmt->value
+ ? ((A_Const *) lfirst(stmt->value))->val.val.str
+ : NULL);
+
+ rel = heap_openr(DatabaseRelationName, RowExclusiveLock);
+ ScanKeyEntryInitialize(&scankey, 0, Anum_pg_database_datname,
+ F_NAMEEQ, NameGetDatum(stmt->dbname));
+ scan = heap_beginscan(rel, 0, SnapshotNow, 1, &scankey);
+ tuple = heap_getnext(scan, 0);
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "database \"%s\" does not exist", stmt->dbname);
+
+ if (!(superuser()
+ || ((Form_pg_database) GETSTRUCT(tuple))->datdba == GetUserId()))
+ elog(ERROR, "permission denied");
+
+ for (i = 0; i < Natts_pg_database; i++)
+ repl_repl[i] = ' ';
+
+ repl_repl[Anum_pg_database_datconfig-1] = 'r';
+ if (strcmp(stmt->variable, "all")==0 && stmt->value == NULL)
+ /* RESET ALL */
+ repl_null[Anum_pg_database_datconfig-1] = 'n';
+ else
+ {
+ Datum datum;
+ bool isnull;
+ ArrayType *a;
+
+ repl_null[Anum_pg_database_datconfig-1] = ' ';
+
+ datum = heap_getattr(tuple, Anum_pg_database_datconfig,
+ RelationGetDescr(rel), &isnull);
+
+ if (valuestr)
+ a = GUCArrayAdd(isnull
+ ? NULL
+ : (ArrayType *) pg_detoast_datum((struct varlena *)datum),
+ stmt->variable, valuestr);
+ else
+ a = GUCArrayDelete(isnull
+ ? NULL
+ : (ArrayType *) pg_detoast_datum((struct varlena *)datum),
+ stmt->variable);
+
+ repl_val[Anum_pg_database_datconfig-1] = PointerGetDatum(a);
+ }
+
+ newtuple = heap_modifytuple(tuple, rel, repl_val, repl_null, repl_repl);
+ simple_heap_update(rel, &tuple->t_self, newtuple);
+
+ heap_endscan(scan);
+ heap_close(rel, RowExclusiveLock);
+}
+
+
+
+/*
* Helper functions
*/