1use bigdecimal::BigDecimal;
2use bytebuffer::ByteBuffer;
3use chrono::{DateTime, Utc};
4
5use crate::{*};
6
7impl Value for Option<bool> {
8 fn get_write_length(&self) -> i32 {
9 return 2;
10 }
11
12 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
13 bytebuffer.write_i8(TINYINT_COLUMN);
14 self.marshal_in_table(bytebuffer, TINYINT_COLUMN)
15 }
16
17 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
18 match self {
19 None => {
20 bytebuffer.write_bytes(&NULL_BIT_VALUE)
21 }
22 Some(v) => {
23 v.marshal_in_table(bytebuffer, TINYINT_COLUMN)
24 }
25 }
26 }
27
28 fn to_value_string(&self) -> String {
29 return format!("{:?}", self);
30 }
31
32 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
33 if bs == NULL_BIT_VALUE {
34 return Ok(Option::None);
35 }
36 return Ok(Some(bool::from_bytes(bs, _column)?));
37 }
38}
39
40
41impl Value for Option<BigDecimal> {
42 fn get_write_length(&self) -> i32 {
43 return 17;
44 }
45
46 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
47 bytebuffer.write_i8(DECIMAL_COLUMN);
48 self.marshal_in_table(bytebuffer, DECIMAL_COLUMN);
49 }
50
51 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
52 match self {
53 None => {
54 bytebuffer.write_bytes(&NULL_DECIMAL)
55 }
56 Some(v) => {
57 v.marshal_in_table(bytebuffer, DECIMAL_COLUMN)
58 }
59 }
60 }
61
62 fn to_value_string(&self) -> String {
63 return format!("{:?}", self);
64 }
65
66 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> where Self: Sized {
67 if bs == NULL_DECIMAL {
68 return Ok(Option::None);
69 }
70 Ok(Some(BigDecimal::from_bytes(bs, _column)?))
71 }
72}
73
74impl Value for Option<i8> {
75 fn get_write_length(&self) -> i32 {
76 return 2;
77 }
78
79 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
80 bytebuffer.write_i8(TINYINT_COLUMN);
81 self.marshal_in_table(bytebuffer, TINYINT_COLUMN)
82 }
83
84 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
85 match self {
86 None => {
87 bytebuffer.write_bytes(&NULL_BIT_VALUE)
88 }
89 Some(v) => {
90 v.marshal_in_table(bytebuffer, TINYINT_COLUMN)
91 }
92 }
93 }
94
95 fn to_value_string(&self) -> String {
96 return format!("{:?}", self);
97 }
98
99 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
100 if bs == NULL_BIT_VALUE {
101 return Ok(Option::None);
102 }
103 return Ok(Some(i8::from_bytes(bs, _column)?));
104 }
105}
106
107impl Value for Option<u8> {
108 fn get_write_length(&self) -> i32 {
109 return 2;
110 }
111
112 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
113 bytebuffer.write_i8(TINYINT_COLUMN);
114 self.marshal_in_table(bytebuffer, TINYINT_COLUMN)
115 }
116
117 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
118 match self {
119 None => {
120 bytebuffer.write_bytes(&NULL_BIT_VALUE)
121 }
122 Some(v) => {
123 v.marshal_in_table(bytebuffer, TINYINT_COLUMN)
124 }
125 }
126 }
127
128 fn to_value_string(&self) -> String {
129 return format!("{:?}", self);
130 }
131
132 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
133 if bs == NULL_BIT_VALUE {
134 return Ok(Option::None);
135 }
136 return Ok(Some(u8::from_bytes(bs, _column)?));
137 }
138}
139
140impl Value for Option<i16> {
141 fn get_write_length(&self) -> i32 {
142 return 3;
143 }
144
145 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
146 bytebuffer.write_i8(SHORT_COLUMN);
147 self.marshal_in_table(bytebuffer, SHORT_COLUMN);
148 }
149
150 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
151 match self {
152 None => {
153 bytebuffer.write_bytes(&NULL_SHORT_VALUE)
154 }
155 Some(v) => {
156 v.marshal_in_table(bytebuffer, SHORT_COLUMN)
157 }
158 }
159 }
160
161 fn to_value_string(&self) -> String {
162 return format!("{:?}", self);
163 }
164
165 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
166 if bs == NULL_SHORT_VALUE {
167 return Ok(Option::None);
168 }
169 return Ok(Some(i16::from_bytes(bs, _column)?));
170 }
171}
172
173impl Value for Option<u16> {
174 fn get_write_length(&self) -> i32 {
175 return 3;
176 }
177
178 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
179 bytebuffer.write_i8(SHORT_COLUMN);
180 self.marshal_in_table(bytebuffer, SHORT_COLUMN);
181 }
182
183 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
184 match self {
185 None => {
186 bytebuffer.write_bytes(&NULL_SHORT_VALUE)
187 }
188 Some(v) => {
189 v.marshal_in_table(bytebuffer, SHORT_COLUMN)
190 }
191 }
192 }
193
194 fn to_value_string(&self) -> String {
195 return format!("{:?}", self);
196 }
197
198 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
199 if bs == NULL_SHORT_VALUE {
200 return Ok(Option::None);
201 }
202 return Ok(Some(u16::from_bytes(bs, _column)?));
203 }
204}
205
206impl Value for Option<i32> {
207 fn get_write_length(&self) -> i32 {
208 return 5;
209 }
210
211 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
212 bytebuffer.write_i8(INT_COLUMN);
213 self.marshal_in_table(bytebuffer, INT_COLUMN);
214 }
215
216 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
217 match self {
218 None => {
219 bytebuffer.write_bytes(&NULL_INT_VALUE)
220 }
221 Some(v) => {
222 v.marshal_in_table(bytebuffer, INT_COLUMN)
223 }
224 }
225 }
226
227 fn to_value_string(&self) -> String {
228 return format!("{:?}", self);
229 }
230
231 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
232 if bs == NULL_INT_VALUE {
233 return Ok(Option::None);
234 }
235 return Ok(Some(i32::from_bytes(bs, _column)?));
236 }
237}
238
239impl Value for Option<u32> {
240 fn get_write_length(&self) -> i32 {
241 return 5;
242 }
243
244 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
245 bytebuffer.write_i8(INT_COLUMN);
246 self.marshal_in_table(bytebuffer, INT_COLUMN);
247 }
248
249 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
250 match self {
251 None => {
252 bytebuffer.write_bytes(&NULL_INT_VALUE)
253 }
254 Some(v) => {
255 v.marshal_in_table(bytebuffer, INT_COLUMN)
256 }
257 }
258 }
259
260 fn to_value_string(&self) -> String {
261 return format!("{:?}", self);
262 }
263
264 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
265 if bs == NULL_INT_VALUE {
266 return Ok(Option::None);
267 }
268 return Ok(Some(u32::from_bytes(bs, _column)?));
269 }
270}
271
272impl Value for Option<i64> {
273 fn get_write_length(&self) -> i32 {
274 return 9;
275 }
276 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
277 bytebuffer.write_i8(LONG_COLUMN);
278 self.marshal_in_table(bytebuffer, LONG_COLUMN);
279 }
280
281 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
282 match self {
283 None => {
284 bytebuffer.write_bytes(&NULL_LONG_VALUE)
285 }
286 Some(v) => {
287 v.marshal_in_table(bytebuffer, LONG_COLUMN)
288 }
289 }
290 }
291
292 fn to_value_string(&self) -> String {
293 return format!("{:?}", self);
294 }
295
296 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
297 if bs == NULL_LONG_VALUE {
298 return Ok(Option::None);
299 }
300 return Ok(Some(i64::from_bytes(bs, _column)?));
301 }
302}
303
304impl Value for Option<u64> {
305 fn get_write_length(&self) -> i32 {
306 return 9;
307 }
308
309 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
310 bytebuffer.write_i8(LONG_COLUMN);
311 self.marshal_in_table(bytebuffer, LONG_COLUMN);
312 }
313
314 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
315 match self {
316 None => {
317 bytebuffer.write_bytes(&NULL_LONG_VALUE)
318 }
319 Some(v) => {
320 v.marshal_in_table(bytebuffer, LONG_COLUMN)
321 }
322 }
323 }
324
325 fn to_value_string(&self) -> String {
326 return format!("{:?}", self);
327 }
328
329 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
330 if bs == NULL_LONG_VALUE {
331 return Ok(Option::None);
332 }
333 return Ok(Some(u64::from_bytes(bs, _column)?));
334 }
335}
336
337impl Value for Option<f64> {
338 fn get_write_length(&self) -> i32 {
339 return 9;
340 }
341
342 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
343 bytebuffer.write_i8(FLOAT_COLUMN);
344 self.marshal_in_table(bytebuffer, FLOAT_COLUMN);
345 }
346
347 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
348 match self {
349 None => {
350 bytebuffer.write_bytes(&NULL_FLOAT_VALUE)
351 }
352 Some(v) => {
353 v.marshal_in_table(bytebuffer, FLOAT_COLUMN)
354 }
355 }
356 }
357
358 fn to_value_string(&self) -> String {
359 return format!("{:?}", self);
360 }
361
362 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
363 if bs == NULL_FLOAT_VALUE {
364 return Ok(Option::None);
365 }
366 return Ok(Some(f64::from_bytes(bs, _column)?));
367 }
368}
369
370
371impl Value for Option<String> {
372 fn get_write_length(&self) -> i32 {
373 match self {
374 None => {
375 return 5;
376 }
377 Some(v) => {
378 return (5 + v.len()) as i32;
379 }
380 }
381 }
382
383 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
384 bytebuffer.write_i8(STRING_COLUMN);
385 match self {
386 None => {
387 bytebuffer.write_bytes(&NULL_VARCHAR)
388 }
389 Some(v) => {
390 v.marshal_in_table(bytebuffer, STRING_COLUMN)
391 }
392 }
393 }
394
395 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
396 match self {
397 None => {
398 bytebuffer.write_bytes(&NULL_VARCHAR)
399 }
400 Some(v) => {
401 v.marshal_in_table(bytebuffer, STRING_COLUMN)
402 }
403 }
404 }
405
406 fn to_value_string(&self) -> String {
407 return format!("{:?}", self);
408 }
409
410 fn from_bytes(bs: Vec<u8>, table_column: &Column) -> Result<Self, VoltError> {
411 return match table_column.header_type {
412 STRING_COLUMN => {
413 if bs == NULL_VARCHAR {
414 return Ok(Option::None);
415 }
416 let mut buffer = ByteBuffer::from_bytes(&bs);
417 Ok(Option::Some(buffer.read_string()?))
418 }
419 _ => {
420 let res = crate::table::VoltTable::get_value_by_idx_column(table_column, bs)?;
421 match res {
422 Some(v) => {
423 Ok(Option::Some(v.to_value_string()))
424 }
425 None => {
426 Ok(Option::None)
427 }
428 }
429 }
430 };
431 }
432}
433
434impl Value for Option<&str> {
435 fn get_write_length(&self) -> i32 {
436 match self {
437 None => {
438 return 5;
439 }
440 Some(v) => {
441 return (5 + v.len()) as i32;
442 }
443 }
444 }
445
446
447 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
448 bytebuffer.write_i8(STRING_COLUMN);
449 match self {
450 None => {
451 bytebuffer.write_bytes(&NULL_VARCHAR)
452 }
453 Some(v) => {
454 v.marshal_in_table(bytebuffer, STRING_COLUMN)
455 }
456 }
457 }
458
459 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
460 match self {
461 None => {
462 bytebuffer.write_bytes(&NULL_VARCHAR)
463 }
464 Some(v) => {
465 v.marshal_in_table(bytebuffer, STRING_COLUMN)
466 }
467 }
468 }
469
470 fn to_value_string(&self) -> String {
471 return format!("{:?}", self);
472 }
473
474 fn from_bytes(_bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
475 todo!()
476 }
477}
478
479impl Value for Option<Vec<u8>> {
480 fn get_write_length(&self) -> i32 {
481 match self {
482 None => {
483 return 5;
484 }
485 Some(v) => {
486 return (5 + v.len()) as i32;
487 }
488 }
489 }
490
491 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
492 bytebuffer.write_i8(VAR_BIN_COLUMN);
493 match self {
494 None => {
495 bytebuffer.write_bytes(&NULL_VARCHAR)
496 }
497 Some(v) => {
498 bytebuffer.write_bytes(&v);
499 }
500 }
501 }
502
503 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
504 match self {
505 None => {
506 bytebuffer.write_bytes(&NULL_VARCHAR)
507 }
508 Some(v) => {
509 bytebuffer.write_bytes(&v);
510 }
511 }
512 }
513
514 fn to_value_string(&self) -> String {
515 return format!("{:?}", self);
516 }
517
518 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
519 if bs == NULL_VARCHAR {
520 let res: Option<Vec<u8>> = Option::None;
521 return Ok(res);
522 }
523 let mut cp = bs.clone();
524 cp.drain(0..4);
525 return Ok(Option::Some(cp));
526 }
527}
528
529
530impl Value for Option<DateTime<Utc>> {
531 fn get_write_length(&self) -> i32 {
532 return 9;
533 }
534 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
535 bytebuffer.write_i8(TIMESTAMP_COLUMN);
536 match self {
537 None => {
538 bytebuffer.write_bytes(&NULL_TIMESTAMP)
539 }
540 Some(v) => {
541 v.marshal_in_table(bytebuffer, TIMESTAMP_COLUMN)
542 }
543 }
544 }
545
546
547 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
548 match self {
549 None => {
550 bytebuffer.write_bytes(&NULL_TIMESTAMP)
551 }
552 Some(v) => {
553 v.marshal_in_table(bytebuffer, TIMESTAMP_COLUMN)
554 }
555 }
556 }
557
558 fn to_value_string(&self) -> String {
559 return format!("{:?}", self);
560 }
561
562 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> where Self: Sized {
563 if bs == NULL_TIMESTAMP {
564 return Ok(Option::None);
565 }
566 return Ok(Option::Some(DateTime::from_bytes(bs, _column)?));
567 }
568}