blob: d9708901395f975c62b792c88aa2b19dd4b14b55 [file] [log] [blame]
/*!
* \file sortasort.h
*
* \brief header file for the sortasort directory data structure
*/
#define SORTA_SLOP 100
/*!
* \internal
* \brief a pre-marshalled directory data structure to hold strings
*
* A sortasort is a smallish array of strings, intended for append-only
* modification, and network transmission as a single byte-string. It is
* structured as a header followed by an array of offsets (directory) that
* point to the actual null-terminated strings stored in the "vals" array
* at the end of the structure.
*
* The directory is mostly sorted in ascending order of the vals it points
* to, but the last < SORTA_SLOP entries are left unsorted. Binary Search
* is used on all but those last entries, which must be scanned. At every
* k*SORTA_SLOP'th insert, the full directory is sorted.
* \endinternal
*/
typedef struct {
size_t num_vals; /*! number of values so far */
size_t storage_sz; /*! the number of bytes available for strings at the end */
size_t capacity; /*! size of the sortasort directory */
int typLen; /*! length of this Postgres type (-1 for bytea, -2 for cstring) */
size_t typByVal; /*! Postgres typByVal flag */
unsigned storage_cur; /*! offset after the directory to do the next insertion */
unsigned dir[]; /*! storage of the strings */
} sortasort;
/*
* get the ith item stored in sortasort
*/
char *sortasort_getval(sortasort *s, unsigned i);
int sortasort_try_insert(sortasort *, Datum, int);
sortasort *sortasort_init(sortasort *, size_t, size_t, int, bool);
int sortasort_find(sortasort *, Datum);
int sorta_cmp(const void *i, const void *j, void *thunk);