SVN Commit by andreas: r4474 - trunk/pgadmin3/xtra/admin81 - Mailing list pgadmin-hackers

From svn@pgadmin.org
Subject SVN Commit by andreas: r4474 - trunk/pgadmin3/xtra/admin81
Date
Msg-id 200509291645.j8TGjxFr011075@developer.pgadmin.org
Whole thread Raw
List pgadmin-hackers
Author: andreas
Date: 2005-09-29 17:45:58 +0100 (Thu, 29 Sep 2005)
New Revision: 4474

Modified:
   trunk/pgadmin3/xtra/admin81/README.admin81
   trunk/pgadmin3/xtra/admin81/admin81.c
   trunk/pgadmin3/xtra/admin81/admin81.sql.in
Log:
Admin81 for pgsql81

Modified: trunk/pgadmin3/xtra/admin81/README.admin81
===================================================================
--- trunk/pgadmin3/xtra/admin81/README.admin81    2005-09-27 09:09:14 UTC (rev 4473)
+++ trunk/pgadmin3/xtra/admin81/README.admin81    2005-09-29 16:45:58 UTC (rev 4474)
@@ -19,19 +19,31 @@
 make
 make install

-pgAdmin will look for the functions in the Initial Database specified in the
-connection dialogue for the server. To install the functions in the database,
-either run the admin81.sql script using the pgAdmin SQL tool (and then
-restart pgAdmin), or run the script using psql, eg:
+pgAdmin will look for the functions in the Maintenance Database (usually
+"postgres" for 8.1 servers) specified in the connection dialogue for the server.
+To install the functions in the database, either run the admin81.sql script using
+the pgAdmin SQL tool (and then close and reopen the connection to the freshly
+instrumented server), or run the script using psql, eg:

-psql -u postgres template1 < admin81.sql
+psql -u postgres postgres < admin81.sql

 On PostgreSQL 8.1 or above, you should use the admin81.sql script.

 Objects implemented (superuser only)
 ====================================

-int8 pg_file_write(fname text, data text, append bool)
-bool pg_file_rename(oldname text, newname text)
-bool pg_file_rename(oldname text, newname text, archivname text)
-bool pg_file_unlink(fname text)
+int8 pg_catalog.pg_file_write(fname text, data text, append bool)
+int8 pg_catalog.pg_file_read(fname text, data text, append bool)
+bool pg_catalog.pg_file_rename(oldname text, newname text)
+bool pg_catalog.pg_file_rename(oldname text, newname text, archivname text)
+bool pg_catalog.pg_file_unlink(fname text)
+bigint pg_catalog.pg_file_size(text)
+int4 pg_catalog.pg_logfile_rotate()
+setof record pg_catalog.pg_logdir_ls()
+
+
+These functions implement full instrumentation for PostgreSQL 8.1 servers when
+accessed using pgAdmin III V1.4 and above. For pgAdmin III V1.2, the additional
+view pg_logdir_ls is necessary (available from the admin81.sql script, commented
+out in the last section). We recommend omitting this deprecated view, and
+upgrade to pgAdmin III V1.4 instead.

Modified: trunk/pgadmin3/xtra/admin81/admin81.c
===================================================================
--- trunk/pgadmin3/xtra/admin81/admin81.c    2005-09-27 09:09:14 UTC (rev 4473)
+++ trunk/pgadmin3/xtra/admin81/admin81.c    2005-09-29 16:45:58 UTC (rev 4474)
@@ -23,6 +23,7 @@
 #include "storage/fd.h"
 #include "catalog/pg_type.h"
 #include "funcapi.h"
+#include "utils/datetime.h"


 #ifdef WIN32
@@ -39,14 +40,17 @@

 extern DLLIMPORT char *DataDir;
 extern DLLIMPORT char *Log_directory;
+extern DLLIMPORT char *Log_filename;

 Datum pg_file_write(PG_FUNCTION_ARGS);
 Datum pg_file_rename(PG_FUNCTION_ARGS);
 Datum pg_file_unlink(PG_FUNCTION_ARGS);
+Datum pg_logdir_ls(PG_FUNCTION_ARGS);

 PG_FUNCTION_INFO_V1(pg_file_write);
 PG_FUNCTION_INFO_V1(pg_file_rename);
 PG_FUNCTION_INFO_V1(pg_file_unlink);
+PG_FUNCTION_INFO_V1(pg_logdir_ls);

 typedef struct
 {
@@ -280,3 +284,107 @@
     PG_RETURN_BOOL(true);
 }

+
+Datum pg_logdir_ls(PG_FUNCTION_ARGS)
+{
+    FuncCallContext *funcctx;
+    struct dirent *de;
+    directory_fctx *fctx;
+
+    if (!superuser())
+        ereport(ERROR,
+                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                 (errmsg("only superuser can list the log directory"))));
+
+    if (memcmp(Log_filename, "postgresql-%Y-%m-%d_%H%M%S.log", 30) != 0)
+        ereport(ERROR,
+                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                 (errmsg("the log_filename parameter must equal 'postgresql-%%Y-%%m-%%d_%%H%%M%%S.log'"))));
+
+    if (SRF_IS_FIRSTCALL())
+    {
+        MemoryContext oldcontext;
+        TupleDesc tupdesc;
+
+        funcctx=SRF_FIRSTCALL_INIT();
+        oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+        fctx = palloc(sizeof(directory_fctx));
+        if (is_absolute_path(Log_directory))
+            fctx->location = Log_directory;
+        else
+        {
+            fctx->location = palloc(strlen(DataDir) + strlen(Log_directory) +2);
+            sprintf(fctx->location, "%s/%s", DataDir, Log_directory);
+        }
+        tupdesc = CreateTemplateTupleDesc(2, false);
+        TupleDescInitEntry(tupdesc, (AttrNumber) 1, "starttime",
+                           TIMESTAMPOID, -1, 0);
+        TupleDescInitEntry(tupdesc, (AttrNumber) 2, "filename",
+                           TEXTOID, -1, 0);
+
+        funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+        fctx->dirdesc = AllocateDir(fctx->location);
+
+        if (!fctx->dirdesc)
+            ereport(ERROR,
+                    (errcode_for_file_access(),
+                     errmsg("%s is not browsable: %m", fctx->location)));
+
+        funcctx->user_fctx = fctx;
+        MemoryContextSwitchTo(oldcontext);
+    }
+
+    funcctx=SRF_PERCALL_SETUP();
+    fctx = (directory_fctx*) funcctx->user_fctx;
+
+    if (!fctx->dirdesc)  /* not a readable directory  */
+        SRF_RETURN_DONE(funcctx);
+
+    while ((de = readdir(fctx->dirdesc)) != NULL)
+    {
+        char *values[2];
+        HeapTuple tuple;
+
+        char           *field[MAXDATEFIELDS];
+        char        lowstr[MAXDATELEN + 1];
+        int        dtype;
+        int        nf, ftype[MAXDATEFIELDS];
+        fsec_t        fsec;
+        int        tz = 0;
+        struct         pg_tm date;
+
+        /*
+         * Default format:
+         *        postgresql-YYYY-MM-DD_HHMMSS.log
+         */
+        if (strlen(de->d_name) != 32
+            || memcmp(de->d_name, "postgresql-", 11)
+            || de->d_name[21] != '_'
+            || strcmp(de->d_name + 28, ".log"))
+              continue;
+
+        values[1] = palloc(strlen(fctx->location) + strlen(de->d_name) + 2);
+        sprintf(values[1], "%s/%s", fctx->location, de->d_name);
+
+        values[0] = de->d_name + 11;       /* timestamp */
+        values[0][17] = 0;
+
+                    /* parse and decode expected timestamp */
+        if (ParseDateTime(values[0], lowstr, MAXDATELEN, field, ftype, MAXDATEFIELDS, &nf))
+            continue;
+
+        if (DecodeDateTime(field, ftype, nf, &dtype, &date, &fsec, &tz))
+            continue;
+
+        /* Seems the format fits the expected format; feed it into the tuple */
+
+        tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
+
+        SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+    }
+
+    FreeDir(fctx->dirdesc);
+    SRF_RETURN_DONE(funcctx);
+}

Modified: trunk/pgadmin3/xtra/admin81/admin81.sql.in
===================================================================
--- trunk/pgadmin3/xtra/admin81/admin81.sql.in    2005-09-27 09:09:14 UTC (rev 4473)
+++ trunk/pgadmin3/xtra/admin81/admin81.sql.in    2005-09-29 16:45:58 UTC (rev 4474)
@@ -4,18 +4,50 @@

 /* generic file access functions (genfile.c) */

-CREATE FUNCTION pg_file_write(text, text, bool) RETURNS bigint
+CREATE FUNCTION pg_catalog.pg_file_write(text, text, bool) RETURNS bigint
    AS 'MODULE_PATHNAME', 'pg_file_write'
     LANGUAGE C VOLATILE STRICT;

-CREATE FUNCTION pg_file_rename(text, text, text) RETURNS bool
+CREATE FUNCTION pg_catalog.pg_file_rename(text, text, text) RETURNS bool
    AS 'MODULE_PATHNAME', 'pg_file_rename'
     LANGUAGE C VOLATILE;

-CREATE FUNCTION pg_file_unlink(text) RETURNS bool
+CREATE FUNCTION pg_catalog.pg_file_unlink(text) RETURNS bool
    AS 'MODULE_PATHNAME', 'pg_file_unlink'
     LANGUAGE C VOLATILE STRICT;

-CREATE FUNCTION pg_file_rename(text, text) RETURNS bool
+CREATE FUNCTION pg_catalog.pg_file_rename(text, text) RETURNS bool
    AS 'SELECT pg_file_rename($1, $2, NULL); '
     LANGUAGE SQL VOLATILE STRICT;
+
+CREATE FUNCTION pg_catalog.pg_logdir_ls() RETURNS setof record
+   AS 'MODULE_PATHNAME', 'pg_logdir_ls'
+    LANGUAGE C VOLATILE STRICT;
+
+
+/* compatibility redefines */
+
+CREATE FUNCTION pg_catalog.pg_logfile_rotate() RETURNS int4
+  AS 'pg_rotate_logfile'
+   LANGUAGE INTERNAL VOLATILE STRICT;
+
+CREATE FUNCTION pg_catalog.pg_file_read(text, bigint, bigint) RETURNS text
+   AS 'pg_read_file'
+    LANGUAGE INTERNAL VOLATILE STRICT;
+
+CREATE FUNCTION pg_catalog.pg_file_size(text) RETURNS bigint
+   AS 'SELECT size FROM pg_stat_file($1)'
+    LANGUAGE SQL VOLATILE STRICT;
+
+
+/*
+
+-- if running pgAdmin 1.2 against this database,
+-- this view is used to access log files
+-- (1.3 and later won't need it).
+CREATE VIEW pg_logdir_ls AS
+    SELECT *
+    FROM pg_logdir_ls() AS A
+    (filetime timestamp, filename text);
+
+*/


pgadmin-hackers by date:

Previous
From: "Dave Page"
Date:
Subject: Re: cannot disable displaying of system objects
Next
From: svn@pgadmin.org
Date:
Subject: SVN Commit by andreas: r4475 - trunk/pgadmin3/xtra/admin81