1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Copyright 2020 ZomboDB, LLC <zombodb@gmail.com>. All rights reserved. Use of this source code is
// governed by the MIT license that can be found in the LICENSE file.


use crate::{direct_function_call_as_datum, pg_sys, FromDatum, IntoDatum};

impl FromDatum for pg_sys::BOX {
    unsafe fn from_datum(datum: pg_sys::Datum, is_null: bool, _: pg_sys::Oid) -> Option<Self>
    where
        Self: Sized,
    {
        if is_null {
            None
        } else if datum == 0 {
            panic!("BOX datum declared not null, but datum is zero")
        } else {
            let the_box = datum as *mut pg_sys::BOX;
            Some(the_box.read())
        }
    }
}

impl IntoDatum for pg_sys::BOX {
    fn into_datum(mut self) -> Option<pg_sys::Datum> {
        let the_box = &mut self;
        direct_function_call_as_datum(
            pg_sys::box_out,
            vec![Some(the_box as *mut pg_sys::BOX as pg_sys::Datum)],
        )
    }

    fn type_oid() -> pg_sys::Oid {
        pg_sys::BOXOID
    }
}

impl FromDatum for pg_sys::Point {
    unsafe fn from_datum(datum: pg_sys::Datum, is_null: bool, _: pg_sys::Oid) -> Option<Self>
    where
        Self: Sized,
    {
        if is_null {
            None
        } else if datum == 0 {
            panic!("Point datum declared not null, but datum is zero")
        } else {
            let point = datum as *mut pg_sys::Point;
            Some(point.read())
        }
    }
}

impl IntoDatum for pg_sys::Point {
    fn into_datum(mut self) -> Option<usize> {
        let point = &mut self;
        direct_function_call_as_datum(
            pg_sys::point_out,
            vec![Some(point as *mut pg_sys::Point as pg_sys::Datum)],
        )
    }

    fn type_oid() -> pg_sys::Oid {
        pg_sys::POINTOID
    }
}