rbdc_mysql/protocol/
row.rs1use std::ops::Range;
2
3#[derive(Debug)]
4pub struct Row {
5 pub storage: Vec<Option<Vec<u8>>>,
6 pub values: Vec<Option<Range<usize>>>,
7}
8
9impl From<(Vec<Option<Range<usize>>>, Vec<u8>)> for Row {
10 fn from((ranges, data): (Vec<Option<Range<usize>>>, Vec<u8>)) -> Self {
11 let mut row = Row {
12 storage: Vec::with_capacity(ranges.len()),
13 values: Vec::with_capacity(ranges.len()),
14 };
15 for x in ranges {
16 if let Some(col) = x {
17 row.storage.push(Some(data[col.start..col.end].to_vec()));
18 row.values.push(Some(col));
19 } else {
20 row.storage.push(None);
21 row.values.push(None);
22 }
23 }
24 row
25 }
26}
27
28impl Row {
29 pub fn get(&self, index: usize) -> Option<&[u8]> {
30 let mut idx = 0;
31 for x in &self.values {
32 if index == idx {
33 match x {
34 None => return None,
35 Some(_) => match &self.storage[idx] {
36 None => {
37 return None;
38 }
39 Some(v) => {
40 return Some(v);
41 }
42 },
43 }
44 }
45 idx += 1;
46 }
47 None
48 }
49
50 pub fn take(&mut self, index: usize) -> Option<Vec<u8>> {
51 let mut idx = 0;
52 for x in &self.values {
53 if index == idx {
54 match x {
55 None => return None,
56 Some(_) => {
57 return match self.storage[idx].take() {
58 None => None,
59 Some(v) => Some(v),
60 }
61 }
62 }
63 }
64 idx += 1;
65 }
66 None
67 }
68}