1use std::fmt::Debug;
2use std::str::Utf8Error;
3use std::sync::PoisonError;
4
5use bigdecimal::BigDecimal;
6use bigdecimal::num_bigint::BigInt;
7use bytebuffer::ByteBuffer;
8use chrono::{DateTime, Utc};
9use quick_error::quick_error;
10
11use crate::chrono::TimeZone;
12use crate::Column;
13use crate::response::VoltResponseInfo;
14
15#[allow(dead_code)]
16pub const ARRAY_COLUMN: i8 = -99;
17pub const NULL_COLUMN: i8 = 1;
18pub const TINYINT_COLUMN: i8 = 3;
19pub const SHORT_COLUMN: i8 = 4;
20pub const INT_COLUMN: i8 = 5;
21pub const LONG_COLUMN: i8 = 6;
22pub const FLOAT_COLUMN: i8 = 8;
23pub const STRING_COLUMN: i8 = 9;
24pub const TIMESTAMP_COLUMN: i8 = 11;
25pub const TABLE: i8 = 21;
26pub const DECIMAL_COLUMN: i8 = 22;
27pub const VAR_BIN_COLUMN: i8 = 25; pub const NULL_DECIMAL: [u8; 16] = [128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
31
32pub const NULL_BIT_VALUE: [u8; 1] = [128];
33pub const NULL_SHORT_VALUE: [u8; 2] = [128, 0];
34pub const NULL_INT_VALUE: [u8; 4] = [128, 0, 0, 0];
35pub const NULL_LONG_VALUE: [u8; 8] = [128, 0, 0, 0, 0, 0, 0, 0];
36pub const NULL_TIMESTAMP: [u8; 8] = [128, 0, 0, 0, 0, 0, 0, 0];
37
38
39pub const NULL_FLOAT_VALUE: [u8; 8] = [255, 239, 255, 255, 255, 255, 255, 255];
40pub const NULL_VARCHAR: [u8; 4] = [255, 255, 255, 255];
41
42
43quick_error! {
44#[derive(Debug)]
45pub enum VoltError {
46 Io(err: std::io::Error) {
47 from()
48 display("I/O error: {}", err)
49 source(err)
50 }
51
52 RecvError(err: std::sync::mpsc::RecvError){
53 from()
54 display("Recv error: {}", err)
55 source(err)
56 }
57
58 ExecuteFail ( info: VoltResponseInfo ){
59 display("volt execute failed: {:?}", info)
60 }
61 InvalidColumnType(tp: i8) {
62 display("InvalidColumnType {}", tp)
63 }
64
65 NoValue (descr : String) {
66 display("Error {}", descr)
67 }
68 Other(descr: String) {
69 display("Error {}", descr)
70 }
71 NegativeNumTables (num: i16) {
72 display("Error {}", num)
73 }
74
75 Utf8Error(err : Utf8Error){
76 from()
77 display("Utf8 error: {}", err)
78 source(err)
79 }
80
81 PoisonError (descr: String){
82 display("Error {}", descr)
83 }
84 BadReturnStatusOnTable (status: i8) {
85 display("Error {}", status)
86 }
87 AuthFailed {
88 display("Auth failed")
89 }
90 ConnectionNotAvailable {
91 display("Connection lost")
92 }
93 InvalidConfig {
94 display("Invalid Config")
95 }
96 Timeout
97
98
99}}
100
101impl<T> From<PoisonError<T>> for VoltError {
102 fn from(p: PoisonError<T>) -> VoltError {
103 VoltError::PoisonError(p.to_string().to_owned())
104 }
105}
106
107pub trait ValuePrimary {}
108
109pub trait Value: Debug {
111 fn get_write_length(&self) -> i32;
112 fn marshal(&self, bytebuffer: &mut ByteBuffer);
113 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8);
114 fn to_value_string(&self) -> String;
115 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> where Self: Sized;
116}
117
118
119trait WriteBool {
120 fn write_bool(&mut self, val: bool);
121}
122
123impl WriteBool for ByteBuffer {
124 fn write_bool(&mut self, val: bool) {
125 if val {
126 self.write_i8(1)
127 } else {
128 self.write_i8(0);
129 }
130 }
131}
132
133
134impl Value for bool {
135 fn get_write_length(&self) -> i32 {
136 return 2;
137 }
138
139 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
140 bytebuffer.write_i8(TINYINT_COLUMN);
141 bytebuffer.write_bool(*self);
142 }
143
144 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
145 bytebuffer.write_bool(*self);
146 }
147
148 fn to_value_string(&self) -> String {
149 return self.to_string();
150 }
151
152 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
153 if bs[0] == 0 {
154 return Ok(false);
155 }
156 return Ok(true);
157 }
158}
159
160
161impl Value for BigDecimal {
162 fn get_write_length(&self) -> i32 {
163 return 17;
164 }
165
166 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
167 bytebuffer.write_i8(DECIMAL_COLUMN);
168 self.marshal_in_table(bytebuffer, DECIMAL_COLUMN);
169 }
170
171 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
172 let (b, _) = self.clone().with_scale(12).into_bigint_and_exponent();
173 let bs = b.to_signed_bytes_be();
174 let pad = 16 - bs.len();
175 if pad > 0 {
176 let arr = vec![0; pad];
177 bytebuffer.write_bytes(&arr)
178 }
179 bytebuffer.write_bytes(&bs);
180 }
181
182 fn to_value_string(&self) -> String {
183 return self.to_string();
184 }
185
186 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> where Self: Sized {
187 let int = BigInt::from_signed_bytes_be(&*bs);
188 let decimal = BigDecimal::new(int, 12);
189 return Ok(decimal);
190 }
191}
192
193impl Value for i8 {
194 fn get_write_length(&self) -> i32 {
195 return 2;
196 }
197
198 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
199 bytebuffer.write_i8(TINYINT_COLUMN);
200 bytebuffer.write_i8(*self);
201 }
202
203 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
204 bytebuffer.write_i8(*self);
206 }
207
208 fn to_value_string(&self) -> String {
209 return self.to_string();
210 }
211
212 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
213 let mut buffer = ByteBuffer::from_bytes(&bs);
214 let value = buffer.read_i8()?;
215 return Ok(value);
216 }
217}
218
219impl Value for u8 {
220 fn get_write_length(&self) -> i32 {
221 return 2;
222 }
223
224 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
225 bytebuffer.write_i8(TINYINT_COLUMN);
226 bytebuffer.write_u8(*self);
227 }
228
229 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
230 bytebuffer.write_u8(*self);
232 }
233
234 fn to_value_string(&self) -> String {
235 return self.to_string();
236 }
237
238 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
239 let mut buffer = ByteBuffer::from_bytes(&bs);
240 let value = buffer.read_u8()?;
241 return Ok(value);
242 }
243}
244
245impl Value for i16 {
246 fn get_write_length(&self) -> i32 {
247 return 3;
248 }
249
250 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
251 bytebuffer.write_i8(SHORT_COLUMN);
252 bytebuffer.write_i16(*self);
253 }
254
255 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
256 bytebuffer.write_i16(*self);
258 }
259
260 fn to_value_string(&self) -> String {
261 return self.to_string();
262 }
263
264 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
265 let mut buffer = ByteBuffer::from_bytes(&bs);
266 let value = buffer.read_i16()?;
267 return Ok(value);
268 }
269}
270
271impl Value for u16 {
272 fn get_write_length(&self) -> i32 {
273 return 3;
274 }
275
276 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
277 bytebuffer.write_i8(SHORT_COLUMN);
278 bytebuffer.write_u16(*self);
279 }
280
281 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
282 bytebuffer.write_u16(*self);
284 }
285
286 fn to_value_string(&self) -> String {
287 return self.to_string();
288 }
289
290 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
291 let mut buffer = ByteBuffer::from_bytes(&bs);
292 let value = buffer.read_u16()?;
293 return Ok(value);
294 }
295}
296
297impl Value for i32 {
298 fn get_write_length(&self) -> i32 {
299 return 5;
300 }
301
302 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
303 bytebuffer.write_i8(INT_COLUMN);
304 bytebuffer.write_i32(*self);
305 }
306
307 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
308 bytebuffer.write_i32(*self);
310 }
311
312 fn to_value_string(&self) -> String {
313 return self.to_string();
314 }
315
316 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
317 let mut buffer = ByteBuffer::from_bytes(&bs);
318 let value = buffer.read_i32()?;
319 return Ok(value);
320 }
321}
322
323impl Value for u32 {
324 fn get_write_length(&self) -> i32 {
325 return 5;
326 }
327
328 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
329 bytebuffer.write_i8(INT_COLUMN);
330 bytebuffer.write_u32(*self);
331 }
332
333 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
334 bytebuffer.write_u32(*self);
336 }
337
338 fn to_value_string(&self) -> String {
339 return self.to_string();
340 }
341
342 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
343 let mut buffer = ByteBuffer::from_bytes(&bs);
344 let value = buffer.read_u32()?;
345 return Ok(value);
346 }
347}
348
349impl Value for i64 {
350 fn get_write_length(&self) -> i32 {
351 return 9;
352 }
353
354 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
355 bytebuffer.write_i8(LONG_COLUMN);
356 bytebuffer.write_i64(*self);
357 }
358
359 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
360 bytebuffer.write_i64(*self);
362 }
363
364 fn to_value_string(&self) -> String {
365 return self.to_string();
366 }
367
368 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
369 let mut buffer = ByteBuffer::from_bytes(&bs);
370 let value = buffer.read_i64()?;
371 return Ok(value);
372 }
373}
374
375impl Value for u64 {
376 fn get_write_length(&self) -> i32 {
377 return 9;
378 }
379
380 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
381 bytebuffer.write_i8(LONG_COLUMN);
382 bytebuffer.write_u64(*self);
383 }
384
385 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
386 bytebuffer.write_u64(*self);
388 }
389
390 fn to_value_string(&self) -> String {
391 return self.to_string();
392 }
393
394 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
395 let mut buffer = ByteBuffer::from_bytes(&bs);
396 let value = buffer.read_u64()?;
397 return Ok(value);
398 }
399}
400
401impl Value for f64 {
402 fn get_write_length(&self) -> i32 {
403 return 9;
404 }
405
406 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
407 bytebuffer.write_i8(FLOAT_COLUMN);
408 bytebuffer.write_f64(*self);
409 }
410
411 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
412 bytebuffer.write_f64(*self);
413 }
414
415 fn to_value_string(&self) -> String {
416 return self.to_string();
417 }
418
419 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
420 let mut buffer = ByteBuffer::from_bytes(&bs);
421 let value = buffer.read_f64()?;
422 return Ok(value);
423 }
424}
425
426
427impl Value for String {
428 fn get_write_length(&self) -> i32 {
429 return (5 + self.len()) as i32;
430 }
431
432 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
433 bytebuffer.write_i8(STRING_COLUMN);
434 bytebuffer.write_string(self);
435 }
436
437 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
438 bytebuffer.write_string(self);
439 }
440
441 fn to_value_string(&self) -> String {
442 return self.to_string();
443 }
444
445 fn from_bytes(bs: Vec<u8>, table_column: &Column) -> Result<Self, VoltError> {
446 return match table_column.header_type {
447 STRING_COLUMN => {
448 let mut buffer = ByteBuffer::from_bytes(&bs);
452 Ok(buffer.read_string()?)
453 }
454 _ => {
455 let res = crate::table::VoltTable::get_value_by_idx_column(table_column, bs)?;
456 match res {
457 Some(v) => {
458 Ok(v.to_value_string())
459 }
460 None => {
461 Ok("".to_string())
462 }
463 }
464 }
465 };
466 }
467}
468
469impl Value for &str {
470 fn get_write_length(&self) -> i32 {
471 return (5 + self.len()) as i32;
472 }
473
474 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
475 bytebuffer.write_i8(STRING_COLUMN);
476 bytebuffer.write_string(self);
478 }
479
480 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
481 bytebuffer.write_string(self);
482 }
483
484 fn to_value_string(&self) -> String {
485 return self.to_string();
486 }
487
488 fn from_bytes(_bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
489 todo!()
490 }
491}
492
493impl Value for Vec<u8> {
494 fn get_write_length(&self) -> i32 {
495 return (5 + self.len()) as i32;
496 }
497
498 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
499 bytebuffer.write_i8(VAR_BIN_COLUMN);
500 bytebuffer.write_u32(self.len() as u32);
501 bytebuffer.write_bytes(&self);
502 }
503
504 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
505 bytebuffer.write_u32(self.len() as u32);
506 bytebuffer.write_bytes(&self);
507 }
508
509 fn to_value_string(&self) -> String {
510 return format!("{:?}", self);
511 }
512
513 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> {
514 let mut cp = bs.clone();
515 cp.drain(0..4);
516 return Ok(cp);
517 }
518}
519
520
521impl Value for DateTime<Utc> {
522 fn get_write_length(&self) -> i32 {
523 return 9;
524 }
525 fn marshal(&self, bytebuffer: &mut ByteBuffer) {
526 bytebuffer.write_i8(TIMESTAMP_COLUMN);
527 bytebuffer.write_i64(self.timestamp_millis() * 1000);
528 }
529
530 fn marshal_in_table(&self, bytebuffer: &mut ByteBuffer, _column_type: i8) {
531 bytebuffer.write_i64(self.timestamp_millis() * 1000);
532 }
533
534 fn to_value_string(&self) -> String {
535 return self.to_string();
536 }
537
538 fn from_bytes(bs: Vec<u8>, _column: &Column) -> Result<Self, VoltError> where Self: Sized {
539 let mut buffer = ByteBuffer::from_bytes(&bs);
540 let time = buffer.read_i64()?;
541 return Ok(Utc.timestamp_millis(time / 1000));
542 }
543}
544
545#[cfg(test)]
546mod tests {
547 use std::str::FromStr;
548
549 use bigdecimal::num_bigint::BigInt;
550 use chrono::TimeZone;
551
552 use crate::procedure_invocation::new_procedure_invocation;
553
554 use super::*;
555
556 #[test]
557 fn test_encoding_proc() {
558 let mut zero_vec: Vec<&dyn Value> = Vec::new();
559 zero_vec.push(&"select * from account limit 1;");
560
561 let mut proc = new_procedure_invocation(1, false, &zero_vec, "@AdHoc");
562 let bs = proc.bytes();
563 assert_eq!(bs, vec!(0, 0, 0, 56, 0, 0, 0, 0, 6, 64, 65, 100, 72, 111, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 9, 0, 0, 0, 30, 115, 101, 108, 101, 99, 116, 32, 42, 32, 102, 114, 111, 109, 32, 97, 99, 99, 111, 117, 110, 116, 32, 108, 105, 109, 105, 116, 32, 49, 59));
564 }
565
566 #[test]
567 fn test_time_stamp() {
568 let time = Utc.timestamp_millis(1637323002445000 / 1000);
569 println!("{}", time.timestamp_millis() * 1000);
570 }
571
572 #[test]
573 fn test_big_decimal() {
574 let bs: Vec<u8> = vec!(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 243, 16, 122, 64, 0);
575 let int = BigInt::from_signed_bytes_be(&*bs);
576 let decimal = BigDecimal::new(int, 12);
577 let (b, _) = decimal.into_bigint_and_exponent();
578 let b = b.to_signed_bytes_be();
579 println!("{:?}", b);
580
581 let decimal = BigDecimal::from_str("1.11").unwrap().with_scale(12);
582 println!("{:?}", decimal.into_bigint_and_exponent());
583 }
584
585 #[test]
586 fn test_big_test_bytes() {
587 let i = ByteBuffer::from_bytes(&NULL_BIT_VALUE).read_i8().unwrap();
588 assert_eq!(i, -128);
589 let i = ByteBuffer::from_bytes(&NULL_SHORT_VALUE).read_i16().unwrap();
590 assert_eq!(i, -32768);
591 let i = ByteBuffer::from_bytes(&NULL_INT_VALUE).read_i32().unwrap();
592 assert_eq!(i, -2147483648);
593 let i = ByteBuffer::from_bytes(&NULL_LONG_VALUE).read_i64().unwrap();
594 assert_eq!(i, -9223372036854775808);
595
596 let column = Column {
597 header_name: "".to_string(),
598 header_type: STRING_COLUMN,
599 };
600
601 let vec = NULL_BIT_VALUE.to_vec();
602 let op: Option<i8> = Option::from_bytes(vec, &column).unwrap();
603 assert_eq!(None, op);
604 let vec = NULL_BIT_VALUE.to_vec();
605 let op: Option<u8> = Option::from_bytes(vec, &column).unwrap();
606 assert_eq!(None, op);
607 let vec = NULL_SHORT_VALUE.to_vec();
608 let op: Option<i16> = Option::from_bytes(vec, &column).unwrap();
609 assert_eq!(None, op);
610 let vec = NULL_SHORT_VALUE.to_vec();
611 let op: Option<u16> = Option::from_bytes(vec, &column).unwrap();
612 assert_eq!(None, op);
613 let vec = NULL_INT_VALUE.to_vec();
614 let op: Option<i32> = Option::from_bytes(vec, &column).unwrap();
615 assert_eq!(None, op);
616 let vec = NULL_INT_VALUE.to_vec();
617 let op: Option<u32> = Option::from_bytes(vec, &column).unwrap();
618 assert_eq!(None, op);
619
620 let vec = NULL_LONG_VALUE.to_vec();
621 let op: Option<i64> = Option::from_bytes(vec, &column).unwrap();
622 assert_eq!(None, op);
623 let vec = NULL_LONG_VALUE.to_vec();
624 let op: Option<u64> = Option::from_bytes(vec, &column).unwrap();
625 assert_eq!(None, op);
626
627
628 let vec = NULL_VARCHAR.to_vec();
629 let op: Option<String> = Option::from_bytes(vec, &column).unwrap();
630 assert_eq!(None, op);
631
632 let vec = NULL_VARCHAR.to_vec();
633 let op: Option<Vec<u8>> = Option::from_bytes(vec, &column).unwrap();
634 assert_eq!(None, op);
635
636
637 let vec = NULL_FLOAT_VALUE.to_vec();
638 let op: Option<f64> = Option::from_bytes(vec, &column).unwrap();
639 assert_eq!(None, op);
640
641
642 let vec = NULL_DECIMAL.to_vec();
643 let op: Option<BigDecimal> = Option::from_bytes(vec, &column).unwrap();
644 assert_eq!(None, op);
645
646
647 let vec = NULL_TIMESTAMP.to_vec();
648 let op: Option<DateTime<Utc>> = Option::from_bytes(vec, &column).unwrap();
649 assert_eq!(None, op);
650 }
651
652 #[test]
653 fn test_error() {
654 let err = VoltError::NoValue("key is af".to_owned());
655 println!("{:?} {} ", err, err);
656 }
657}
658