1use std::borrow::Cow;
79use std::str::{self, FromStr};
80use std::{fmt, io};
81
82use dec::OrderedDecimal;
83use serde::de::{self, DeserializeSeed, Deserializer, MapAccess, SeqAccess, Visitor};
84use serde::ser::{Serialize, SerializeMap, SerializeSeq, SerializeStruct, Serializer};
85
86use crate::adt::jsonb::vec_stack::VecStack;
87use crate::adt::numeric::Numeric;
88use crate::{Datum, Row, RowPacker, SharedRow, strconv};
89
90#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq)]
98pub struct Jsonb {
99 row: Row,
100}
101
102impl Jsonb {
103 pub fn from_serde_json(val: serde_json::Value) -> Result<Self, anyhow::Error> {
105 let mut row = Row::default();
106 JsonbPacker::new(&mut row.packer()).pack_serde_json(val)?;
107 Ok(Jsonb { row })
108 }
109
110 pub fn from_slice(buf: &[u8]) -> Result<Jsonb, anyhow::Error> {
114 let mut row_builder = SharedRow::get();
115 let mut packer = row_builder.packer();
116 JsonbPacker::new(&mut packer).pack_slice(buf)?;
117 Ok(Jsonb {
118 row: row_builder.clone(),
119 })
120 }
121
122 pub fn as_ref(&self) -> JsonbRef {
124 JsonbRef {
125 datum: self.row.unpack_first(),
126 }
127 }
128
129 pub fn from_row(row: Row) -> Jsonb {
134 Jsonb { row }
135 }
136
137 pub fn into_row(self) -> Row {
139 self.row
140 }
141
142 pub fn row(&self) -> &Row {
144 &self.row
145 }
146}
147
148impl FromStr for Jsonb {
149 type Err = anyhow::Error;
150
151 fn from_str(s: &str) -> Result<Self, Self::Err> {
152 let mut row = Row::default();
153 JsonbPacker::new(&mut row.packer()).pack_str(s)?;
154 Ok(Jsonb { row })
155 }
156}
157
158impl fmt::Display for Jsonb {
159 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
160 self.as_ref().fmt(f)
161 }
162}
163
164#[derive(Debug, Copy, Clone)]
168pub struct JsonbRef<'a> {
169 datum: Datum<'a>,
170}
171
172impl<'a> JsonbRef<'a> {
173 pub fn from_datum(datum: Datum) -> JsonbRef {
178 JsonbRef { datum }
179 }
180
181 pub fn into_datum(self) -> Datum<'a> {
183 self.datum
184 }
185
186 pub fn to_owned(&self) -> Jsonb {
188 Jsonb {
189 row: Row::pack_slice(&[self.datum]),
190 }
191 }
192
193 pub fn to_writer<W>(&self, writer: W) -> Result<(), anyhow::Error>
200 where
201 W: io::Write,
202 {
203 serde_json::to_writer(writer, &JsonbDatum(self.datum))?;
204 Ok(())
205 }
206
207 pub fn to_serde_json(&self) -> serde_json::Value {
214 serde_json::to_value(JsonbDatum(self.datum))
215 .expect("conversion to serde_json::Value known to be valid")
216 }
217}
218
219impl fmt::Display for JsonbRef<'_> {
220 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
221 let alternate = f.alternate();
222 let mut w = WriterFormatter { inner: f };
223 if alternate {
224 serde_json::to_writer_pretty(&mut w, &JsonbDatum(self.datum)).map_err(|_| fmt::Error)
225 } else {
226 serde_json::to_writer(&mut w, &JsonbDatum(self.datum)).map_err(|_| fmt::Error)
227 }
228 }
229}
230
231#[derive(Debug)]
233pub struct JsonbPacker<'a, 'row> {
234 packer: &'a mut RowPacker<'row>,
235}
236
237impl<'a, 'row> JsonbPacker<'a, 'row> {
238 pub fn new(packer: &'a mut RowPacker<'row>) -> JsonbPacker<'a, 'row> {
240 JsonbPacker { packer }
241 }
242
243 pub fn pack_serde_json(self, val: serde_json::Value) -> Result<(), serde_json::Error> {
245 let mut commands = vec![];
246 Collector(&mut commands).deserialize(val)?;
247 pack(self.packer, &commands);
248 Ok(())
249 }
250
251 pub fn pack_slice(self, buf: &[u8]) -> Result<(), serde_json::Error> {
255 let mut commands = vec![];
256 let mut deserializer = serde_json::Deserializer::from_slice(buf);
257 Collector(&mut commands).deserialize(&mut deserializer)?;
258 deserializer.end()?;
259 pack(self.packer, &commands);
260 Ok(())
261 }
262
263 pub fn pack_str(self, s: &str) -> Result<(), serde_json::Error> {
267 let mut commands = vec![];
268 let mut deserializer = serde_json::Deserializer::from_str(s);
269 Collector(&mut commands).deserialize(&mut deserializer)?;
270 deserializer.end()?;
271 pack(self.packer, &commands);
272 Ok(())
273 }
274}
275
276const SERDE_JSON_NUMBER_TOKEN: &str = "$serde_json::private::Number";
283
284#[derive(Debug)]
293pub(crate) enum KeyClass<'de> {
294 Number,
295 MapKey(Cow<'de, str>),
296}
297
298pub(crate) struct KeyClassifier;
299
300impl<'de> DeserializeSeed<'de> for KeyClassifier {
301 type Value = KeyClass<'de>;
302
303 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
304 where
305 D: serde::Deserializer<'de>,
306 {
307 deserializer.deserialize_str(self)
308 }
309}
310
311impl<'de> Visitor<'de> for KeyClassifier {
312 type Value = KeyClass<'de>;
313
314 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
315 formatter.write_str("a string key")
316 }
317
318 #[inline]
319 fn visit_borrowed_str<E>(self, key: &'de str) -> Result<Self::Value, E> {
320 match key {
321 SERDE_JSON_NUMBER_TOKEN => Ok(KeyClass::Number),
322 _ => Ok(KeyClass::MapKey(Cow::Borrowed(key))),
323 }
324 }
325
326 #[inline]
327 fn visit_str<E>(self, key: &str) -> Result<Self::Value, E> {
328 match key {
329 SERDE_JSON_NUMBER_TOKEN => Ok(KeyClass::Number),
330 _ => Ok(KeyClass::MapKey(Cow::Owned(key.to_owned()))),
331 }
332 }
333}
334
335pub(crate) struct NumberParser;
336
337impl<'de> DeserializeSeed<'de> for NumberParser {
338 type Value = OrderedDecimal<Numeric>;
339
340 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
341 where
342 D: serde::Deserializer<'de>,
343 {
344 deserializer.deserialize_str(self)
345 }
346}
347
348impl<'de> Visitor<'de> for NumberParser {
349 type Value = OrderedDecimal<Numeric>;
350
351 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
352 formatter.write_str("a valid number")
353 }
354
355 #[inline]
356 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
357 where
358 E: de::Error,
359 {
360 strconv::parse_numeric(value).map_err(de::Error::custom)
361 }
362}
363
364#[derive(Debug)]
365enum Command<'de> {
366 Null,
367 Bool(bool),
368 Numeric(OrderedDecimal<Numeric>),
369 String(Cow<'de, str>),
370 Array(usize), Map(usize), }
373
374struct Collector<'a, 'de>(&'a mut Vec<Command<'de>>);
375
376impl<'a, 'de> DeserializeSeed<'de> for Collector<'a, 'de> {
377 type Value = ();
378
379 fn deserialize<D>(self, deserializer: D) -> Result<(), D::Error>
380 where
381 D: Deserializer<'de>,
382 {
383 deserializer.deserialize_any(self)
384 }
385}
386
387impl<'a, 'de> Visitor<'de> for Collector<'a, 'de> {
388 type Value = ();
389
390 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
391 formatter.write_str("a valid JSON datum")
392 }
393
394 #[inline]
395 fn visit_unit<E>(self) -> Result<(), E> {
396 self.0.push(Command::Null);
397 Ok(())
398 }
399
400 #[inline]
401 fn visit_bool<E>(self, value: bool) -> Result<(), E> {
402 self.0.push(Command::Bool(value));
403 Ok(())
404 }
405
406 #[inline]
407 fn visit_i64<E>(self, value: i64) -> Result<(), E>
408 where
409 E: de::Error,
410 {
411 self.0.push(Command::Numeric(OrderedDecimal(value.into())));
412 Ok(())
413 }
414
415 #[inline]
416 fn visit_u64<E>(self, value: u64) -> Result<(), E>
417 where
418 E: de::Error,
419 {
420 self.0.push(Command::Numeric(OrderedDecimal(value.into())));
421 Ok(())
422 }
423
424 #[inline]
425 fn visit_f64<E>(self, value: f64) -> Result<(), E> {
426 self.0.push(Command::Numeric(OrderedDecimal(value.into())));
427 Ok(())
428 }
429
430 #[inline]
431 fn visit_str<E>(self, value: &str) -> Result<(), E> {
432 self.0.push(Command::String(Cow::Owned(value.to_owned())));
433 Ok(())
434 }
435
436 #[inline]
437 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<(), E> {
438 self.0.push(Command::String(Cow::Borrowed(value)));
439 Ok(())
440 }
441
442 #[inline]
443 fn visit_seq<V>(self, mut visitor: V) -> Result<(), V::Error>
444 where
445 V: SeqAccess<'de>,
446 {
447 self.0.push(Command::Array(0));
448 let start = self.0.len();
449 while visitor.next_element_seed(Collector(self.0))?.is_some() {}
450 self.0[start - 1] = Command::Array(self.0.len() - start);
451 Ok(())
452 }
453
454 #[inline]
455 fn visit_map<V>(self, mut visitor: V) -> Result<(), V::Error>
456 where
457 V: MapAccess<'de>,
458 {
459 match visitor.next_key_seed(KeyClassifier)? {
460 Some(KeyClass::Number) => {
461 let n = visitor.next_value_seed(NumberParser)?;
462 self.0.push(Command::Numeric(n));
463 }
464 Some(KeyClass::MapKey(key)) => {
465 self.0.push(Command::Map(0));
466 let start = self.0.len();
467 self.0.push(Command::String(key));
468 visitor.next_value_seed(Collector(self.0))?;
469 while visitor.next_key_seed(Collector(self.0))?.is_some() {
470 visitor.next_value_seed(Collector(self.0))?;
471 }
472 self.0[start - 1] = Command::Map(self.0.len() - start);
473 }
474 None => self.0.push(Command::Map(0)),
475 }
476
477 Ok(())
478 }
479}
480
481struct DictEntry<'a> {
482 key: &'a str,
483 val: &'a [Command<'a>],
484}
485
486fn pack(packer: &mut RowPacker, value: &[Command]) {
487 let mut buf = vec![];
488 pack_value(packer, VecStack::new(&mut buf), value);
489}
490
491#[inline]
492fn pack_value<'a, 'scratch>(
493 packer: &mut RowPacker,
494 scratch: VecStack<'scratch, DictEntry<'a>>,
495 value: &'a [Command<'a>],
496) {
497 match &value[0] {
498 Command::Null => packer.push(Datum::JsonNull),
499 Command::Bool(b) => packer.push(if *b { Datum::True } else { Datum::False }),
500 Command::Numeric(n) => packer.push(Datum::Numeric(*n)),
501 Command::String(s) => packer.push(Datum::String(s)),
502 Command::Array(further) => {
503 let range = &value[1..][..*further];
504 pack_list(packer, scratch, range);
505 }
506 Command::Map(further) => {
507 let range = &value[1..][..*further];
508 pack_dict(packer, scratch, range);
509 }
510 }
511}
512
513fn pack_list<'a, 'scratch>(
515 packer: &mut RowPacker,
516 mut scratch: VecStack<'scratch, DictEntry<'a>>,
517 mut values: &'a [Command<'a>],
518) {
519 packer.push_list_with(|packer| {
520 while !values.is_empty() {
521 let value = extract_value(&mut values);
522 pack_value(packer, scratch.fresh(), value);
523 }
524 })
525}
526
527fn pack_dict<'a, 'scratch>(
534 packer: &mut RowPacker,
535 mut scratch: VecStack<'scratch, DictEntry<'a>>,
536 mut entries: &'a [Command<'a>],
537) {
538 while !entries.is_empty() {
539 if let Command::String(key) = &entries[0] {
540 entries = &entries[1..];
541 let val = extract_value(&mut entries);
542 scratch.push(DictEntry { key, val });
543 } else {
544 unreachable!("JSON decoding produced invalid command sequence");
545 }
546 }
547
548 scratch.sort_by_key(|entry| entry.key);
553 packer.push_dict_with(|packer| {
554 for i in 0..scratch.len() {
555 if i == scratch.len() - 1 || scratch[i].key != scratch[i + 1].key {
556 let DictEntry { key, val } = scratch[i];
557 packer.push(Datum::String(key));
558 pack_value(packer, scratch.fresh(), val);
559 }
560 }
561 });
562}
563
564fn extract_value<'a>(values: &mut &'a [Command<'a>]) -> &'a [Command<'a>] {
566 let result = match values[0] {
567 Command::Array(further) => &values[..further + 1],
568 Command::Map(further) => &values[..further + 1],
569 _ => &values[0..1],
570 };
571 *values = &values[result.len()..];
572 result
573}
574
575struct JsonbDatum<'a>(Datum<'a>);
583
584impl Serialize for JsonbDatum<'_> {
585 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
586 where
587 S: Serializer,
588 {
589 match self.0 {
590 Datum::JsonNull => serializer.serialize_none(),
591 Datum::True => serializer.serialize_bool(true),
592 Datum::False => serializer.serialize_bool(false),
593 Datum::Numeric(n) => {
594 let mut s = serializer.serialize_struct(SERDE_JSON_NUMBER_TOKEN, 1)?;
602 s.serialize_field(
603 SERDE_JSON_NUMBER_TOKEN,
604 &n.into_inner().to_standard_notation_string(),
605 )?;
606 s.end()
607 }
608 Datum::String(s) => serializer.serialize_str(s),
609 Datum::List(list) => {
610 let mut seq = serializer.serialize_seq(None)?;
611 for e in list.iter() {
612 seq.serialize_element(&JsonbDatum(e))?;
613 }
614 seq.end()
615 }
616 Datum::Map(dict) => {
617 let mut map = serializer.serialize_map(None)?;
618 for (k, v) in dict.iter() {
619 map.serialize_entry(k, &JsonbDatum(v))?;
620 }
621 map.end()
622 }
623 d => unreachable!("not a json-compatible datum: {:?}", d),
624 }
625 }
626}
627
628struct WriterFormatter<'a, 'b: 'a> {
630 inner: &'a mut fmt::Formatter<'b>,
631}
632
633impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> {
634 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
635 fn io_error<E>(_: E) -> io::Error {
636 io::Error::new(io::ErrorKind::Other, "fmt error")
638 }
639 let s = str::from_utf8(buf).map_err(io_error)?;
640 self.inner.write_str(s).map_err(io_error)?;
641 Ok(buf.len())
642 }
643
644 fn flush(&mut self) -> io::Result<()> {
645 Ok(())
646 }
647}
648
649mod vec_stack {
650 use std::ops::Index;
651
652 pub struct VecStack<'a, T> {
658 buf: &'a mut Vec<T>,
659 i: usize,
660 }
661
662 impl<'a, T> VecStack<'a, T> {
663 pub fn new(buf: &'a mut Vec<T>) -> VecStack<'a, T> {
667 VecStack { buf, i: 0 }
668 }
669
670 pub fn push(&mut self, t: T) {
672 self.buf.push(t)
673 }
674
675 pub fn sort_by_key<F, K>(&mut self, f: F)
678 where
679 F: FnMut(&T) -> K,
680 K: Ord,
681 {
682 self.buf[self.i..].sort_by_key(f)
683 }
684
685 pub fn len(&self) -> usize {
687 self.buf.len() - self.i
688 }
689
690 pub fn fresh<'b>(&'b mut self) -> VecStack<'b, T> {
696 let i = self.buf.len();
697 VecStack { buf: self.buf, i }
698 }
699 }
700
701 impl<'a, T> Index<usize> for VecStack<'a, T> {
702 type Output = T;
703
704 fn index(&self, i: usize) -> &Self::Output {
705 &self.buf[self.i + i]
706 }
707 }
708
709 impl<'a, T> Drop for VecStack<'a, T> {
710 fn drop(&mut self) {
711 self.buf.truncate(self.i)
712 }
713 }
714}