Loading Makefile +5 −3 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ CFLAGS += -std=c99 -g ${WARN} ${CDEFS} ${OPTIMIZE} LIB_INCS = -I$(LIB_DIR) -I$(PUB_INC) -I$(PBC_INC) -I$(VND_INC) LIB_DEPS = $(PUB_INC)/kinetic_client.h $(PUB_INC)/kinetic_types.h $(LIB_DIR)/kinetic_connection.h $(LIB_DIR)/kinetic_hmac.h $(LIB_DIR)/kinetic_logger.h $(LIB_DIR)/kinetic_message.h $(LIB_DIR)/kinetic_nbo.h $(LIB_DIR)/kinetic_operation.h $(LIB_DIR)/kinetic_pdu.h $(LIB_DIR)/kinetic_proto.h $(LIB_DIR)/kinetic_socket.h # LIB_OBJ = $(patsubst %,$(OUT_DIR)/%,$(LIB_OBJS)) LIB_OBJS = $(OUT_DIR)/kinetic_nbo.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_pdu.o $(OUT_DIR)/kinetic_proto.o $(OUT_DIR)/kinetic_socket.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_logger.o $(OUT_DIR)/kinetic_hmac.o $(OUT_DIR)/kinetic_connection.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_client.o $(OUT_DIR)/socket99.o $(OUT_DIR)/protobuf-c.o LIB_OBJS = $(OUT_DIR)/kinetic_nbo.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_pdu.o $(OUT_DIR)/kinetic_proto.o $(OUT_DIR)/kinetic_socket.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_logger.o $(OUT_DIR)/kinetic_hmac.o $(OUT_DIR)/kinetic_connection.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_types.o $(OUT_DIR)/kinetic_client.o $(OUT_DIR)/socket99.o $(OUT_DIR)/protobuf-c.o default: $(KINETIC_LIB) Loading Loading @@ -59,12 +59,14 @@ $(OUT_DIR)/kinetic_connection.o: $(LIB_DIR)/kinetic_connection.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_operation.o: $(LIB_DIR)/kinetic_operation.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_client.o: $(LIB_DIR)/kinetic_client.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/socket99.o: $(SOCKET99)/socket99.c $(SOCKET99)/socket99.h $(CC) -c -o $@ $< $(CFLAGS) -I$(SOCKET99) $(OUT_DIR)/protobuf-c.o: $(PBC_INC)/protobuf-c/protobuf-c.c $(PBC_INC)/protobuf-c/protobuf-c.h $(CC) -c -o $@ $< -std=c99 -g -Wall ${OPTIMIZE} -I$(PBC_INC) $(OUT_DIR)/kinetic_types.o: $(LIB_DIR)/kinetic_types.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_client.o: $(LIB_DIR)/kinetic_client.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(KINETIC_LIB): $(LIB_OBJS) ar -rcs $@ $(LIB_OBJS) Loading include/kinetic_client.h +5 −5 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ KineticOperation KineticClient_CreateOperation( * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation); KineticStatus KineticClient_NoOp(KineticOperation* operation); /** * @brief Executes a PUT command to write data to the Kinetic Device Loading @@ -92,8 +92,8 @@ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation); * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, const Kinetic_KeyValue* metadata); KineticStatus KineticClient_Put(KineticOperation* operation, const KineticKeyValue* metadata); /** * @brief Executes a GET command to read data from the Kinetic Device Loading @@ -105,7 +105,7 @@ KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, const Kinetic_KeyValue* metadata); KineticStatus KineticClient_Get(KineticOperation* operation, KineticKeyValue* metadata); #endif // _KINETIC_CLIENT_H include/kinetic_types.h +19 −3 Original line number Diff line number Diff line Loading @@ -203,8 +203,24 @@ typedef struct _KineticMessage } // Kinetic Status Codes typedef enum { KINETIC_STATUS_INVALID = -1, // Status not available (no reponse/status available) KINETIC_STATUS_SUCCESS = 0, // Operation successful KINETIC_STATUS_DEVICE_BUSY, // Device busy (retry later) KINETIC_STATUS_CONNECTION_ERROR, // No connection/disconnected KINETIC_STATUS_INVALID_REQUEST, // Something about the request is invalid KINETIC_STATUS_OPERATION_FAILED, // Device reported an operation error KINETIC_STATUS_VERSION_FAILURE, // Basically a VERSION_MISMATCH error for a PUT KINETIC_STATUS_DATA_ERROR, // Device reported data error, no spaces, HMAC failure } KineticStatus; extern const int KineticStatusDescriptorCount; extern const char* KineticStatusDescriptor[]; // KeyValue meta-data typedef struct _Kinetic_KeyValue typedef struct _KineticKeyValue { ByteArray key; ByteArray newVersion; Loading @@ -215,7 +231,7 @@ typedef struct _Kinetic_KeyValue bool metadataOnly; KineticProto_Synchronization synchronization; ByteArray value; } Kinetic_KeyValue; } KineticKeyValue; // Kinetic PDU Header Loading Loading @@ -257,7 +273,7 @@ typedef struct _KineticPDU uint8_t protobufRaw[PDU_PROTO_MAX_LEN]; // Object meta-data to be used/populated if provided and pertinent to the opearation Kinetic_KeyValue* metadata; KineticKeyValue* metadata; // Value data associated with PDU (if any) uint8_t valueBuffer[PDU_VALUE_MAX_LEN]; Loading src/lib/kinetic_client.c +35 −27 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ */ #include "kinetic_client.h" #include "kinetic_types_internal.h" #include "kinetic_pdu.h" #include "kinetic_operation.h" #include "kinetic_connection.h" Loading @@ -27,7 +28,7 @@ #include "kinetic_logger.h" #include <stdio.h> KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* operation); KineticStatus KineticClient_ExecuteOperation(KineticOperation* operation); void KineticClient_Init(const char* logFile) { Loading @@ -54,20 +55,20 @@ bool KineticClient_Connect(KineticConnection* connection, return false; } if (key.len < 1) if (hmacKey.len < 1) { LOG("Specified HMAC key is empty!"); return false; } if (key.data == NULL) if (hmacKey.data == NULL) { LOG("Specified HMAC key is NULL!"); return false; } if (!KineticConnection_Connect(connection, host, port, nonBlocking, clusterVersion, identity, key)) clusterVersion, identity, hmacKey)) { connection->connected = false; connection->socketDescriptor = -1; Loading Loading @@ -123,7 +124,7 @@ KineticOperation KineticClient_CreateOperation(KineticConnection* connection, return op; } KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation) KineticStatus KineticClient_NoOp(KineticOperation* operation) { assert(operation->connection != NULL); assert(operation->request != NULL); Loading @@ -136,26 +137,25 @@ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation) return KineticClient_ExecuteOperation(operation); } KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, const Kinetic_KeyValue* metadata, const ByteArray value) KineticStatus KineticClient_Put(KineticOperation* operation, const KineticKeyValue* metadata) { assert(operation->connection != NULL); assert(operation->request != NULL); assert(operation->response != NULL); assert(value.data != NULL); assert(value.len <= PDU_VALUE_MAX_LEN); assert(metadata != NULL); assert(metadata->value.data != NULL); assert(metadata->value.len <= PDU_VALUE_MAX_LEN); // Initialize request KineticOperation_BuildPut(operation, metadata, value); KineticOperation_BuildPut(operation, metadata); // Execute the operation return KineticClient_ExecuteOperation(operation); } KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, const Kinetic_KeyValue* metadata, const ByteArray value) KineticStatus KineticClient_Get(KineticOperation* operation, KineticKeyValue* metadata) { assert(operation->connection != NULL); assert(operation->request != NULL); Loading @@ -164,30 +164,38 @@ KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, assert(metadata->key.data != NULL); assert(metadata->key.len <= KINETIC_MAX_KEY_LEN); ByteArray responseValue = BYTE_ARRAY_NONE; if (!metadata->metadataOnly) { if (value.data != NULL) { responseValue = value; } else if (metadata->value.data == NULL) { responseValue = (ByteArray){.data = operation->response->valueBuffer}; metadata->value = (ByteArray){ .data = operation->response->valueBuffer, .len = PDU_VALUE_MAX_LEN}; } } // Initialize request KineticOperation_BuildGet(operation, metadata, responseValue); KineticOperation_BuildGet(operation, metadata); // Execute the operation return KineticClient_ExecuteOperation(operation); KineticStatus status = KineticClient_ExecuteOperation(operation); // Update the metadata with the received value length upon success if (status == KINETIC_STATUS_SUCCESS) { metadata->value.len = operation->response->value.len; } else { metadata->value.len = 0; } return status; } KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* operation) KineticStatus KineticClient_ExecuteOperation(KineticOperation* operation) { KineticProto_Status_StatusCode status = KINETIC_PROTO_STATUS_STATUS_CODE_INVALID_STATUS_CODE; KineticStatus status = KINETIC_STATUS_INVALID; // Send the request if (KineticPDU_Send(operation->request)) Loading @@ -198,7 +206,7 @@ KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* // Receive the response if (KineticPDU_Receive(operation->response)) { status = KineticPDU_Status(operation->response); status = KineticOperation_GetStatus(operation); } } Loading src/lib/kinetic_connection.h +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ #ifndef _KINETIC_CONNECTION_H #define _KINETIC_CONNECTION_H #include "kinetic_types.h" #include "kinetic_types_internal.h" bool KineticConnection_Connect(KineticConnection* connection, const char* host, Loading Loading
Makefile +5 −3 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ CFLAGS += -std=c99 -g ${WARN} ${CDEFS} ${OPTIMIZE} LIB_INCS = -I$(LIB_DIR) -I$(PUB_INC) -I$(PBC_INC) -I$(VND_INC) LIB_DEPS = $(PUB_INC)/kinetic_client.h $(PUB_INC)/kinetic_types.h $(LIB_DIR)/kinetic_connection.h $(LIB_DIR)/kinetic_hmac.h $(LIB_DIR)/kinetic_logger.h $(LIB_DIR)/kinetic_message.h $(LIB_DIR)/kinetic_nbo.h $(LIB_DIR)/kinetic_operation.h $(LIB_DIR)/kinetic_pdu.h $(LIB_DIR)/kinetic_proto.h $(LIB_DIR)/kinetic_socket.h # LIB_OBJ = $(patsubst %,$(OUT_DIR)/%,$(LIB_OBJS)) LIB_OBJS = $(OUT_DIR)/kinetic_nbo.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_pdu.o $(OUT_DIR)/kinetic_proto.o $(OUT_DIR)/kinetic_socket.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_logger.o $(OUT_DIR)/kinetic_hmac.o $(OUT_DIR)/kinetic_connection.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_client.o $(OUT_DIR)/socket99.o $(OUT_DIR)/protobuf-c.o LIB_OBJS = $(OUT_DIR)/kinetic_nbo.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_pdu.o $(OUT_DIR)/kinetic_proto.o $(OUT_DIR)/kinetic_socket.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_message.o $(OUT_DIR)/kinetic_logger.o $(OUT_DIR)/kinetic_hmac.o $(OUT_DIR)/kinetic_connection.o $(OUT_DIR)/kinetic_operation.o $(OUT_DIR)/kinetic_types.o $(OUT_DIR)/kinetic_client.o $(OUT_DIR)/socket99.o $(OUT_DIR)/protobuf-c.o default: $(KINETIC_LIB) Loading Loading @@ -59,12 +59,14 @@ $(OUT_DIR)/kinetic_connection.o: $(LIB_DIR)/kinetic_connection.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_operation.o: $(LIB_DIR)/kinetic_operation.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_client.o: $(LIB_DIR)/kinetic_client.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/socket99.o: $(SOCKET99)/socket99.c $(SOCKET99)/socket99.h $(CC) -c -o $@ $< $(CFLAGS) -I$(SOCKET99) $(OUT_DIR)/protobuf-c.o: $(PBC_INC)/protobuf-c/protobuf-c.c $(PBC_INC)/protobuf-c/protobuf-c.h $(CC) -c -o $@ $< -std=c99 -g -Wall ${OPTIMIZE} -I$(PBC_INC) $(OUT_DIR)/kinetic_types.o: $(LIB_DIR)/kinetic_types.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(OUT_DIR)/kinetic_client.o: $(LIB_DIR)/kinetic_client.c $(LIB_DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(LIB_INCS) $(KINETIC_LIB): $(LIB_OBJS) ar -rcs $@ $(LIB_OBJS) Loading
include/kinetic_client.h +5 −5 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ KineticOperation KineticClient_CreateOperation( * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation); KineticStatus KineticClient_NoOp(KineticOperation* operation); /** * @brief Executes a PUT command to write data to the Kinetic Device Loading @@ -92,8 +92,8 @@ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation); * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, const Kinetic_KeyValue* metadata); KineticStatus KineticClient_Put(KineticOperation* operation, const KineticKeyValue* metadata); /** * @brief Executes a GET command to read data from the Kinetic Device Loading @@ -105,7 +105,7 @@ KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, * @return Returns 0 upon succes, -1 or the Kinetic status code * upon failure */ KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, const Kinetic_KeyValue* metadata); KineticStatus KineticClient_Get(KineticOperation* operation, KineticKeyValue* metadata); #endif // _KINETIC_CLIENT_H
include/kinetic_types.h +19 −3 Original line number Diff line number Diff line Loading @@ -203,8 +203,24 @@ typedef struct _KineticMessage } // Kinetic Status Codes typedef enum { KINETIC_STATUS_INVALID = -1, // Status not available (no reponse/status available) KINETIC_STATUS_SUCCESS = 0, // Operation successful KINETIC_STATUS_DEVICE_BUSY, // Device busy (retry later) KINETIC_STATUS_CONNECTION_ERROR, // No connection/disconnected KINETIC_STATUS_INVALID_REQUEST, // Something about the request is invalid KINETIC_STATUS_OPERATION_FAILED, // Device reported an operation error KINETIC_STATUS_VERSION_FAILURE, // Basically a VERSION_MISMATCH error for a PUT KINETIC_STATUS_DATA_ERROR, // Device reported data error, no spaces, HMAC failure } KineticStatus; extern const int KineticStatusDescriptorCount; extern const char* KineticStatusDescriptor[]; // KeyValue meta-data typedef struct _Kinetic_KeyValue typedef struct _KineticKeyValue { ByteArray key; ByteArray newVersion; Loading @@ -215,7 +231,7 @@ typedef struct _Kinetic_KeyValue bool metadataOnly; KineticProto_Synchronization synchronization; ByteArray value; } Kinetic_KeyValue; } KineticKeyValue; // Kinetic PDU Header Loading Loading @@ -257,7 +273,7 @@ typedef struct _KineticPDU uint8_t protobufRaw[PDU_PROTO_MAX_LEN]; // Object meta-data to be used/populated if provided and pertinent to the opearation Kinetic_KeyValue* metadata; KineticKeyValue* metadata; // Value data associated with PDU (if any) uint8_t valueBuffer[PDU_VALUE_MAX_LEN]; Loading
src/lib/kinetic_client.c +35 −27 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ */ #include "kinetic_client.h" #include "kinetic_types_internal.h" #include "kinetic_pdu.h" #include "kinetic_operation.h" #include "kinetic_connection.h" Loading @@ -27,7 +28,7 @@ #include "kinetic_logger.h" #include <stdio.h> KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* operation); KineticStatus KineticClient_ExecuteOperation(KineticOperation* operation); void KineticClient_Init(const char* logFile) { Loading @@ -54,20 +55,20 @@ bool KineticClient_Connect(KineticConnection* connection, return false; } if (key.len < 1) if (hmacKey.len < 1) { LOG("Specified HMAC key is empty!"); return false; } if (key.data == NULL) if (hmacKey.data == NULL) { LOG("Specified HMAC key is NULL!"); return false; } if (!KineticConnection_Connect(connection, host, port, nonBlocking, clusterVersion, identity, key)) clusterVersion, identity, hmacKey)) { connection->connected = false; connection->socketDescriptor = -1; Loading Loading @@ -123,7 +124,7 @@ KineticOperation KineticClient_CreateOperation(KineticConnection* connection, return op; } KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation) KineticStatus KineticClient_NoOp(KineticOperation* operation) { assert(operation->connection != NULL); assert(operation->request != NULL); Loading @@ -136,26 +137,25 @@ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation) return KineticClient_ExecuteOperation(operation); } KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation, const Kinetic_KeyValue* metadata, const ByteArray value) KineticStatus KineticClient_Put(KineticOperation* operation, const KineticKeyValue* metadata) { assert(operation->connection != NULL); assert(operation->request != NULL); assert(operation->response != NULL); assert(value.data != NULL); assert(value.len <= PDU_VALUE_MAX_LEN); assert(metadata != NULL); assert(metadata->value.data != NULL); assert(metadata->value.len <= PDU_VALUE_MAX_LEN); // Initialize request KineticOperation_BuildPut(operation, metadata, value); KineticOperation_BuildPut(operation, metadata); // Execute the operation return KineticClient_ExecuteOperation(operation); } KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, const Kinetic_KeyValue* metadata, const ByteArray value) KineticStatus KineticClient_Get(KineticOperation* operation, KineticKeyValue* metadata) { assert(operation->connection != NULL); assert(operation->request != NULL); Loading @@ -164,30 +164,38 @@ KineticProto_Status_StatusCode KineticClient_Get(KineticOperation* operation, assert(metadata->key.data != NULL); assert(metadata->key.len <= KINETIC_MAX_KEY_LEN); ByteArray responseValue = BYTE_ARRAY_NONE; if (!metadata->metadataOnly) { if (value.data != NULL) { responseValue = value; } else if (metadata->value.data == NULL) { responseValue = (ByteArray){.data = operation->response->valueBuffer}; metadata->value = (ByteArray){ .data = operation->response->valueBuffer, .len = PDU_VALUE_MAX_LEN}; } } // Initialize request KineticOperation_BuildGet(operation, metadata, responseValue); KineticOperation_BuildGet(operation, metadata); // Execute the operation return KineticClient_ExecuteOperation(operation); KineticStatus status = KineticClient_ExecuteOperation(operation); // Update the metadata with the received value length upon success if (status == KINETIC_STATUS_SUCCESS) { metadata->value.len = operation->response->value.len; } else { metadata->value.len = 0; } return status; } KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* operation) KineticStatus KineticClient_ExecuteOperation(KineticOperation* operation) { KineticProto_Status_StatusCode status = KINETIC_PROTO_STATUS_STATUS_CODE_INVALID_STATUS_CODE; KineticStatus status = KINETIC_STATUS_INVALID; // Send the request if (KineticPDU_Send(operation->request)) Loading @@ -198,7 +206,7 @@ KineticProto_Status_StatusCode KineticClient_ExecuteOperation(KineticOperation* // Receive the response if (KineticPDU_Receive(operation->response)) { status = KineticPDU_Status(operation->response); status = KineticOperation_GetStatus(operation); } } Loading
src/lib/kinetic_connection.h +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ #ifndef _KINETIC_CONNECTION_H #define _KINETIC_CONNECTION_H #include "kinetic_types.h" #include "kinetic_types_internal.h" bool KineticConnection_Connect(KineticConnection* connection, const char* host, Loading