include/collection.h (76 lines of code) (raw):
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __COLLECTION_H__
#define __COLLECTION_H__
#include "fmgr.h"
#include "storage/lwlock.h"
#include "utils/expandeddatum.h"
#include "utils/hsearch.h"
#ifdef HASH_FUNCTION
#undef HASH_FUNCTION
#define HASH_FUNCTION HASH_JEN
#endif
#define HASH_NONFATAL_OOM 1
#include "uthash/uthash.h"
#undef uthash_malloc
#undef uthash_free
#undef uthash_nonfatal_oom
#define uthash_malloc(sz) palloc(sz)
#define uthash_free(ptr,sz) pfree(ptr)
#define uthash_nonfatal_oom(e) do{elog(ERROR, "unable to allocate memory");}while(0)
#define COLLECTION_MAGIC 8675309 /* ID for debugging crosschecks */
typedef struct collection
{
char *key;
Datum value;
UT_hash_handle hh;
} collection;
typedef struct CollectionHeader
{
/* Standard header for expanded objects */
ExpandedObjectHeader hdr;
/* Magic value identifying an expanded array (for debugging only) */
int collection_magic;
Oid value_type; /* value type OID */
int16 value_type_len;
bool value_byval;
/*
* flat_size is the current space requirement for the flat equivalent of
* the expanded array, if known; otherwise it's 0. We store this to make
* consecutive calls of get_flat_size cheap.
*/
size_t flat_size;
collection *current;
collection *head;
} CollectionHeader;
typedef struct FlatCollectionType
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int32 num_entries;
Oid value_type;
char values[];
} FlatCollectionType;
typedef struct StatsCounters
{
int64 add;
int64 context_switch;
int64 delete;
int64 find;
int64 sort;
} StatsCounters;
extern StatsCounters stats;
extern CollectionHeader * parse_collection(char *json);
extern CollectionHeader * fetch_collection(FunctionCallInfo fcinfo, int argno);
extern CollectionHeader * construct_empty_collection(MemoryContext parentcontext);
CollectionHeader *DatumGetExpandedCollection(Datum d);
/* "Methods" required for an expanded object */
Size collection_get_flat_size(ExpandedObjectHeader *eohptr);
void collection_flatten_into(ExpandedObjectHeader *eohptr,
void *result, Size allocated_size);
/* custom wait event values, retrieved from shared memory */
extern uint32 collection_we_flatsize;
extern uint32 collection_we_flatten;
extern uint32 collection_we_expand;
extern uint32 collection_we_cast;
extern uint32 collection_we_add;
extern uint32 collection_we_count;
extern uint32 collection_we_find;
extern uint32 collection_we_delete;
extern uint32 collection_we_sort;
extern uint32 collection_we_copy;
extern uint32 collection_we_value;
extern uint32 collection_we_to_table;
extern uint32 collection_we_fetch;
extern uint32 collection_we_assign;
extern uint32 collection_we_input;
extern uint32 collection_we_output;
#endif /* __COLLECTION_H__ */