PostgreSQL源码分析——CREATE DATABASE
在PostgreSQL中,CREATE DATABASE
命令用于创建一个新的数据库。这个命令的核心功能在代码中主要体现在src/backend/commands/dbcommands.c
文件中的CreateDatabase
函数。
以下是一个简化的代码实例,展示了如何在PostgreSQL源代码中创建一个新的数据库:
#include "postgres.h"
#include "catalog/pg_database.h"
#include "commands/dbcommands.h"
#include "storage/fd.h"
/* ... */
void
CreateDatabase(const char *dbName,
PGDatabaseConf *conf,
const char *encoding)
{
HeapTuple tuple;
Datum values[Natts_pg_database];
bool nulls[Natts_pg_database];
NameData datname;
Oid datdba;
int fileFlags = 0;
Oid datOid;
/* ... */
/* Check the encoding */
if (!EncodingExists(encoding))
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("encoding \"%s\" does not exist", encoding)));
/* ... */
/* Form a new tuple */
memset(values, 0, sizeof(values));
memset(nulls, false, sizeof(nulls));
values[Anum_pg_database_datname - 1] = NameGetDatum(&datname);
values[Anum_pg_database_datdba - 1] = ObjectIdGetDatum(datdba);
values[Anum_pg_database_encoding - 1] = CStringGetDatum(encoding);
nulls[Anum_pg_database_datcollate - 1] = true;
nulls[Anum_pg_database_datctype - 1] = true;
nulls[Anum_pg_database_datistemplate - 1] = false;
nulls[Anum_pg_database_datallowconn - 1] = false;
nulls[Anum_pg_database_datconnlimit - 1] = true;
nulls[Anum_pg_database_datlastsysoid - 1] = false;
nulls[Anum_pg_database_datfrozenxid - 1] = false;
nulls[Anum_pg_database_dattablespace - 1] = true;
nulls[Anum_pg_database_datpgaxattr - 1] = true;
tuple = heap_form_tuple(RelationGetDescr(pg_database_rel), values, nulls);
/* ... */
/* Insert the tuple into pg_database */
datOid = simple_heap_insert(pg_database_rel, tuple);
/* ... */
/* Update indexes */
CatalogUpdateIndexes(pg_database_rel, tuple);
/* ... */
/* Close the relation and release lock */
heap_close(pg_database_rel, NoLock);
/* ... */
}
/* ... */
这个函数首先检查数据库的名字和编码是否存在,然后创建一个新的HeapTuple
来表示将要插入pg_database
表的数据库记录。之后,它使用simple_heap_insert
函数在pg_database
中插入这条记录,并更新相关的索引。最后,
评论已关闭