Skip to main content

wtx/database/client/
rdbms.rs

1pub(crate) mod column_info;
2pub(crate) mod common_executor_buffer;
3pub(crate) mod common_record;
4pub(crate) mod common_records;
5pub(crate) mod statement;
6pub(crate) mod statement_builder;
7pub(crate) mod statements;
8pub(crate) mod statements_misc;
9
10use crate::{
11  codec::CodecController,
12  collection::Vector,
13  database::{
14    Database, ValueIdent,
15    client::rdbms::{column_info::ColumnInfo, common_record::CommonRecord},
16  },
17  misc::{Lease, net::PartitionedFilledBuffer},
18};
19use core::ops::Range;
20
21/// Should be called before executing commands.
22pub(crate) fn clear_cmd_buffers(
23  net_buffer: &mut PartitionedFilledBuffer,
24  records_params: &mut Vector<(Range<usize>, Range<usize>)>,
25  values_params: &mut Vector<(bool, Range<usize>)>,
26) {
27  net_buffer.clear_if_following_is_empty();
28  records_params.clear();
29  values_params.clear();
30}
31
32// FIXME(STABLE): CommonRecord should implement Record but in such a scenario GAT implies
33// static bounds.
34pub(crate) fn value<'inner, 'outer, 'rem, A, C, CI, D, R, T>(
35  ci: CI,
36  record: &'rem R,
37) -> Option<<D as CodecController>::DecodeWrapper<'inner, 'outer, 'rem>>
38where
39  A: 'rem,
40  C: ColumnInfo<Ty = D::Ty> + 'inner + 'rem,
41  CI: ValueIdent<R>,
42  D: Database + 'rem,
43  D::Ty: Clone,
44  R: Lease<CommonRecord<'inner, A, C, D, T>>,
45  T: 'inner,
46  <D as CodecController>::DecodeWrapper<'inner, 'outer, 'rem>: From<(&'inner [u8], &'rem C)>,
47  'inner: 'rem,
48{
49  let idx = ci.idx(record)?;
50  let (is_null, range) = record.lease().values_params.get(idx)?;
51  if *is_null {
52    None
53  } else {
54    let column = record.lease().stmt.column(idx)?;
55    let bytes = record.lease().record.get(range.clone())?;
56    Some(From::from((bytes, column)))
57  }
58}
59
60#[cfg(test)]
61pub(crate) mod tests {
62  pub(crate) fn _column0() -> &'static str {
63    "a"
64  }
65
66  pub(crate) fn _column1() -> &'static str {
67    "b"
68  }
69
70  pub(crate) fn _column2() -> &'static str {
71    "c"
72  }
73
74  pub(crate) fn _column3() -> &'static str {
75    "d"
76  }
77}