/*-------------------------------------------------------------------------
 *
 * pg_database.h
 *	  definition of the system "database" relation (pg_database)
 *	  along with the relation's initial contents.
 *
 *
 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * $PostgreSQL: pgsql/src/include/catalog/pg_database.h,v 1.42 2006/11/05 22:42:10 tgl Exp $
 *
 * NOTES
 *	  the genbki.sh script reads this file and generates .bki
 *	  information from the DATA() statements.
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_DATABASE_H
#define PG_DATABASE_H

#include "catalog/genbki.h"

/* TIDYCAT_BEGINFAKEDEF

   CREATE TABLE pg_database
   with (shared=true, relid=1262, toast_oid=2844, toast_index=2845)
   (
   datname        name, 
   datdba         oid, 
   encoding       integer, 
   datistemplate  boolean, 
   datallowconn   boolean, 
   datconnlimit   integer, 
   datlastsysoid  oid, 
   datfrozenxid   xid, 
   dattablespace  oid, 
   dat2tablespace  oid,
   datconfig      text[], 
   datacl         aclitem[]
   );

   create unique index on pg_database(datname) with (indexid=2671, CamelCase=DatabaseName);
   create unique index on pg_database(oid) with (indexid=2672, CamelCase=DatabaseOid, syscacheid=DATABASEOID, syscache_nbuckets=4);

   alter table pg_database add fk datdba on pg_authid(oid);
   alter table pg_database add fk dattablespace on pg_tablespace(oid);

   TIDYCAT_ENDFAKEDEF
*/

/* ----------------
 *		pg_database definition.  cpp turns this into
 *		typedef struct FormData_pg_database
 * ----------------
 */
#define DatabaseRelationId	1262

CATALOG(pg_database,1262) BKI_SHARED_RELATION
{
	NameData	datname;		/* database name */
	Oid			datdba;			/* owner of database */
	int4		encoding;		/* character encoding */
	bool		datistemplate;	/* allowed as CREATE DATABASE template? */
	bool		datallowconn;	/* new connections allowed? */
	int4		datconnlimit;	/* max connections allowed (-1=no limit) */
	Oid			datlastsysoid;	/* highest OID to consider a system OID */
	TransactionId datfrozenxid;	/* all Xids < this are frozen in this DB */
	Oid			dattablespace;	/* default table space for this DB */
	Oid			dat2tablespace;	/* default table space for this DB */
	text		datconfig[1];	/* database-specific GUC (VAR LENGTH) */
	aclitem		datacl[1];		/* access permissions (VAR LENGTH) */
} FormData_pg_database;

/* ----------------
 *		Form_pg_database corresponds to a pointer to a tuple with
 *		the format of pg_database relation.
 * ----------------
 */
typedef FormData_pg_database *Form_pg_database;

/* ----------------
 *		compiler constants for pg_database
 * ----------------
 */
#define Natts_pg_database				12
#define Anum_pg_database_datname		1
#define Anum_pg_database_datdba			2
#define Anum_pg_database_encoding		3
#define Anum_pg_database_datistemplate	4
#define Anum_pg_database_datallowconn	5
#define Anum_pg_database_datconnlimit	6
#define Anum_pg_database_datlastsysoid	7
#define Anum_pg_database_datfrozenxid	8
#define Anum_pg_database_dattablespace	9
#define Anum_pg_database_dat2tablespace	10
#define Anum_pg_database_datconfig		11
#define Anum_pg_database_datacl			12

DATA(insert OID = 1 (  template1 PGUID ENCODING t t -1 0 0 1663 1663 _null_ _null_ ));
SHDESCR("Default template database");
#define TemplateDbOid			1

#define HcatalogDbOid                   6120

#define HcatalogDbName "hcatalog"

#endif   /* PG_DATABASE_H */
