Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postgres/src/bin/scripts/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 7 kB image not shown  

Quelle  clusterdb.c

  Sprache: C
 

/*-------------------------------------------------------------------------
 *
 * clusterdb
 *
 * Portions Copyright (c) 2002-2025, PostgreSQL Global Development Group
 *
 * src/bin/scripts/clusterdb.c
 *
 *-------------------------------------------------------------------------
 */


#include "postgres_fe.h"
#include "common.h"
#include "common/logging.h"
#include "fe_utils/cancel.h"
#include "fe_utils/option_utils.h"
#include "fe_utils/query_utils.h"
#include "fe_utils/simple_list.h"


static void cluster_one_database(const ConnParams *cparams, const char *table,
         const char *progname, bool verbose, bool echo);
static void cluster_all_databases(ConnParams *cparams, SimpleStringList *tables,
          const char *progname, bool verbose, bool echo,
          bool quiet);
static void help(const char *progname);


int
main(int argc, char *argv[])
{
 static struct option long_options[] = {
  {"host", required_argument, NULL, 'h'},
  {"port", required_argument, NULL, 'p'},
  {"username", required_argument, NULL, 'U'},
  {"no-password", no_argument, NULL, 'w'},
  {"password", no_argument, NULL, 'W'},
  {"echo", no_argument, NULL, 'e'},
  {"quiet", no_argument, NULL, 'q'},
  {"dbname", required_argument, NULL, 'd'},
  {"all", no_argument, NULL, 'a'},
  {"table", required_argument, NULL, 't'},
  {"verbose", no_argument, NULL, 'v'},
  {"maintenance-db", required_argument, NULL, 2},
  {NULL, 0, NULL, 0}
 };

 const char *progname;
 int   optindex;
 int   c;

 const char *dbname = NULL;
 const char *maintenance_db = NULL;
 char    *host = NULL;
 char    *port = NULL;
 char    *username = NULL;
 enum trivalue prompt_password = TRI_DEFAULT;
 ConnParams cparams;
 bool  echo = false;
 bool  quiet = false;
 bool  alldb = false;
 bool  verbose = false;
 SimpleStringList tables = {NULL, NULL};

 pg_logging_init(argv[0]);
 progname = get_progname(argv[0]);
 set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));

 handle_help_version_opts(argc, argv, "clusterdb", help);

 while ((c = getopt_long(argc, argv, "ad:eh:p:qt:U:vwW", long_options, &optindex)) != -1)
 {
  switch (c)
  {
   case 'a':
    alldb = true;
    break;
   case 'd':
    dbname = pg_strdup(optarg);
    break;
   case 'e':
    echo = true;
    break;
   case 'h':
    host = pg_strdup(optarg);
    break;
   case 'p':
    port = pg_strdup(optarg);
    break;
   case 'q':
    quiet = true;
    break;
   case 't':
    simple_string_list_append(&tables, optarg);
    break;
   case 'U':
    username = pg_strdup(optarg);
    break;
   case 'v':
    verbose = true;
    break;
   case 'w':
    prompt_password = TRI_NO;
    break;
   case 'W':
    prompt_password = TRI_YES;
    break;
   case 2:
    maintenance_db = pg_strdup(optarg);
    break;
   default:
    /* getopt_long already emitted a complaint */
    pg_log_error_hint("Try \"%s --help\" for more information.", progname);
    exit(1);
  }
 }

 /*
  * Non-option argument specifies database name as long as it wasn't
  * already specified with -d / --dbname
 */

 if (optind < argc && dbname == NULL)
 {
  dbname = argv[optind];
  optind++;
 }

 if (optind < argc)
 {
  pg_log_error("too many command-line arguments (first is \"%s\")",
      argv[optind]);
  pg_log_error_hint("Try \"%s --help\" for more information.", progname);
  exit(1);
 }

 /* fill cparams except for dbname, which is set below */
 cparams.pghost = host;
 cparams.pgport = port;
 cparams.pguser = username;
 cparams.prompt_password = prompt_password;
 cparams.override_dbname = NULL;

 setup_cancel_handler(NULL);

 if (alldb)
 {
  if (dbname)
   pg_fatal("cannot cluster all databases and a specific one at the same time");

  cparams.dbname = maintenance_db;

  cluster_all_databases(&cparams, &tables,
         progname, verbose, echo, quiet);
 }
 else
 {
  if (dbname == NULL)
  {
   if (getenv("PGDATABASE"))
    dbname = getenv("PGDATABASE");
   else if (getenv("PGUSER"))
    dbname = getenv("PGUSER");
   else
    dbname = get_user_name_or_exit(progname);
  }

  cparams.dbname = dbname;

  if (tables.head != NULL)
  {
   SimpleStringListCell *cell;

   for (cell = tables.head; cell; cell = cell->next)
   {
    cluster_one_database(&cparams, cell->val,
          progname, verbose, echo);
   }
  }
  else
   cluster_one_database(&cparams, NULL,
         progname, verbose, echo);
 }

 exit(0);
}


static void
cluster_one_database(const ConnParams *cparams, const char *table,
      const char *progname, bool verbose, bool echo)
{
 PQExpBufferData sql;

 PGconn    *conn;

 conn = connectDatabase(cparams, progname, echo, falsetrue);

 initPQExpBuffer(&sql);

 appendPQExpBufferStr(&sql, "CLUSTER");
 if (verbose)
  appendPQExpBufferStr(&sql, " VERBOSE");
 if (table)
 {
  appendPQExpBufferChar(&sql, ' ');
  appendQualifiedRelation(&sql, table, conn, echo);
 }
 appendPQExpBufferChar(&sql, ';');

 if (!executeMaintenanceCommand(conn, sql.data, echo))
 {
  if (table)
   pg_log_error("clustering of table \"%s\" in database \"%s\" failed: %s",
       table, PQdb(conn), PQerrorMessage(conn));
  else
   pg_log_error("clustering of database \"%s\" failed: %s",
       PQdb(conn), PQerrorMessage(conn));
  PQfinish(conn);
  exit(1);
 }
 PQfinish(conn);
 termPQExpBuffer(&sql);
}


static void
cluster_all_databases(ConnParams *cparams, SimpleStringList *tables,
       const char *progname, bool verbose, bool echo,
       bool quiet)
{
 PGconn    *conn;
 PGresult   *result;
 int   i;

 conn = connectMaintenanceDatabase(cparams, progname, echo);
 result = executeQuery(conn,
        "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
        echo);
 PQfinish(conn);

 for (i = 0; i < PQntuples(result); i++)
 {
  char    *dbname = PQgetvalue(result, i, 0);

  if (!quiet)
  {
   printf(_("%s: clustering database \"%s\"\n"), progname, dbname);
   fflush(stdout);
  }

  cparams->override_dbname = dbname;

  if (tables->head != NULL)
  {
   SimpleStringListCell *cell;

   for (cell = tables->head; cell; cell = cell->next)
    cluster_one_database(cparams, cell->val,
          progname, verbose, echo);
  }
  else
   cluster_one_database(cparams, NULL,
         progname, verbose, echo);
 }

 PQclear(result);
}


static void
help(const char *progname)
{
 printf(_("%s clusters all previously clustered tables in a database.\n\n"), progname);
 printf(_("Usage:\n"));
 printf(_("  %s [OPTION]... [DBNAME]\n"), progname);
 printf(_("\nOptions:\n"));
 printf(_("  -a, --all                 cluster all databases\n"));
 printf(_("  -d, --dbname=DBNAME       database to cluster\n"));
 printf(_("  -e, --echo                show the commands being sent to the server\n"));
 printf(_("  -q, --quiet               don't write any messages\n"));
 printf(_("  -t, --table=TABLE         cluster specific table(s) only\n"));
 printf(_("  -v, --verbose             write a lot of output\n"));
 printf(_("  -V, --version             output version information, then exit\n"));
 printf(_("  -?, --help                show this help, then exit\n"));
 printf(_("\nConnection options:\n"));
 printf(_("  -h, --host=HOSTNAME       database server host or socket directory\n"));
 printf(_("  -p, --port=PORT           database server port\n"));
 printf(_("  -U, --username=USERNAME   user name to connect as\n"));
 printf(_("  -w, --no-password         never prompt for password\n"));
 printf(_("  -W, --password            force password prompt\n"));
 printf(_("  --maintenance-db=DBNAME   alternate maintenance database\n"));
 printf(_("\nRead the description of the SQL command CLUSTER for details.\n"));
 printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
 printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
}

Messung V0.5 in Prozent
C=94 H=94 G=93

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.