@@ -5,22 +5,23 @@ use std::str::from_utf8_unchecked;
5
5
6
6
use libsqlite3_sys:: {
7
7
sqlite3_column_blob, sqlite3_column_bytes, sqlite3_column_double, sqlite3_column_int,
8
- sqlite3_column_int64, sqlite3_column_text, sqlite3_column_type, SQLITE_BLOB , SQLITE_FLOAT ,
9
- SQLITE_INTEGER , SQLITE_NULL , SQLITE_TEXT ,
8
+ sqlite3_column_int64, sqlite3_column_text, sqlite3_column_type, SQLITE_NULL ,
10
9
} ;
11
10
12
11
use crate :: sqlite:: statement:: Statement ;
13
- use crate :: sqlite:: types:: SqliteType ;
14
12
15
13
pub struct SqliteValue < ' c > {
16
- index : usize ,
14
+ index : i32 ,
17
15
statement : & ' c Statement ,
18
16
}
19
17
20
18
impl < ' c > SqliteValue < ' c > {
21
19
#[ inline]
22
20
pub ( super ) fn new ( statement : & ' c Statement , index : usize ) -> Self {
23
- Self { statement, index }
21
+ Self {
22
+ statement,
23
+ index : index as i32 ,
24
+ }
24
25
}
25
26
}
26
27
@@ -30,72 +31,71 @@ impl<'c> SqliteValue<'c> {
30
31
// These routines return information about a single column of the current result row of a query.
31
32
32
33
impl < ' c > SqliteValue < ' c > {
33
- /// Returns the initial data type of the result column .
34
- pub ( super ) fn r#type ( & self ) -> SqliteType {
34
+ /// Returns true if the value should be intrepreted as NULL .
35
+ pub ( super ) fn is_null ( & self ) -> bool {
35
36
#[ allow( unsafe_code) ]
36
- let type_code = unsafe { sqlite3_column_type ( self . statement . handle ( ) , self . index as i32 ) } ;
37
-
38
- match type_code {
39
- SQLITE_INTEGER => SqliteType :: Integer ,
40
- SQLITE_FLOAT => SqliteType :: Float ,
41
- SQLITE_BLOB => SqliteType :: Blob ,
42
- SQLITE_NULL => SqliteType :: Null ,
43
- SQLITE_TEXT => SqliteType :: Text ,
44
-
45
- _ => unreachable ! ( ) ,
46
- }
37
+ let type_code = unsafe { sqlite3_column_type ( self . statement . handle ( ) , self . index ) } ;
38
+ type_code == SQLITE_NULL
47
39
}
48
40
49
41
/// Returns the 32-bit INTEGER result.
50
42
pub ( super ) fn int ( & self ) -> i32 {
51
43
#[ allow( unsafe_code) ]
52
44
unsafe {
53
- sqlite3_column_int ( self . statement . handle ( ) , self . index as i32 )
45
+ sqlite3_column_int ( self . statement . handle ( ) , self . index )
54
46
}
55
47
}
56
48
57
49
/// Returns the 64-bit INTEGER result.
58
50
pub ( super ) fn int64 ( & self ) -> i64 {
59
51
#[ allow( unsafe_code) ]
60
52
unsafe {
61
- sqlite3_column_int64 ( self . statement . handle ( ) , self . index as i32 )
53
+ sqlite3_column_int64 ( self . statement . handle ( ) , self . index )
62
54
}
63
55
}
64
56
65
57
/// Returns the 64-bit, REAL result.
66
58
pub ( super ) fn double ( & self ) -> f64 {
67
59
#[ allow( unsafe_code) ]
68
60
unsafe {
69
- sqlite3_column_double ( self . statement . handle ( ) , self . index as i32 )
61
+ sqlite3_column_double ( self . statement . handle ( ) , self . index )
70
62
}
71
63
}
72
64
73
65
/// Returns the UTF-8 TEXT result.
74
- pub ( super ) fn text ( & self ) -> & ' c str {
66
+ pub ( super ) fn text ( & self ) -> Option < & ' c str > {
75
67
#[ allow( unsafe_code) ]
76
68
unsafe {
77
- let ptr = sqlite3_column_text ( self . statement . handle ( ) , self . index as i32 ) as * const i8 ;
78
-
79
- debug_assert ! ( !ptr. is_null( ) ) ;
69
+ let ptr = sqlite3_column_text ( self . statement . handle ( ) , self . index ) as * const i8 ;
80
70
81
- from_utf8_unchecked ( CStr :: from_ptr ( ptr) . to_bytes ( ) )
71
+ if ptr. is_null ( ) {
72
+ None
73
+ } else {
74
+ Some ( from_utf8_unchecked ( CStr :: from_ptr ( ptr) . to_bytes ( ) ) )
75
+ }
82
76
}
83
77
}
84
78
79
+ fn bytes ( & self ) -> usize {
80
+ // Returns the size of the result in bytes.
81
+ #[ allow( unsafe_code) ]
82
+ let len = unsafe { sqlite3_column_bytes ( self . statement . handle ( ) , self . index ) } ;
83
+ len as usize
84
+ }
85
+
85
86
/// Returns the BLOB result.
86
87
pub ( super ) fn blob ( & self ) -> & ' c [ u8 ] {
87
- let index = self . index as i32 ;
88
-
89
88
#[ allow( unsafe_code) ]
90
- let ptr = unsafe { sqlite3_column_blob ( self . statement . handle ( ) , index) } ;
89
+ let ptr = unsafe { sqlite3_column_blob ( self . statement . handle ( ) , self . index ) } ;
91
90
92
- // Returns the size of the BLOB result in bytes.
93
- #[ allow( unsafe_code) ]
94
- let len = unsafe { sqlite3_column_bytes ( self . statement . handle ( ) , index) } ;
91
+ if ptr. is_null ( ) {
92
+ // Empty BLOBs are received as null pointers
93
+ return & [ ] ;
94
+ }
95
95
96
96
#[ allow( unsafe_code) ]
97
97
unsafe {
98
- slice:: from_raw_parts ( ptr as * const u8 , len as usize )
98
+ slice:: from_raw_parts ( ptr as * const u8 , self . bytes ( ) )
99
99
}
100
100
}
101
101
}
0 commit comments