@@ -55,9 +55,9 @@ use crate::*;
55
55
/// # Ok(()) }
56
56
/// ```
57
57
#[ derive( Debug ) ]
58
- pub struct DatabaseOpenOptions < ' e , ' n , T , KC , DC , C = DefaultComparator > {
58
+ pub struct DatabaseOpenOptions < ' e , ' n , T , KC , DC , C = DefaultComparator , CDUP = DefaultComparator > {
59
59
env : & ' e Env < T > ,
60
- types : marker:: PhantomData < ( KC , DC , C ) > ,
60
+ types : marker:: PhantomData < ( KC , DC , C , CDUP ) > ,
61
61
name : Option < & ' n str > ,
62
62
flags : AllDatabaseFlags ,
63
63
}
@@ -74,7 +74,7 @@ impl<'e, T> DatabaseOpenOptions<'e, 'static, T, Unspecified, Unspecified> {
74
74
}
75
75
}
76
76
77
- impl < ' e , ' n , T , KC , DC , C > DatabaseOpenOptions < ' e , ' n , T , KC , DC , C > {
77
+ impl < ' e , ' n , T , KC , DC , C , CDUP > DatabaseOpenOptions < ' e , ' n , T , KC , DC , C , CDUP > {
78
78
/// Change the type of the database.
79
79
///
80
80
/// The default types are [`Unspecified`] and require a call to [`Database::remap_types`]
@@ -91,7 +91,19 @@ impl<'e, 'n, T, KC, DC, C> DatabaseOpenOptions<'e, 'n, T, KC, DC, C> {
91
91
/// Change the customized key compare function of the database.
92
92
///
93
93
/// By default no customized compare function will be set when opening a database.
94
- pub fn key_comparator < NC > ( self ) -> DatabaseOpenOptions < ' e , ' n , T , KC , DC , NC > {
94
+ pub fn key_comparator < NC > ( self ) -> DatabaseOpenOptions < ' e , ' n , T , KC , DC , NC , CDUP > {
95
+ DatabaseOpenOptions {
96
+ env : self . env ,
97
+ types : Default :: default ( ) ,
98
+ name : self . name ,
99
+ flags : self . flags ,
100
+ }
101
+ }
102
+
103
+ /// Change the customized dup sort compare function of the database.
104
+ ///
105
+ /// By default no customized compare function will be set when opening a database.
106
+ pub fn dup_sort_comparator < NCDUP > ( self ) -> DatabaseOpenOptions < ' e , ' n , T , KC , DC , C , NCDUP > {
95
107
DatabaseOpenOptions {
96
108
env : self . env ,
97
109
types : Default :: default ( ) ,
@@ -132,15 +144,16 @@ impl<'e, 'n, T, KC, DC, C> DatabaseOpenOptions<'e, 'n, T, KC, DC, C> {
132
144
///
133
145
/// If not done, you might raise `Io(Os { code: 22, kind: InvalidInput, message: "Invalid argument" })`
134
146
/// known as `EINVAL`.
135
- pub fn open ( & self , rtxn : & RoTxn ) -> Result < Option < Database < KC , DC , C > > >
147
+ pub fn open ( & self , rtxn : & RoTxn ) -> Result < Option < Database < KC , DC , C , CDUP > > >
136
148
where
137
149
KC : ' static ,
138
150
DC : ' static ,
139
151
C : Comparator + ' static ,
152
+ CDUP : Comparator + ' static ,
140
153
{
141
154
assert_eq_env_txn ! ( self . env, rtxn) ;
142
155
143
- match self . env . raw_init_database :: < C > ( rtxn. txn_ptr ( ) , self . name , self . flags ) {
156
+ match self . env . raw_init_database :: < C , CDUP > ( rtxn. txn_ptr ( ) , self . name , self . flags ) {
144
157
Ok ( dbi) => Ok ( Some ( Database :: new ( self . env . env_mut_ptr ( ) . as_ptr ( ) as _ , dbi) ) ) ,
145
158
Err ( Error :: Mdb ( e) ) if e. not_found ( ) => Ok ( None ) ,
146
159
Err ( e) => Err ( e) ,
@@ -156,29 +169,30 @@ impl<'e, 'n, T, KC, DC, C> DatabaseOpenOptions<'e, 'n, T, KC, DC, C> {
156
169
/// LMDB has an important restriction on the unnamed database when named ones are opened.
157
170
/// The names of the named databases are stored as keys in the unnamed one and are immutable,
158
171
/// and these keys can only be read and not written.
159
- pub fn create ( & self , wtxn : & mut RwTxn ) -> Result < Database < KC , DC , C > >
172
+ pub fn create ( & self , wtxn : & mut RwTxn ) -> Result < Database < KC , DC , C , CDUP > >
160
173
where
161
174
KC : ' static ,
162
175
DC : ' static ,
163
176
C : Comparator + ' static ,
177
+ CDUP : Comparator + ' static ,
164
178
{
165
179
assert_eq_env_txn ! ( self . env, wtxn) ;
166
180
167
181
let flags = self . flags | AllDatabaseFlags :: CREATE ;
168
- match self . env . raw_init_database :: < C > ( wtxn. txn_ptr ( ) , self . name , flags) {
182
+ match self . env . raw_init_database :: < C , CDUP > ( wtxn. txn_ptr ( ) , self . name , flags) {
169
183
Ok ( dbi) => Ok ( Database :: new ( self . env . env_mut_ptr ( ) . as_ptr ( ) as _ , dbi) ) ,
170
184
Err ( e) => Err ( e) ,
171
185
}
172
186
}
173
187
}
174
188
175
- impl < T , KC , DC , C > Clone for DatabaseOpenOptions < ' _ , ' _ , T , KC , DC , C > {
189
+ impl < T , KC , DC , C , CDUP > Clone for DatabaseOpenOptions < ' _ , ' _ , T , KC , DC , C , CDUP > {
176
190
fn clone ( & self ) -> Self {
177
191
* self
178
192
}
179
193
}
180
194
181
- impl < T , KC , DC , C > Copy for DatabaseOpenOptions < ' _ , ' _ , T , KC , DC , C > { }
195
+ impl < T , KC , DC , C , CDUP > Copy for DatabaseOpenOptions < ' _ , ' _ , T , KC , DC , C , CDUP > { }
182
196
183
197
/// A typed database that accepts only the types it was created with.
184
198
///
@@ -292,14 +306,14 @@ impl<T, KC, DC, C> Copy for DatabaseOpenOptions<'_, '_, T, KC, DC, C> {}
292
306
/// wtxn.commit()?;
293
307
/// # Ok(()) }
294
308
/// ```
295
- pub struct Database < KC , DC , C = DefaultComparator > {
309
+ pub struct Database < KC , DC , C = DefaultComparator , CDUP = DefaultComparator > {
296
310
pub ( crate ) env_ident : usize ,
297
311
pub ( crate ) dbi : ffi:: MDB_dbi ,
298
- marker : marker:: PhantomData < ( KC , DC , C ) > ,
312
+ marker : marker:: PhantomData < ( KC , DC , C , CDUP ) > ,
299
313
}
300
314
301
- impl < KC , DC , C > Database < KC , DC , C > {
302
- pub ( crate ) fn new ( env_ident : usize , dbi : ffi:: MDB_dbi ) -> Database < KC , DC , C > {
315
+ impl < KC , DC , C , CDUP > Database < KC , DC , C , CDUP > {
316
+ pub ( crate ) fn new ( env_ident : usize , dbi : ffi:: MDB_dbi ) -> Database < KC , DC , C , CDUP > {
303
317
Database { env_ident, dbi, marker : std:: marker:: PhantomData }
304
318
}
305
319
@@ -2693,20 +2707,21 @@ impl<KC, DC, C> Database<KC, DC, C> {
2693
2707
}
2694
2708
}
2695
2709
2696
- impl < KC , DC , C > Clone for Database < KC , DC , C > {
2697
- fn clone ( & self ) -> Database < KC , DC , C > {
2710
+ impl < KC , DC , C , CDUP > Clone for Database < KC , DC , C , CDUP > {
2711
+ fn clone ( & self ) -> Database < KC , DC , C , CDUP > {
2698
2712
* self
2699
2713
}
2700
2714
}
2701
2715
2702
- impl < KC , DC , C > Copy for Database < KC , DC , C > { }
2716
+ impl < KC , DC , C , CDUP > Copy for Database < KC , DC , C , CDUP > { }
2703
2717
2704
- impl < KC , DC , C > fmt:: Debug for Database < KC , DC , C > {
2718
+ impl < KC , DC , C , CDUP > fmt:: Debug for Database < KC , DC , C , CDUP > {
2705
2719
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2706
2720
f. debug_struct ( "Database" )
2707
2721
. field ( "key_codec" , & any:: type_name :: < KC > ( ) )
2708
2722
. field ( "data_codec" , & any:: type_name :: < DC > ( ) )
2709
- . field ( "comparator" , & any:: type_name :: < C > ( ) )
2723
+ . field ( "key_comparator" , & any:: type_name :: < C > ( ) )
2724
+ . field ( "dup_sort_comparator" , & any:: type_name :: < CDUP > ( ) )
2710
2725
. finish ( )
2711
2726
}
2712
2727
}
0 commit comments