mirror of https://github.com/citusdata/citus.git
129 lines
4.2 KiB
C
129 lines
4.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* multi_client_executor.h
|
|
* Type and function pointer declarations for executing client-side (libpq)
|
|
* logic.
|
|
*
|
|
* Copyright (c) 2012-2016, Citus Data, Inc.
|
|
*
|
|
* $Id$
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef MULTI_CLIENT_EXECUTOR_H
|
|
#define MULTI_CLIENT_EXECUTOR_H
|
|
|
|
#define INVALID_CONNECTION_ID -1 /* identifies an invalid connection */
|
|
#define MAX_CONNECTION_COUNT 2048 /* simultaneous client connection count */
|
|
#define STRING_BUFFER_SIZE 1024 /* buffer size for character arrays */
|
|
|
|
|
|
/* Enumeration to track one client connection's status */
|
|
typedef enum
|
|
{
|
|
CLIENT_INVALID_CONNECT = 0,
|
|
CLIENT_CONNECTION_BAD = 1,
|
|
CLIENT_CONNECTION_BUSY = 2,
|
|
CLIENT_CONNECTION_BUSY_READ = 3,
|
|
CLIENT_CONNECTION_BUSY_WRITE = 4,
|
|
CLIENT_CONNECTION_READY = 5
|
|
} ConnectStatus;
|
|
|
|
|
|
/* Enumeration to see if we can read query results without blocking */
|
|
typedef enum
|
|
{
|
|
CLIENT_INVALID_RESULT_STATUS = 0,
|
|
CLIENT_RESULT_UNAVAILABLE = 1,
|
|
CLIENT_RESULT_BUSY = 2,
|
|
CLIENT_RESULT_READY = 3
|
|
} ResultStatus;
|
|
|
|
|
|
/* Enumeration to track one execution query's status on the client */
|
|
typedef enum
|
|
{
|
|
CLIENT_INVALID_QUERY = 0,
|
|
CLIENT_QUERY_FAILED = 1,
|
|
CLIENT_QUERY_DONE = 2,
|
|
CLIENT_QUERY_COPY = 3
|
|
} QueryStatus;
|
|
|
|
|
|
/* Enumeration to track one copy query's status on the client */
|
|
typedef enum
|
|
{
|
|
CLIENT_INVALID_COPY = 0,
|
|
CLIENT_COPY_MORE = 1,
|
|
CLIENT_COPY_FAILED = 2,
|
|
CLIENT_COPY_DONE = 3
|
|
} CopyStatus;
|
|
|
|
|
|
/* Enumeration to track the status of a query in a batch on the client */
|
|
typedef enum
|
|
{
|
|
CLIENT_INVALID_BATCH_QUERY = 0,
|
|
CLIENT_BATCH_QUERY_FAILED = 1,
|
|
CLIENT_BATCH_QUERY_CONTINUE = 2,
|
|
CLIENT_BATCH_QUERY_DONE = 3
|
|
} BatchQueryStatus;
|
|
|
|
|
|
/* Enumeration to track whether a task is ready to run and, if not, what it's blocked on*/
|
|
typedef enum TaskExecutionStatus
|
|
{
|
|
TASK_STATUS_INVALID = 0,
|
|
TASK_STATUS_ERROR, /* error occured */
|
|
TASK_STATUS_READY, /* task ready to be processed further */
|
|
TASK_STATUS_SOCKET_READ, /* waiting for connection to become ready for reads */
|
|
TASK_STATUS_SOCKET_WRITE /* waiting for connection to become ready for writes */
|
|
} TaskExecutionStatus;
|
|
|
|
|
|
struct pollfd; /* forward declared, to avoid having to include poll.h */
|
|
|
|
typedef struct WaitInfo
|
|
{
|
|
int maxWaiters;
|
|
struct pollfd *pollfds;
|
|
int registeredWaiters;
|
|
bool haveReadyWaiter;
|
|
bool haveFailedWaiter;
|
|
} WaitInfo;
|
|
|
|
|
|
/* Function declarations for executing client-side (libpq) logic. */
|
|
extern int32 MultiClientConnect(const char *nodeName, uint32 nodePort,
|
|
const char *nodeDatabase, const char *nodeUser);
|
|
extern int32 MultiClientConnectStart(const char *nodeName, uint32 nodePort,
|
|
const char *nodeDatabase, const char *nodeUser);
|
|
extern ConnectStatus MultiClientConnectPoll(int32 connectionId);
|
|
extern void MultiClientDisconnect(int32 connectionId);
|
|
extern bool MultiClientConnectionUp(int32 connectionId);
|
|
extern bool MultiClientExecute(int32 connectionId, const char *query, void **queryResult,
|
|
int *rowCount, int *columnCount);
|
|
extern bool MultiClientSendQuery(int32 connectionId, const char *query);
|
|
extern bool MultiClientCancel(int32 connectionId);
|
|
extern ResultStatus MultiClientResultStatus(int32 connectionId);
|
|
extern QueryStatus MultiClientQueryStatus(int32 connectionId);
|
|
extern CopyStatus MultiClientCopyData(int32 connectionId, int32 fileDescriptor);
|
|
extern bool MultiClientQueryResult(int32 connectionId, void **queryResult,
|
|
int *rowCount, int *columnCount);
|
|
extern BatchQueryStatus MultiClientBatchResult(int32 connectionId, void **queryResult,
|
|
int *rowCount, int *columnCount);
|
|
extern char * MultiClientGetValue(void *queryResult, int rowIndex, int columnIndex);
|
|
extern bool MultiClientValueIsNull(void *queryResult, int rowIndex, int columnIndex);
|
|
extern void MultiClientClearResult(void *queryResult);
|
|
extern WaitInfo * MultiClientCreateWaitInfo(int maxConnections);
|
|
|
|
extern void MultiClientResetWaitInfo(WaitInfo *waitInfo);
|
|
extern void MultiClientFreeWaitInfo(WaitInfo *waitInfo);
|
|
extern void MultiClientRegisterWait(WaitInfo *waitInfo, TaskExecutionStatus waitStatus,
|
|
int32 connectionId);
|
|
extern void MultiClientWait(WaitInfo *waitInfo);
|
|
|
|
|
|
#endif /* MULTI_CLIENT_EXECUTOR_H */
|