20 #include <aerospike/as_buffer.h>
26 #include <citrusleaf/cf_byte_order.h>
27 #include <citrusleaf/cf_digest.h>
38 #define AS_FIELD_NAMESPACE 0
39 #define AS_FIELD_SETNAME 1
40 #define AS_FIELD_KEY 2
41 #define AS_FIELD_DIGEST 4
42 #define AS_FIELD_DIGEST_ARRAY 6
43 #define AS_FIELD_TASK_ID 7
44 #define AS_FIELD_SCAN_OPTIONS 8
45 #define AS_FIELD_INDEX_RANGE 22
46 #define AS_FIELD_INDEX_FILTER 23
47 #define AS_FIELD_INDEX_LIMIT 24
48 #define AS_FIELD_INDEX_ORDER 25
49 #define AS_FIELD_INDEX_TYPE 26
50 #define AS_FIELD_UDF_PACKAGE_NAME 30
51 #define AS_FIELD_UDF_FUNCTION 31
52 #define AS_FIELD_UDF_ARGLIST 32
53 #define AS_FIELD_UDF_OP 33
54 #define AS_FIELD_QUERY_BINS 40
55 #define AS_FIELD_BATCH_INDEX 41
56 #define AS_FIELD_BATCH_INDEX_WITH_SET 42
59 #define AS_MSG_INFO1_READ (1 << 0) // contains a read operation
60 #define AS_MSG_INFO1_GET_ALL (1 << 1) // get all bins, period
62 #define AS_MSG_INFO1_BATCH_INDEX (1 << 3) // batch read
63 #define AS_MSG_INFO1_XDR (1 << 4) // operation is being performed by XDR
64 #define AS_MSG_INFO1_GET_NOBINDATA (1 << 5) // do not get information about bins and its data
65 #define AS_MSG_INFO1_CONSISTENCY_ALL (1 << 6) // read consistency level - bit 0
69 #define AS_MSG_INFO2_WRITE (1 << 0) // contains a write semantic
70 #define AS_MSG_INFO2_DELETE (1 << 1) // delete record
71 #define AS_MSG_INFO2_GENERATION (1 << 2) // pay attention to the generation
72 #define AS_MSG_INFO2_GENERATION_GT (1 << 3) // apply write if new generation >= old, good for restore
73 #define AS_MSG_INFO2_DURABLE_DELETE (1 << 4) // transaction resulting in record deletion leaves tombstone (Enterprise only).
74 #define AS_MSG_INFO2_CREATE_ONLY (1 << 5) // write record only if it doesn't exist
76 #define AS_MSG_INFO2_RESPOND_ALL_OPS (1 << 7) // return a result for every operation.
79 #define AS_MSG_INFO3_LAST (1 << 0) // this is the last of a multi-part message
80 #define AS_MSG_INFO3_COMMIT_MASTER (1 << 1) // write commit level - bit 0
82 #define AS_MSG_INFO3_UPDATE_ONLY (1 << 3) // update existing record only, do not create new record
83 #define AS_MSG_INFO3_CREATE_OR_REPLACE (1 << 4) // completely replace existing record, or create new record
84 #define AS_MSG_INFO3_REPLACE_ONLY (1 << 5) // completely replace existing record, do not create new record
89 #define AS_MESSAGE_VERSION 2L
90 #define AS_MESSAGE_TYPE 3L
91 #define AS_COMPRESSED_MESSAGE_TYPE 4L
94 #define AS_INFO_MESSAGE_VERSION 2L
95 #define AS_INFO_MESSAGE_TYPE 1L
98 #define AS_HEADER_SIZE 30
99 #define AS_FIELD_HEADER_SIZE 5
100 #define AS_OPERATION_HEADER_SIZE 8
102 #define AS_STACK_BUF_SIZE (1024 * 16)
113 return cf_malloc(size);
119 return cf_free(memory);
126 #define as_command_init(_sz) (_sz > AS_STACK_BUF_SIZE) ? (uint8_t*)local_malloc(_sz) : (uint8_t*)alloca(_sz)
132 #define as_command_free(_buf, _sz) if (_sz > AS_STACK_BUF_SIZE) {local_free(_buf);}
142 typedef struct as_command_node_s {
154 typedef struct as_command_parse_result_data_s {
220 size_t s = strlen(name);
247 uint32_t timeout_ms, uint16_t
n_fields, uint16_t n_bins,
bool durable_delete);
253 static inline uint8_t*
255 uint32_t timeout_ms, uint16_t
n_fields, uint16_t n_bins)
263 memset(&cmd[10], 0, 12);
264 *(uint32_t*)&cmd[22] = cf_swap_to_be32(timeout_ms);
265 *(uint16_t*)&cmd[26] = cf_swap_to_be16(n_fields);
266 *(uint16_t*)&cmd[28] = cf_swap_to_be16(n_bins);
274 static inline uint8_t*
277 *(uint32_t*)p = cf_swap_to_be32(size+1);
287 static inline uint8_t*
304 static inline uint8_t*
308 *(uint64_t*)p = cf_swap_to_be64(val);
309 return p +
sizeof(uint64_t);
316 static inline uint8_t*
320 memcpy(p, buffer->data, buffer->size);
321 return p + buffer->size;
328 static inline uint8_t*
347 static inline uint8_t*
357 *(uint32_t*)cmd = cf_swap_to_be32((uint32_t)name_len + 4);
380 uint64_t len = end - begin;
382 *(uint64_t*)begin = cf_swap_to_be64(proto);
393 uint64_t len = end - begin;
395 *(uint64_t*)begin = cf_swap_to_be64(proto);
424 uint32_t timeout_ms, uint32_t retry,