1/*
2 * particle_string.c
3 *
4 * Copyright (C) 2015 Aerospike, Inc.
5 *
6 * Portions may be licensed to Aerospike, Inc. under one or more contributor
7 * license agreements.
8 *
9 * This program is free software: you can redistribute it and/or modify it under
10 * the terms of the GNU Affero General Public License as published by the Free
11 * Software Foundation, either version 3 of the License, or (at your option) any
12 * later version.
13 *
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
17 * details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see http://www.gnu.org/licenses/
21 */
22
23
24#include <stddef.h>
25#include <stdint.h>
26
27#include "aerospike/as_string.h"
28#include "aerospike/as_val.h"
29
30#include "fault.h"
31
32#include "base/datamodel.h"
33#include "base/particle.h"
34#include "base/particle_blob.h"
35
36
37//==========================================================
38// STRING particle interface - function declarations.
39//
40
41// Most STRING particle table functions just use the equivalent BLOB particle
42// functions. Here are the differences...
43
44// Handle as_val translation.
45uint32_t string_size_from_asval(const as_val *val);
46void string_from_asval(const as_val *val, as_particle **pp);
47as_val *string_to_asval(const as_particle *p);
48uint32_t string_asval_wire_size(const as_val *val);
49uint32_t string_asval_to_wire(const as_val *val, uint8_t *wire);
50
51
52//==========================================================
53// STRING particle interface - vtable.
54//
55
56const as_particle_vtable string_vtable = {
57 blob_destruct,
58 blob_size,
59
60 blob_concat_size_from_wire,
61 blob_append_from_wire,
62 blob_prepend_from_wire,
63 blob_incr_from_wire,
64 blob_size_from_wire,
65 blob_from_wire,
66 blob_compare_from_wire,
67 blob_wire_size,
68 blob_to_wire,
69
70 string_size_from_asval,
71 string_from_asval,
72 string_to_asval,
73 string_asval_wire_size,
74 string_asval_to_wire,
75
76 blob_size_from_msgpack,
77 blob_from_msgpack,
78
79 blob_skip_flat,
80 blob_cast_from_flat,
81 blob_from_flat,
82 blob_flat_size,
83 blob_to_flat
84};
85
86
87//==========================================================
88// Typedefs & constants.
89//
90
91// Same as related BLOB struct. TODO - just expose BLOB structs?
92
93typedef struct string_mem_s {
94 uint8_t type;
95 uint32_t sz;
96 uint8_t data[];
97} __attribute__ ((__packed__)) string_mem;
98
99
100//==========================================================
101// STRING particle interface - function definitions.
102//
103
104// Most STRING particle table functions just use the equivalent BLOB particle
105// functions. Here are the differences...
106
107//------------------------------------------------
108// Handle as_val translation.
109//
110
111uint32_t
112string_size_from_asval(const as_val *val)
113{
114 return (uint32_t)(sizeof(string_mem) + as_string_len(as_string_fromval(val)));
115}
116
117void
118string_from_asval(const as_val *val, as_particle **pp)
119{
120 string_mem *p_string_mem = (string_mem *)*pp;
121
122 as_string *string = as_string_fromval(val);
123
124 p_string_mem->type = AS_PARTICLE_TYPE_STRING;
125 p_string_mem->sz = (uint32_t)as_string_len(string);
126 memcpy(p_string_mem->data, as_string_tostring(string), p_string_mem->sz);
127}
128
129as_val *
130string_to_asval(const as_particle *p)
131{
132 string_mem *p_string_mem = (string_mem *)p;
133
134 uint8_t *value = cf_malloc(p_string_mem->sz + 1);
135
136 memcpy(value, p_string_mem->data, p_string_mem->sz);
137 value[p_string_mem->sz] = 0;
138
139 return (as_val *)as_string_new_wlen((char *)value, p_string_mem->sz, true);
140}
141
142uint32_t
143string_asval_wire_size(const as_val *val)
144{
145 return as_string_len(as_string_fromval(val));
146}
147
148uint32_t
149string_asval_to_wire(const as_val *val, uint8_t *wire)
150{
151 as_string *string = as_string_fromval(val);
152 uint32_t size = (uint32_t)as_string_len(string);
153
154 memcpy(wire, as_string_tostring(string), size);
155
156 return size;
157}
158
159
160//==========================================================
161// as_bin particle functions specific to STRING.
162//
163
164uint32_t
165as_bin_particle_string_ptr(const as_bin *b, char **p_value)
166{
167 // Caller must ensure this is called only for STRING particles.
168 string_mem *p_string_mem = (string_mem *)b->particle;
169
170 *p_value = (char *)p_string_mem->data;
171
172 return p_string_mem->sz;
173}
174