本文整理汇总了C++中pfree函数的典型用法代码示例。如果您正苦于以下问题:C++ pfree函数的具体用法?C++ pfree怎么用?C++ pfree使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pfree函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: fmtLogMsg
static void
fmtLogMsg(StringInfo dst, ErrorData *edata)
{
{
char formattedLogTime[FORMATTED_TS_LEN];
/* timestamp with milliseconds */
formatNow(formattedLogTime, sizeof formattedLogTime);
/*
* Always present, non-nullable; don't need to write the N/P
* header.
*/
appendStringInfoString(dst, formattedLogTime);
appendStringInfoChar(dst, '\0');
}
/* username */
if (MyProcPort)
appendStringInfoPtr(dst, MyProcPort->user_name);
else
appendStringInfoPtr(dst, NULL);
/* database name */
if (MyProcPort)
appendStringInfoPtr(dst, MyProcPort->database_name);
else
appendStringInfoPtr(dst, NULL);
/* Process id */
{
uint32_t nPid = htobe32(savedPid);
appendBinaryStringInfo(dst, (void *) &nPid, sizeof nPid);
}
/* Remote host and port */
if (MyProcPort && MyProcPort->remote_host)
{
/* 'present' string header, since this string is nullable */
appendStringInfoChar(dst, 'P');
appendStringInfoString(dst, MyProcPort->remote_host);
if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0')
{
appendStringInfoChar(dst, ':');
appendStringInfoString(dst, MyProcPort->remote_port);
}
appendStringInfoChar(dst, '\0');
}
else
appendStringInfoPtr(dst, NULL);
/* session id; non-nullable */
appendStringInfo(dst, "%lx.%x", (long) MyStartTime, MyProcPid);
appendStringInfoChar(dst, '\0');
/* Line number */
{
uint64_t nSeqNum = htobe64(seqNum);
appendBinaryStringInfo(dst, (void *) &nSeqNum, sizeof nSeqNum);
}
/* PS display */
if (MyProcPort)
{
StringInfoData msgbuf;
const char *psdisp;
int displen;
initStringInfo(&msgbuf);
psdisp = get_ps_display(&displen);
appendBinaryStringInfo(&msgbuf, psdisp, displen);
appendStringInfoChar(dst, 'P');
appendStringInfoString(dst, msgbuf.data);
appendStringInfoChar(dst, '\0');
pfree(msgbuf.data);
}
else
appendStringInfoPtr(dst, NULL);
/* session start timestamp */
if (cachedBackendStartTime[0] == '\0')
{
/* Rebuild the cache if it was blown */
reCacheBackendStartTime();
}
/* backend start time; non-nullable string */
appendStringInfoString(dst, cachedBackendStartTime);
appendStringInfoChar(dst, '\0');
/*
* Virtual transaction id
*
* keep VXID format in sync with lockfuncs.c
//.........这里部分代码省略.........
开发者ID:logplex,项目名称:pg_logfebe-debian,代码行数:101,代码来源:pg_logfebe.c
示例2: gp_aovisimap_hidden_info_internal
//.........这里部分代码省略.........
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
/*
* Collect all the locking information that we will format and send
* out as a result set.
*/
context = (Context *) palloc0(sizeof(Context));
context->parentRelation = heap_open(aoRelOid, AccessShareLock);
if (!(RelationIsAoRows(context->parentRelation) || RelationIsAoCols(context->parentRelation)))
{
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Function not supported on relation")));
}
if (RelationIsAoRows(context->parentRelation))
{
context->appendonlySegfileInfo = GetAllFileSegInfo(
context->parentRelation,
SnapshotNow,
&context->segfile_info_total);
}
else
{
Assert(RelationIsAoCols(context->parentRelation));
context->aocsSegfileInfo = GetAllAOCSFileSegInfo(context->parentRelation,
SnapshotNow, &context->segfile_info_total);
}
context->i = 0;
AppendOnlyVisimap_Init(&context->visiMap,
context->parentRelation->rd_appendonly->visimaprelid,
context->parentRelation->rd_appendonly->visimapidxid,
AccessShareLock,
SnapshotNow);
funcctx->user_fctx = (void *) context;
MemoryContextSwitchTo(oldcontext);
}
funcctx = SRF_PERCALL_SETUP();
context = (Context *) funcctx->user_fctx;
while (context->i < context->segfile_info_total)
{
int64 tupcount;
int segno;
if (context->appendonlySegfileInfo)
{
FileSegInfo *fsinfo = context->appendonlySegfileInfo[context->i];
tupcount = fsinfo->total_tupcount;
segno = fsinfo->segno;
}
else if (context->aocsSegfileInfo)
{
AOCSFileSegInfo *fsinfo = context->aocsSegfileInfo[context->i];
tupcount = fsinfo->total_tupcount;
segno = fsinfo->segno;
}
else
{
Insist(false);
}
MemSet(values, 0, sizeof(values));
MemSet(nulls, false, sizeof(nulls));
values[0] = Int32GetDatum(segno);
values[1] = Int64GetDatum(AppendOnlyVisimap_GetSegmentFileHiddenTupleCount(
&context->visiMap, segno));
values[2] = Int64GetDatum(tupcount);
tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
context->i++;
SRF_RETURN_NEXT(funcctx, result);
}
AppendOnlyVisimap_Finish(&context->visiMap, AccessShareLock);
if (context->appendonlySegfileInfo)
{
FreeAllSegFileInfo(context->appendonlySegfileInfo, context->segfile_info_total);
pfree(context->appendonlySegfileInfo);
context->appendonlySegfileInfo = NULL;
}
if (context->aocsSegfileInfo)
{
FreeAllAOCSSegFileInfo(context->aocsSegfileInfo, context->segfile_info_total);
pfree(context->aocsSegfileInfo);
context->aocsSegfileInfo = NULL;
}
heap_close(context->parentRelation, AccessShareLock);
pfree(context);
funcctx->user_fctx = NULL;
SRF_RETURN_DONE(funcctx);
}
开发者ID:phan-pivotal,项目名称:gpdb,代码行数:101,代码来源:appendonly_visimap_udf.c
示例3: gp_aovisimap_entry_internal
//.........这里部分代码省略.........
FuncCallContext *funcctx;
Context *context;
if (SRF_IS_FIRSTCALL())
{
TupleDesc tupdesc;
MemoryContext oldcontext;
/* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();
/*
* switch to memory context appropriate for multiple function
* calls
*/
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
/* build tupdesc for result tuples */
tupdesc = CreateTemplateTupleDesc(4, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "segno",
INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "first_row_num",
INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 3, "hidden_tupcount",
INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) 4, "bitmap",
TEXTOID, -1, 0);
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
/*
* Collect all the locking information that we will format and send
* out as a result set.
*/
context = (Context *) palloc0(sizeof(Context));
context->parentRelation = heap_open(aoRelOid, AccessShareLock);
if (!(RelationIsAoRows(context->parentRelation) || RelationIsAoCols(context->parentRelation)))
{
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Function not supported on relation")));
}
AppendOnlyVisimap_Init(&context->visiMap,
context->parentRelation->rd_appendonly->visimaprelid,
context->parentRelation->rd_appendonly->visimapidxid,
AccessShareLock,
SnapshotNow);
context->indexScan = AppendOnlyVisimapStore_BeginScan(&
context->visiMap.visimapStore, 0, NULL);
context->bitmapBuffer = palloc0(VARHDRSZ + APPENDONLY_VISIMAP_MAX_RANGE + 1);
funcctx->user_fctx = (void *) context;
MemoryContextSwitchTo(oldcontext);
}
funcctx = SRF_PERCALL_SETUP();
context = (Context *) funcctx->user_fctx;
if (AppendOnlyVisimapStore_GetNext(&context->visiMap.visimapStore,
context->indexScan,
ForwardScanDirection,
&context->visiMap.visimapEntry,
NULL))
{
AppendOnlyVisimapEntry *visimapEntry = &context->visiMap.visimapEntry;
MemSet(values, 0, sizeof(values));
MemSet(nulls, false, sizeof(nulls));
values[0] = Int32GetDatum(visimapEntry->segmentFileNum);
values[1] = Int64GetDatum(visimapEntry->firstRowNum);
values[2] = Int32GetDatum(
(int32)AppendOnlyVisimapEntry_GetHiddenTupleCount(visimapEntry));
gp_aovisimap_encode_bitmap(VARDATA(context->bitmapBuffer),
visimapEntry->bitmap);
SET_VARSIZE(context->bitmapBuffer, APPENDONLY_VISIMAP_MAX_RANGE);
values[3] = PointerGetDatum(context->bitmapBuffer);
tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
}
AppendOnlyVisimapStore_EndScan(&context->visiMap.visimapStore,
context->indexScan);
AppendOnlyVisimap_Finish(&context->visiMap, AccessShareLock);
heap_close(context->parentRelation, AccessShareLock);
pfree(context->bitmapBuffer);
pfree(context);
funcctx->user_fctx = NULL;
SRF_RETURN_DONE(funcctx);
}
开发者ID:phan-pivotal,项目名称:gpdb,代码行数:101,代码来源:appendonly_visimap_udf.c
示例4: _bt_getroot
/*
* _bt_getroot() -- Get the root page of the btree.
*
* Since the root page can move around the btree file, we have to read
* its location from the metadata page, and then read the root page
* itself. If no root page exists yet, we have to create one. The
* standard class of race conditions exists here; I think I covered
* them all in the Hopi Indian rain dance of lock requests below.
*
* The access type parameter (BT_READ or BT_WRITE) controls whether
* a new root page will be created or not. If access = BT_READ,
* and no root page exists, we just return InvalidBuffer. For
* BT_WRITE, we try to create the root page if it doesn't exist.
* NOTE that the returned root page will have only a read lock set
* on it even if access = BT_WRITE!
*
* The returned page is not necessarily the true root --- it could be
* a "fast root" (a page that is alone in its level due to deletions).
* Also, if the root page is split while we are "in flight" to it,
* what we will return is the old root, which is now just the leftmost
* page on a probably-not-very-wide level. For most purposes this is
* as good as or better than the true root, so we do not bother to
* insist on finding the true root. We do, however, guarantee to
* return a live (not deleted or half-dead) page.
*
* On successful return, the root page is pinned and read-locked.
* The metadata page is not locked or pinned on exit.
*/
Buffer
_bt_getroot(Relation rel, int access)
{
Buffer metabuf;
Page metapg;
BTPageOpaque metaopaque;
Buffer rootbuf;
Page rootpage;
BTPageOpaque rootopaque;
BlockNumber rootblkno;
uint32 rootlevel;
BTMetaPageData *metad;
/*
* Try to use previously-cached metapage data to find the root. This
* normally saves one buffer access per index search, which is a very
* helpful savings in bufmgr traffic and hence contention.
*/
if (rel->rd_amcache != NULL)
{
metad = (BTMetaPageData *) rel->rd_amcache;
/* We shouldn't have cached it if any of these fail */
Assert(metad->btm_magic == BTREE_MAGIC);
Assert(metad->btm_version == BTREE_VERSION);
Assert(metad->btm_root != P_NONE);
rootblkno = metad->btm_fastroot;
Assert(rootblkno != P_NONE);
rootlevel = metad->btm_fastlevel;
rootbuf = _bt_getbuf(rel, rootblkno, BT_READ);
rootpage = BufferGetPage(rootbuf);
rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage);
/*
* Since the cache might be stale, we check the page more carefully
* here than normal. We *must* check that it's not deleted. If it's
* not alone on its level, then we reject too --- this may be overly
* paranoid but better safe than sorry. Note we don't check P_ISROOT,
* because that's not set in a "fast root".
*/
if (!P_IGNORE(rootopaque) &&
rootopaque->btpo.level == rootlevel &&
P_LEFTMOST(rootopaque) &&
P_RIGHTMOST(rootopaque))
{
/* OK, accept cached page as the root */
return rootbuf;
}
_bt_relbuf(rel, rootbuf);
/* Cache is stale, throw it away */
if (rel->rd_amcache)
pfree(rel->rd_amcache);
rel->rd_amcache = NULL;
}
metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ);
metapg = BufferGetPage(metabuf);
metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg);
metad = BTPageGetMeta(metapg);
/* sanity-check the metapage */
if (!(metaopaque->btpo_flags & BTP_META) ||
metad->btm_magic != BTREE_MAGIC)
ereport(ERROR,
(errcode(ERRCODE_INDEX_CORRUPTED),
errmsg("index \"%s\" is not a btree",
RelationGetRelationName(rel))));
if (metad->btm_version != BTREE_VERSION)
ereport(ERROR,
(errcode(ERRCODE_INDEX_CORRUPTED),
//.........这里部分代码省略.........
开发者ID:LittleForker,项目名称:postgres,代码行数:101,代码来源:nbtpage.c
示例5: process
static
void
process(
char* edges_sql,
char* points_sql,
ArrayType *starts,
ArrayType *ends,
bool directed,
char *driving_side,
bool details,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
driving_side[0] = estimate_drivingSide(driving_side[0]);
pgr_SPI_connect();
size_t size_start_pidsArr = 0;
int64_t* start_pidsArr = pgr_get_bigIntArray(&size_start_pidsArr, starts);
size_t size_end_pidsArr = 0;
int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends);
Point_on_edge_t *points = NULL;
size_t total_points = 0;
pgr_get_points(points_sql, &points, &total_points);
char *edges_of_points_query = NULL;
char *edges_no_points_query = NULL;
get_new_queries(
edges_sql, points_sql,
&edges_of_points_query,
&edges_no_points_query);
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
pgr_get_edges(
edges_of_points_query, &edges_of_points, &total_edges_of_points);
pgr_edge_t *edges = NULL;
size_t total_edges = 0;
pgr_get_edges(edges_no_points_query, &edges, &total_edges);
free(edges_of_points_query);
free(edges_no_points_query);
if ((total_edges + total_edges_of_points) == 0) {
pgr_SPI_finish();
return;
}
clock_t start_t = clock();
char* log_msg = NULL;
char* notice_msg = NULL;
char* err_msg = NULL;
do_pgr_many_to_many_withPoints(
edges, total_edges,
points, total_points,
edges_of_points, total_edges_of_points,
start_pidsArr, size_start_pidsArr,
end_pidsArr, size_end_pidsArr,
driving_side[0],
details,
directed,
only_cost,
true,
result_tuples, result_count,
&log_msg,
¬ice_msg,
&err_msg);
if (only_cost) {
time_msg("processing pgr_withPointsCost(one to one)", start_t, clock());
} else {
time_msg("processing pgr_withPoints(one to one)", start_t, clock());
}
if (err_msg && (*result_tuples)) {
pfree(*result_tuples);
(*result_count) = 0;
(*result_tuples) = NULL;
}
pgr_global_report(log_msg, notice_msg, err_msg);
#if 0
if (log_msg) pfree(log_msg);
if (notice_msg) pfree(notice_msg);
if (err_msg) pfree(err_msg);
if (edges) pfree(edges);
if (points) pfree(points);
if (edges_of_points) pfree(edges_of_points);
//.........这里部分代码省略.........
开发者ID:titanofold,项目名称:pgrouting,代码行数:101,代码来源:many_to_many_withPoints.c
示例6: bms_free
/*
* bms_free - free a bitmapset
*
* Same as pfree except for allowing NULL input
*/
void
bms_free(Bitmapset *a)
{
if (a)
pfree(a);
}
开发者ID:BertrandAreal,项目名称:postgres,代码行数:11,代码来源:bitmapset.c
示例7: datum_to_bson
//.........这里部分代码省略.........
case CHAROID:
{
char c = DatumGetChar(val);
builder.append(field_name, &c, 1);
break;
}
case INT8OID:
builder.append(field_name, (long long)DatumGetInt64(val));
break;
case INT2OID:
builder.append(field_name, DatumGetInt16(val));
break;
case INT4OID:
builder.append(field_name, DatumGetInt32(val));
break;
case TEXTOID:
case JSONOID:
case XMLOID:
{
text* t = DatumGetTextP(val);
builder.append(field_name, VARDATA(t), VARSIZE(t)-VARHDRSZ+1);
break;
}
case FLOAT4OID:
builder.append(field_name, DatumGetFloat4(val));
break;
case FLOAT8OID:
builder.append(field_name, DatumGetFloat8(val));
break;
case RECORDOID:
{
mongo::BSONObjBuilder sub(builder.subobjStart(field_name));
composite_to_bson(sub, val);
sub.done();
break;
}
case TIMESTAMPOID:
{
Timestamp ts = DatumGetTimestamp(val);
#ifdef HAVE_INT64_TIMESTAMP
mongo::Date_t date(ts);
#else
mongo::Date_t date(ts * 1000);
#endif
builder.append(field_name, date);
break;
}
default:
{
PGBSON_LOG << "datum_to_bson - unknown type, using text output." << PGBSON_ENDL;
PGBSON_LOG << "datum_to_bson - type=" << get_typename(typid) << PGBSON_ENDL;
if (get_typename(typid) == "bson")
{
bytea* data = DatumGetBson(val);
mongo::BSONObj obj(VARDATA_ANY(data));
builder.append(field_name, obj);
}
else
{
// use text output for the type
bool typisvarlena = false;
Oid typoutput;
getTypeOutputInfo(typid, &typoutput, &typisvarlena);
PGBSON_LOG << "datum_to_bson - typisvarlena=" << std::boolalpha << typisvarlena << PGBSON_ENDL;
Datum out_val = val;
/*
* If we have a toasted datum, forcibly detoast it here to avoid
* memory leakage inside the type's output routine.
*/
if (typisvarlena)
{
out_val = PointerGetDatum(PG_DETOAST_DATUM(val));
PGBSON_LOG << "datum_to_bson - var len valuie detoasted" << PGBSON_ENDL;
}
char* outstr = OidOutputFunctionCall(typoutput, out_val);
builder.append(field_name, outstr);
/* Clean up detoasted copy, if any */
if (val != out_val)
pfree(DatumGetPointer(out_val));
}
}
} // switch
} // if not null
PGBSON_LOG << "END datum_to_bson, field_name=" << field_name << PGBSON_ENDL;
}
开发者ID:maciekgajewski,项目名称:postgresbson,代码行数:101,代码来源:pgbson_internal.cpp
示例8: gp_truncate_error_log
/*
* Delete error log of the specified relation. This returns true from master
* iif all segments and master find the relation.
*/
Datum
gp_truncate_error_log(PG_FUNCTION_ARGS)
{
text *relname;
char *relname_str;
RangeVar *relrv;
Oid relid;
bool allResults = true;
relname = PG_GETARG_TEXT_P(0);
relname_str = text_to_cstring(relname);
if (strcmp(relname_str, "*.*") == 0)
{
/*
* Only superuser is allowed to delete log files across database.
*/
if (!superuser())
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
(errmsg("must be superuser to delete all error log files"))));
ErrorLogDelete(InvalidOid, InvalidOid);
}
else if (strcmp(relname_str, "*") == 0)
{
/*
* Database owner can delete error log files.
*/
if (!pg_database_ownercheck(MyDatabaseId, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
get_database_name(MyDatabaseId));
ErrorLogDelete(MyDatabaseId, InvalidOid);
}
else
{
AclResult aclresult;
relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
relid = RangeVarGetRelid(relrv, true);
/* Return false if the relation does not exist. */
if (!OidIsValid(relid))
PG_RETURN_BOOL(false);
/*
* Allow only the table owner to truncate error log.
*/
aclresult = pg_class_aclcheck(relid, GetUserId(), ACL_TRUNCATE);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_CLASS, relrv->relname);
/* We don't care if this fails or not. */
ErrorLogDelete(MyDatabaseId, relid);
}
/*
* Dispatch the work to segments.
*/
if (Gp_role == GP_ROLE_DISPATCH)
{
int i, resultCount = 0;
StringInfoData sql, errbuf;
PGresult **results;
initStringInfo(&sql);
initStringInfo(&errbuf);
appendStringInfo(&sql,
"SELECT pg_catalog.gp_truncate_error_log(%s)",
quote_literal_internal(text_to_cstring(relname)));
results = cdbdisp_dispatchRMCommand(sql.data, true, &errbuf,
&resultCount);
if (errbuf.len > 0)
elog(ERROR, "%s", errbuf.data);
Assert(resultCount > 0);
for (i = 0; i < resultCount; i++)
{
Datum value;
bool isnull;
if (PQresultStatus(results[i]) != PGRES_TUPLES_OK)
ereport(ERROR,
(errmsg("unexpected result from segment: %d",
PQresultStatus(results[i]))));
value = ResultToDatum(results[i], 0, 0, boolin, &isnull);
allResults &= (!isnull && DatumGetBool(value));
PQclear(results[i]);
}
pfree(errbuf.data);
//.........这里部分代码省略.........
开发者ID:MicroMirror,项目名称:gpdb,代码行数:101,代码来源:cdbsreh.c
示例9: pg_tzenumerate_next
pg_tz *
pg_tzenumerate_next(pg_tzenum *dir)
{
while (dir->depth >= 0)
{
struct dirent *direntry;
char fullname[MAXPGPATH];
struct stat statbuf;
direntry = ReadDir(dir->dirdesc[dir->depth], dir->dirname[dir->depth]);
if (!direntry)
{
/* End of this directory */
FreeDir(dir->dirdesc[dir->depth]);
pfree(dir->dirname[dir->depth]);
dir->depth--;
continue;
}
if (direntry->d_name[0] == '.')
continue;
snprintf(fullname, MAXPGPATH, "%s/%s",
dir->dirname[dir->depth], direntry->d_name);
if (stat(fullname, &statbuf) != 0)
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not stat \"%s\": %m", fullname)));
if (S_ISDIR(statbuf.st_mode))
{
/* Step into the subdirectory */
if (dir->depth >= MAX_TZDIR_DEPTH - 1)
ereport(ERROR,
(errmsg("timezone directory stack overflow")));
dir->depth++;
dir->dirname[dir->depth] = pstrdup(fullname);
dir->dirdesc[dir->depth] = AllocateDir(fullname);
if (!dir->dirdesc[dir->depth])
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not open directory \"%s\": %m",
fullname)));
/* Start over reading in the new directory */
continue;
}
/*
* Load this timezone using tzload() not pg_tzset(), so we don't fill
* the cache
*/
if (tzload(fullname + dir->baselen, dir->tz.TZname, &dir->tz.state,
TRUE) != 0)
{
/* Zone could not be loaded, ignore it */
continue;
}
if (!tz_acceptable(&dir->tz))
{
/* Ignore leap-second zones */
continue;
}
/* Timezone loaded OK. */
return &dir->tz;
}
/* Nothing more found */
return NULL;
}
开发者ID:qiuyesuifeng,项目名称:gpdb,代码行数:73,代码来源:pgtz.c
示例10: UpdateIndexRelation
/* ----------------------------------------------------------------
* UpdateIndexRelation
* ----------------------------------------------------------------
*/
static void
UpdateIndexRelation(Oid indexoid,
Oid heapoid,
IndexInfo *indexInfo,
Oid *classOids,
bool primary)
{
int16 indkey[INDEX_MAX_KEYS];
Oid indclass[INDEX_MAX_KEYS];
Datum exprsDatum;
Datum predDatum;
Datum values[Natts_pg_index];
char nulls[Natts_pg_index];
Relation pg_index;
HeapTuple tuple;
int i;
/*
* Copy the index key and opclass info into zero-filled vectors
*/
MemSet(indkey, 0, sizeof(indkey));
MemSet(indclass, 0, sizeof(indclass));
for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++)
{
indkey[i] = indexInfo->ii_KeyAttrNumbers[i];
indclass[i] = classOids[i];
}
/*
* Convert the index expressions (if any) to a text datum
*/
if (indexInfo->ii_Expressions != NIL)
{
char *exprsString;
exprsString = nodeToString(indexInfo->ii_Expressions);
exprsDatum = DirectFunctionCall1(textin,
CStringGetDatum(exprsString));
pfree(exprsString);
}
else
exprsDatum = (Datum) 0;
/*
* Convert the index predicate (if any) to a text datum
*/
if (indexInfo->ii_Predicate != NIL)
{
char *predString;
predString = nodeToString(indexInfo->ii_Predicate);
predDatum = DirectFunctionCall1(textin,
CStringGetDatum(predString));
pfree(predString);
}
else
predDatum = (Datum) 0;
/*
* open the system catalog index relation
*/
pg_index = heap_openr(IndexRelationName, RowExclusiveLock);
/*
* Build a pg_index tuple
*/
MemSet(nulls, ' ', sizeof(nulls));
values[Anum_pg_index_indexrelid - 1] = ObjectIdGetDatum(indexoid);
values[Anum_pg_index_indrelid - 1] = ObjectIdGetDatum(heapoid);
values[Anum_pg_index_indkey - 1] = PointerGetDatum(indkey);
values[Anum_pg_index_indclass - 1] = PointerGetDatum(indclass);
values[Anum_pg_index_indnatts - 1] = Int16GetDatum(indexInfo->ii_NumIndexAttrs);
values[Anum_pg_index_indisunique - 1] = BoolGetDatum(indexInfo->ii_Unique);
values[Anum_pg_index_indisprimary - 1] = BoolGetDatum(primary);
values[Anum_pg_index_indisclustered - 1] = BoolGetDatum(false);
values[Anum_pg_index_indexprs - 1] = exprsDatum;
if (exprsDatum == (Datum) 0)
nulls[Anum_pg_index_indexprs - 1] = 'n';
values[Anum_pg_index_indpred - 1] = predDatum;
if (predDatum == (Datum) 0)
nulls[Anum_pg_index_indpred - 1] = 'n';
tuple = heap_formtuple(RelationGetDescr(pg_index), values, nulls);
/*
* insert the tuple into the pg_index catalog
*/
simple_heap_insert(pg_index, tuple);
/* update the indexes on pg_index */
CatalogUpdateIndexes(pg_index, tuple);
/*
* close the relation and free the tuple
*/
//.........这里部分代码省略.........
开发者ID:sunyangkobe,项目名称:cscd43,代码行数:101,代码来源:index.c
示例11: gp_read_error_log
/*
* gp_read_error_log
*
* Returns set of error log tuples.
*/
Datum
gp_read_error_log(PG_FUNCTION_ARGS)
{
FuncCallContext *funcctx;
ReadErrorLogContext *context;
HeapTuple tuple;
Datum result;
/*
* First call setup
*/
if (SRF_IS_FIRSTCALL())
{
MemoryContext oldcontext;
FILE *fp;
text *relname;
funcctx = SRF_FIRSTCALL_INIT();
relname = PG_GETARG_TEXT_P(0);
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
context = palloc0(sizeof(ReadErrorLogContext));
funcctx->user_fctx = (void *) context;
funcctx->tuple_desc = BlessTupleDesc(GetErrorTupleDesc());
/*
* Though this function is usually executed on segment, we dispatch
* the execution if it happens to be on QD, and combine the results
* into one set.
*/
if (Gp_role == GP_ROLE_DISPATCH)
{
int resultCount = 0;
PGresult **results = NULL;
StringInfoData sql;
StringInfoData errbuf;
int i;
initStringInfo(&sql);
initStringInfo(&errbuf);
/*
* construct SQL
*/
appendStringInfo(&sql,
"SELECT * FROM pg_catalog.gp_read_error_log(%s) ",
quote_literal_internal(text_to_cstring(relname)));
results = cdbdisp_dispatchRMCommand(sql.data, true, &errbuf,
&resultCount);
if (errbuf.len > 0)
elog(ERROR, "%s", errbuf.data);
Assert(resultCount > 0);
for (i = 0; i < resultCount; i++)
{
if (PQresultStatus(results[i]) != PGRES_TUPLES_OK)
elog(ERROR, "unexpected result from segment: %d",
PQresultStatus(results[i]));
context->numTuples += PQntuples(results[i]);
}
pfree(errbuf.data);
pfree(sql.data);
context->segResults = results;
context->numSegResults = resultCount;
}
else
{
/*
* In QE, read the error log.
*/
RangeVar *relrv;
Oid relid;
relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
relid = RangeVarGetRelid(relrv, true);
/*
* If the relation has gone, silently return no tuples.
*/
if (OidIsValid(relid))
{
AclResult aclresult;
/*
* Requires SELECT priv to read error log.
*/
aclresult = pg_class_aclcheck(relid, GetUserId(), ACL_SELECT);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_CLASS, relrv->relname);
//.........这里部分代码省略.........
开发者ID:MicroMirror,项目名称:gpdb,代码行数:101,代码来源:cdbsreh.c
示例12: updateAclDependencies
/*
* updateAclDependencies
* Update the pg_shdepend info for an object's ACL during GRANT/REVOKE.
*
* classId, objectId, objsubId: identify the object whose ACL this is
* ownerId: role owning the object
* noldmembers, oldmembers: array of roleids appearing in old ACL
* nnewmembers, newmembers: array of roleids appearing in new ACL
*
* We calculate the differences between the new and old lists of roles,
* and then insert or delete from pg_shdepend as appropriate.
*
* Note that we can't just insert all referenced roles blindly during GRANT,
* because we would end up with duplicate registered dependencies. We could
* check for existence of the tuples before inserting, but that seems to be
* more expensive than what we are doing here. Likewise we can't just delete
* blindly during REVOKE, because the user may still have other privileges.
* It is also possible that REVOKE actually adds dependencies, due to
* instantiation of a formerly implicit default ACL (although at present,
* all such dependencies should be for the owning role, which we ignore here).
*
* NOTE: Both input arrays must be sorted and de-duped. (Typically they
* are extracted from an ACL array by aclmembers(), which takes care of
* both requirements.) The arrays are pfreed before return.
*/
void
updateAclDependencies(Oid classId, Oid objectId, int32 objsubId,
Oid ownerId,
int noldmembers, Oid *oldmembers,
int nnewmembers, Oid *newmembers)
{
Relation sdepRel;
int i;
/*
* Remove entries that are common to both lists; those represent existing
* dependencies we don't need to change.
*
* OK to overwrite the inputs since we'll pfree them anyway.
*/
getOidListDiff(oldmembers, &noldmembers, newmembers, &nnewmembers);
if (noldmembers > 0 || nnewmembers > 0)
{
sdepRel = heap_open(SharedDependRelationId, RowExclusiveLock);
/* Add new dependencies that weren't already present */
for (i = 0; i < nnewmembers; i++)
{
Oid roleid = newmembers[i];
/*
* Skip the owner: he has an OWNER shdep entry instead. (This is
* not just a space optimization; it makes ALTER OWNER easier. See
* notes in changeDependencyOnOwner.)
*/
if (roleid == ownerId)
continue;
/* Skip pinned roles; they don't need dependency entries */
if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel))
continue;
shdepAddDependency(sdepRel, classId, objectId, objsubId,
AuthIdRelationId, roleid,
SHARED_DEPENDENCY_ACL);
}
/* Drop no-longer-used old dependencies */
for (i = 0; i < noldmembers; i++)
{
Oid roleid = oldmembers[i];
/* Skip the owner, same as above */
if (roleid == ownerId)
continue;
/* Skip pinned roles */
if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel))
continue;
shdepDropDependency(sdepRel, classId, objectId, objsubId,
false, /* exact match on objsubId */
AuthIdRelationId, roleid,
SHARED_DEPENDENCY_ACL);
}
heap_close(sdepRel, RowExclusiveLock);
}
if (oldmembers)
pfree(oldmembers);
if (newmembers)
pfree(newmembers);
}
开发者ID:AllenDou,项目名称:postgresql,代码行数:95,代码来源:pg_shdepend.c
示例13: xpath_table
//.........这里部分代码省略.........
/* compile the path */
comppath = xmlXPathCompile(xpaths[j]);
if (comppath == NULL)
xml_ereport(xmlerrcxt, ERROR,
ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
"XPath Syntax Error");
/* Now evaluate the path expression. */
res = xmlXPathCompiledEval(comppath, ctxt);
xmlXPathFreeCompExpr(comppath);
if (res != NULL)
{
switch (res->type)
{
case XPATH_NODESET:
/* We see if this nodeset has enough nodes */
if (res->nodesetval != NULL &&
rownr < res->nodesetval->nodeNr)
{
resstr = xmlXPathCastNodeToString(res->nodesetval->nodeTab[rownr]);
had_values = true;
}
else
resstr = NULL;
break;
case XPATH_STRING:
resstr = xmlStrdup(res->stringval);
break;
default:
elog(NOTICE, "unsupported XQuery result: %d", res->type);
resstr = xmlStrdup((const xmlChar *) "<unsupported/>");
}
/*
* Insert this into the appropriate column in the
* result tuple.
*/
values[j + 1] = (char *) resstr;
}
xmlXPathFreeContext(ctxt);
}
/* Now add the tuple to the output, if there is one. */
if (had_values)
{
ret_tuple = BuildTupleFromCStrings(attinmeta, values);
tuplestore_puttuple(tupstore, ret_tuple);
heap_freetuple(ret_tuple);
}
rownr++;
} while (had_values);
}
if (doctree != NULL)
xmlFreeDoc(doctree);
doctree = NULL;
if (pkey)
pfree(pkey);
if (xmldoc)
pfree(xmldoc);
}
}
PG_CATCH();
{
if (doctree != NULL)
xmlFreeDoc(doctree);
pg_xml_done(xmlerrcxt, true);
PG_RE_THROW();
}
PG_END_TRY();
if (doctree != NULL)
xmlFreeDoc(doctree);
pg_xml_done(xmlerrcxt, false);
tuplestore_donestoring(tupstore);
SPI_finish();
rsinfo->setResult = tupstore;
/*
* SFRM_Materialize mode expects us to return a NULL Datum. The actual
* tuples are in our tuplestore and passed back through rsinfo->setResult.
* rsinfo->setDesc is set to the tuple description that we actually used
* to build our tuples with, so the caller can verify we did what it was
* expecting.
*/
return (Datum) 0;
}
开发者ID:kevinston,项目名称:postgres,代码行数:101,代码来源:xpath.c
示例14: logfebe_emit_log_hook
//.........这里部分代码省略.........
closeSocket(&outSockFd);
}
}
/*
* Increment log sequence number
*
* Done early on so this happens regardless if there are problems emitting
* the log.
*/
seqNum += 1;
/*
* Early exit if the socket path is not set and isn't in the format of
* an absolute path.
*
* The empty identity ("ident") is a valid one, so it is not rejected in
* the same way an empty logUnixSocketPath is.
*/
if (logUnixSocketPath == NULL ||
strlen(logUnixSocketPath) <= 0 || logUnixSocketPath[0] != '/')
{
/*
* Unsetting the GUCs via SIGHUP would leave a connection
* dangling, if it exists, close it.
*/
if (outSockFd >= 0)
{
closeSocket(&outSockFd);
}
goto quickExit;
}
save_errno = errno;
/*
* Initialize StringInfoDatas early, because pfree is called
* unconditionally at exit.
*/
initStringInfo(&buf);
if (outSockFd < 0)
{
openSocket(&outSockFd, logUnixSocketPath);
/* Couldn't get a valid socket; give up */
if (outSockFd < 0)
goto exit;
}
/*
* Make room for message type byte and length header. The length header
* must be overwritten to the correct value at the end.
*/
{
const char logHdr[5] = {'L', '\0', '\0', '\0', '\0'};
appendBinaryStringInfo(&buf, logHdr, sizeof logHdr);
}
/*
* Format the output, and figure out how long it is, and frame it
* for the protocol.
*/
{
uint32_t *msgSize;
fmtLogMsg(&buf, edata);
/*
* Check that buf is prepared properly, with enough space and
* the placeholder length expected.
*/
Assert(buf.len > 5);
Assert(buf.data[0] == 'L');
msgSize = (uint32_t *)(buf.data + 1);
Assert(*msgSize == 0);
/*
* Fill in *msgSize: buf contains the msg header, which is not
* included in length; subract and byte-swap to paste the
* right length into place.
*/
*msgSize = htobe32(buf.len - 1);
}
/* Finally: try to send the constructed message */
sendOrInval(&outSockFd, buf.data, buf.len);
exit:
pfree(buf.data);
errno = save_errno;
quickExit:
/* Call a previous hook, should it exist */
if (prev_emit_log_hook != NULL)
prev_emit_log_hook(edata);
}
开发者ID:logplex,项目名称:pg_logfebe-debian,代码行数:101,代码来源:pg_logfebe.c
示例15: compileTheSubstitute
static void
compileTheSubstitute(DictThesaurus *d)
{
int i;
for (i = 0; i < d->nsubst; i++)
{
TSLexeme *rem = d->subst[i].res,
*outptr,
*inptr;
int n = 2;
outptr = d->subst[i].res = (TSLexeme *) palloc(sizeof(TSLexeme) * n);
outptr->lexeme = NULL;
inptr = rem;
while (inptr && inptr->lexeme)
{
TSLexeme *lexized,
tmplex[2];
if (inptr->flags & DT_USEASIS)
{ /* do not lexize */
tmplex[0] = *inptr;
tmplex[0].flags = 0;
tmplex[1].lexeme = NULL;
lexized = tmplex;
}
else
{
lexized = (TSLexeme *) DatumGetPointer(
FunctionCall4(
&(d->subdict->lexize),
PointerGetDatum(d->subdict->dictData),
PointerGetDatum(inptr->lexeme),
Int32GetDatum(strlen(inptr->lexeme)),
PointerGetDatum(NULL)
)
);
}
if (lexized && lexized->lexeme)
{
int toset = (lexized->lexeme && outptr != d->subst[i].res) ? (outptr - d->subst[i].res) : -1;
while (lexized->lexeme)
{
if (outptr - d->subst[i].res + 1 >= n)
{
int diff = outptr - d->subst[i].res;
n *= 2;
d->subst[i].res = (TSLexeme *) repalloc(d->subst[i].res, sizeof(TSLexeme) * n);
outptr = d->subst[i].res + diff;
}
*outptr = *lexized;
outptr->lexeme = pstrdup(lexized->lexeme);
outptr++;
lexized++;
}
if (toset > 0)
d->subst[i].res[toset].flags |= TSL_ADDPOS;
}
else if (lexized)
{
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("thesaurus substitute word \"%s\" is a stop word (rule %d)",
inptr->lexeme, i + 1)));
}
else
{
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)",
inptr->lexeme, i + 1)));
}
if (inptr->lexeme)
pfree(inptr->lexeme);
inptr++;
}
if (outptr == d->subst[i].res)
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg("thesaurus substitute phrase is empty (rule %d)",
i + 1)));
d->subst[i].reslen = outptr - d->subst[i].res;
pfree(rem);
}
}
开发者ID:50wu,项目名称:gpdb,代码行数:97,代码来源:dict_thesaurus.c
示例16: bqarr_in
/*
* input
*/
Datum
bqarr_in(PG_FUNCTION_ARGS)
{
char *buf = (char *) PG_GETARG_POINTER(0);
WORKSTATE state;
int4 i;
QUERYTYPE *query;
int4 commonlen;
ITEM *ptr;
NODE *tmp;
int4 pos = 0;
#ifdef BS_DEBUG
StringInfoData pbuf;
#endif
state.buf = buf;
state.state = WAITOPERAND;
state.count = 0;
state.num = 0;
state.str = NULL;
/* make polish notation (postfix, but in reverse order) */
makepol(&state);
if (!state.num)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("empty query")));
commonlen = COMPUTESIZE(state.num);
query = (QUERYTYPE *) palloc(commonlen);
SET_VARSIZE(query, commonlen);
query->size = state.num;
ptr = GETQUERY(query);
for (i = state.num - 1; i >= 0; i--)
{
ptr[i].type = state.str->type;
ptr[i].val = state.str->val;
tmp = state.str->next;
pfree(state.str);
state.str = tmp;
}
pos = query->size - 1;
findoprnd(ptr, &pos);
#ifdef BS_DEBUG
initStringInfo(&pbuf);
for (i = 0; i < query->size; i++)
{
if (ptr[i].type == OPR)
appendStringInfo(&pbuf, "%c(%d) ", ptr[i].val, ptr[i].left);
else
appendStringInfo(&pbuf, "%d ", ptr[i].val);
}
elog(DEBUG3, "POR: %s", pbuf.data);
pfree(pbuf.data);
#endif
PG_RETURN_POINTER(query);
}
开发者ID:50wu,项目名称:gpdb,代码行数:64,代码来源:_int_bool.c
示例17: ginEntryInsert
/*
* Inserts only one entry to the index, but it can add more than 1 ItemPointer.
*/
void
ginEntryInsert(Relation index, GinState *ginstate,
OffsetNumber attnum, Datum value,
ItemPointerData *items, uint32 nitem,
bool isBuild)
{
GinBtreeData btr
|
请发表评论