Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
R
rust-rocksdb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fangzongwu
rust-rocksdb
Commits
a7c9bd69
Commit
a7c9bd69
authored
Jun 27, 2017
by
Huachao Huang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*: rewrite to avoid memory layout dependencies
parent
e3bd990f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
341 additions
and
137 deletions
+341
-137
c.cc
librocksdb_sys/crocksdb/c.cc
+0
-0
c.h
librocksdb_sys/crocksdb/rocksdb/c.h
+122
-27
lib.rs
librocksdb_sys/src/lib.rs
+0
-0
rocksdb.rs
src/rocksdb.rs
+6
-0
rocksdb_options.rs
src/rocksdb_options.rs
+2
-3
table_properties.rs
src/table_properties.rs
+167
-31
table_properties_collector.rs
src/table_properties_collector.rs
+20
-42
table_properties_collector_factory.rs
src/table_properties_collector_factory.rs
+19
-20
test_table_properties.rs
tests/test_table_properties.rs
+5
-14
No files found.
librocksdb_sys/crocksdb/c.cc
View file @
a7c9bd69
This diff is collapsed.
Click to expand it.
librocksdb_sys/crocksdb/rocksdb/c.h
View file @
a7c9bd69
...
...
@@ -113,30 +113,37 @@ typedef struct crocksdb_ratelimiter_t crocksdb_ratelimiter_t;
typedef
struct
crocksdb_pinnableslice_t
crocksdb_pinnableslice_t
;
typedef
struct
crocksdb_user_collected_properties_t
crocksdb_user_collected_properties_t
;
typedef
struct
crocksdb_user_collected_properties_iterator_t
crocksdb_user_collected_properties_iterator_t
;
typedef
struct
crocksdb_table_properties_t
crocksdb_table_properties_t
;
typedef
struct
crocksdb_table_properties_collection_t
crocksdb_table_properties_collection_t
;
typedef
struct
crocksdb_table_properties_collection_iterator_t
crocksdb_table_properties_collection_iterator_t
;
typedef
struct
crocksdb_table_properties_collector_t
crocksdb_table_properties_collector_t
;
typedef
struct
crocksdb_table_properties_collector_factory_t
crocksdb_table_properties_collector_factory_t
;
typedef
struct
crocksdb_table_properties_collector_context
_t
{
void
*
collector
;
const
char
*
(
*
name
)(
void
*
);
void
(
*
destructor
)(
void
*
);
void
(
*
add_userkey
)(
void
*
,
const
char
*
key
,
size_t
key_len
,
const
char
*
value
,
size_t
value_len
,
int
entry_type
,
uint64_t
seq
,
uint64_t
file_size
);
void
(
*
finish
)(
void
*
,
crocksdb_user_collected_properties_t
*
props
);
void
(
*
readable_properties
)(
void
*
,
crocksdb_user_collected_properties_t
*
props
);
}
crocksdb_table_properties_collector_context_t
;
typedef
struct
crocksdb_table_properties_collector_factory_context_t
{
void
*
factory
;
const
char
*
(
*
name
)(
void
*
);
void
(
*
destructor
)(
void
*
);
crocksdb_table_properties_collector_context_t
*
(
*
create_table_properties_collector
)(
void
*
,
uint32_t
cf
);
}
crocksdb_table_propert
ies_collector_factory_context
_t
;
typedef
enum
crocksdb_table_property
_t
{
DATA_SIZE
=
1
,
INDEX_SIZE
,
FILTER_SIZE
,
RAW_KEY_SIZE
,
RAW_VALUE_SIZE
,
NUM_DATA_BLOCKS
,
NUM_ENTRIES
,
FORMAT_VERSION
,
FIXED_KEY_LEN
,
COLUMN_FAMILY_ID
,
COLUMN_FAMILY_NAME
=
11
,
FILTER_POLICY_NAME
,
COMPARATOR_NAME
,
MERGE_OPERATOR_NAME
,
PREFIX_EXTRACTOR_NAME
,
PROPERTY_COLLECTORS_NAMES
,
COMPRESSION_NAME
,
}
crocksdb_table_propert
y
_t
;
/* DB operations */
...
...
@@ -224,6 +231,9 @@ crocksdb_create_column_family(crocksdb_t* db,
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_drop_column_family
(
crocksdb_t
*
db
,
crocksdb_column_family_handle_t
*
handle
,
char
**
errptr
);
extern
C_ROCKSDB_LIBRARY_API
uint32_t
crocksdb_column_family_handle_get_id
(
crocksdb_column_family_handle_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_column_family_handle_destroy
(
crocksdb_column_family_handle_t
*
);
...
...
@@ -1203,20 +1213,45 @@ extern C_ROCKSDB_LIBRARY_API const char* crocksdb_pinnableslice_value(
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_user_collected_properties_add
(
crocksdb_user_collected_properties_t
*
props
,
crocksdb_user_collected_properties_t
*
,
const
char
*
key
,
size_t
key_len
,
const
char
*
value
,
size_t
value_len
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_
table_properties_collector_factory
_t
*
crocksdb_
table_properties_collector_factory
_create
(
crocksdb_table_properties_collector_factory_context_t
*
context
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_
user_collected_properties_iterator
_t
*
crocksdb_
user_collected_properties_iter
_create
(
crocksdb_user_collected_properties_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collector_factory_destroy
(
crocksdb_table_properties_collector_factory_t
*
factory
);
crocksdb_user_collected_properties_iter_destroy
(
crocksdb_user_collected_properties_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
unsigned
char
crocksdb_user_collected_properties_iter_valid
(
crocksdb_user_collected_properties_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_options_add_table_properties_collector_factory
(
crocksdb_options_t
*
opt
,
crocksdb_table_properties_collector_factory_t
*
factory
);
crocksdb_user_collected_properties_iter_next
(
crocksdb_user_collected_properties_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
const
char
*
crocksdb_user_collected_properties_iter_key
(
crocksdb_user_collected_properties_iterator_t
*
,
size_t
*
klen
);
extern
C_ROCKSDB_LIBRARY_API
const
char
*
crocksdb_user_collected_properties_iter_value
(
crocksdb_user_collected_properties_iterator_t
*
,
size_t
*
vlen
);
extern
C_ROCKSDB_LIBRARY_API
uint64_t
crocksdb_table_properties_get_u64
(
crocksdb_table_properties_t
*
,
crocksdb_table_property_t
prop
);
extern
C_ROCKSDB_LIBRARY_API
const
char
*
crocksdb_table_properties_get_str
(
crocksdb_table_properties_t
*
,
crocksdb_table_property_t
prop
,
size_t
*
slen
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_user_collected_properties_t
*
crocksdb_table_properties_get_user_properties
(
crocksdb_table_properties_t
*
);
/* Table Properties Collection */
extern
C_ROCKSDB_LIBRARY_API
crocksdb_table_properties_collection_t
*
crocksdb_table_properties_collection_create
();
...
...
@@ -1224,6 +1259,66 @@ crocksdb_table_properties_collection_create();
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collection_destroy
(
crocksdb_table_properties_collection_t
*
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_table_properties_collection_iterator_t
*
crocksdb_table_properties_collection_iter_create
(
crocksdb_table_properties_collection_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collection_iter_destroy
(
crocksdb_table_properties_collection_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
unsigned
char
crocksdb_table_properties_collection_iter_valid
(
crocksdb_table_properties_collection_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collection_iter_next
(
crocksdb_table_properties_collection_iterator_t
*
);
extern
C_ROCKSDB_LIBRARY_API
const
char
*
crocksdb_table_properties_collection_iter_key
(
crocksdb_table_properties_collection_iterator_t
*
,
size_t
*
klen
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_table_properties_t
*
crocksdb_table_properties_collection_iter_value
(
crocksdb_table_properties_collection_iterator_t
*
);
/* Table Properties Collector */
extern
C_ROCKSDB_LIBRARY_API
crocksdb_table_properties_collector_t
*
crocksdb_table_properties_collector_create
(
void
*
state
,
const
char
*
(
*
name
)(
void
*
),
void
(
*
destruct
)(
void
*
),
void
(
*
add_userkey
)(
void
*
,
const
char
*
key
,
size_t
key_len
,
const
char
*
value
,
size_t
value_len
,
int
entry_type
,
uint64_t
seq
,
uint64_t
file_size
),
void
(
*
finish
)(
void
*
,
crocksdb_user_collected_properties_t
*
props
));
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collector_destroy
(
crocksdb_table_properties_collector_t
*
);
/* Table Properties Collector Factory */
extern
C_ROCKSDB_LIBRARY_API
crocksdb_table_properties_collector_factory_t
*
crocksdb_table_properties_collector_factory_create
(
void
*
state
,
const
char
*
(
*
name
)(
void
*
),
void
(
*
destruct
)(
void
*
),
crocksdb_table_properties_collector_t
*
(
*
create_table_properties_collector
)(
void
*
,
uint32_t
cf
));
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_table_properties_collector_factory_destroy
(
crocksdb_table_properties_collector_factory_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_options_add_table_properties_collector_factory
(
crocksdb_options_t
*
opt
,
crocksdb_table_properties_collector_factory_t
*
f
);
/* Get Table Properties */
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_get_propeties_of_all_tables
(
crocksdb_t
*
db
,
crocksdb_table_properties_collection_t
*
props
,
char
**
errptr
);
...
...
librocksdb_sys/src/lib.rs
View file @
a7c9bd69
This diff is collapsed.
Click to expand it.
src/rocksdb.rs
View file @
a7c9bd69
...
...
@@ -34,6 +34,12 @@ pub struct CFHandle {
inner
:
*
mut
DBCFHandle
,
}
impl
CFHandle
{
fn
get_id
(
&
self
)
->
u32
{
unsafe
{
crocksdb_ffi
::
crocksdb_column_family_handle_get_id
(
self
.inner
)
}
}
}
impl
Drop
for
CFHandle
{
fn
drop
(
&
mut
self
)
{
unsafe
{
...
...
src/rocksdb_options.rs
View file @
a7c9bd69
...
...
@@ -27,7 +27,7 @@ use slice_transform::{SliceTransform, new_slice_transform};
use
std
::
ffi
::{
CStr
,
CString
};
use
std
::
mem
;
use
table_properties_collector_factory
::{
TablePropertiesCollectorFactory
,
new_table_properties_collector_factory
_context
};
new_table_properties_collector_factory
};
#[derive(Default,
Debug)]
pub
struct
HistogramData
{
...
...
@@ -384,8 +384,7 @@ impl Options {
pub
fn
add_table_properties_collector_factory
(
&
mut
self
,
factory
:
Box
<
TablePropertiesCollectorFactory
>
)
{
unsafe
{
let
context
=
Box
::
into_raw
(
new_table_properties_collector_factory_context
(
factory
));
let
f
=
crocksdb_ffi
::
crocksdb_table_properties_collector_factory_create
(
context
);
let
f
=
new_table_properties_collector_factory
(
factory
);
crocksdb_ffi
::
crocksdb_options_add_table_properties_collector_factory
(
self
.inner
,
f
);
}
}
...
...
src/table_properties.rs
View file @
a7c9bd69
...
...
@@ -11,7 +11,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use
crocksdb_ffi
::{
self
,
DBTablePropertiesCollection
,
ptr_to_string
};
use
crocksdb_ffi
::{
self
,
DBTableProperties
,
DBTableProperty
,
DBUserCollectedProperties
,
DBUserCollectedPropertiesIterator
,
DBTablePropertiesCollection
,
DBTablePropertiesCollectionIterator
};
use
libc
::
size_t
;
use
std
::
collections
::
HashMap
;
use
std
::
slice
;
...
...
@@ -35,11 +38,39 @@ pub struct TableProperties {
pub
property_collectors_names
:
String
,
pub
compression_name
:
String
,
pub
user_collected_properties
:
HashMap
<
Vec
<
u8
>
,
Vec
<
u8
>>
,
pub
readable_properties
:
HashMap
<
String
,
String
>
,
}
pub
type
TablePropertiesCollection
=
HashMap
<
String
,
TableProperties
>
;
pub
struct
TablePropertiesHandle
{
pub
inner
:
*
mut
DBTableProperties
,
}
impl
TablePropertiesHandle
{
fn
new
(
inner
:
*
mut
DBTableProperties
)
->
TablePropertiesHandle
{
TablePropertiesHandle
{
inner
:
inner
}
}
fn
get_u64
(
&
self
,
prop
:
DBTableProperty
)
->
u64
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_get_u64
(
self
.inner
,
prop
)
}
}
fn
get_str
(
&
self
,
prop
:
DBTableProperty
)
->
Result
<
String
,
String
>
{
unsafe
{
let
mut
slen
:
size_t
=
0
;
let
s
=
crocksdb_ffi
::
crocksdb_table_properties_get_str
(
self
.inner
,
prop
,
&
mut
slen
as
*
mut
size_t
);
let
bytes
=
slice
::
from_raw_parts
(
s
,
slen
);
String
::
from_utf8
(
bytes
.to_owned
())
.or_else
(|
e
|
Err
(
format!
(
"{}"
,
e
)))
}
}
fn
get_user_properties
(
&
self
)
->
*
mut
DBUserCollectedProperties
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_get_user_properties
(
self
.inner
)
}
}
}
pub
struct
TablePropertiesCollectionHandle
{
pub
inner
:
*
mut
DBTablePropertiesCollection
,
}
...
...
@@ -63,37 +94,142 @@ impl TablePropertiesCollectionHandle {
pub
fn
normalize
(
&
self
)
->
Result
<
TablePropertiesCollection
,
String
>
{
let
mut
collection
=
TablePropertiesCollection
::
new
();
unsafe
{
let
ctx
=
&*
(
self
.inner
as
*
mut
DBTablePropertiesCollection
);
let
keys
=
slice
::
from_raw_parts
(
ctx
.keys
,
ctx
.size
);
let
values
=
slice
::
from_raw_parts
(
ctx
.values
,
ctx
.size
);
for
i
in
0
..
ctx
.size
{
let
props
=
&
values
[
i
];
let
k
=
ptr_to_string
(
keys
[
i
])
?
;
let
v
=
TableProperties
{
data_size
:
props
.data_size
,
index_size
:
props
.index_size
,
filter_size
:
props
.filter_size
,
raw_key_size
:
props
.raw_key_size
,
raw_value_size
:
props
.raw_value_size
,
num_data_blocks
:
props
.num_data_blocks
,
num_entries
:
props
.num_entries
,
format_version
:
props
.format_version
,
fixed_key_len
:
props
.fixed_key_len
,
column_family_id
:
props
.column_family_id
,
column_family_name
:
try!
(
ptr_to_string
(
props
.column_family_name
)),
filter_policy_name
:
try!
(
ptr_to_string
(
props
.filter_policy_name
)),
comparator_name
:
try!
(
ptr_to_string
(
props
.comparator_name
)),
merge_operator_name
:
try!
(
ptr_to_string
(
props
.merge_operator_name
)),
prefix_extractor_name
:
try!
(
ptr_to_string
(
props
.prefix_extractor_name
)),
property_collectors_names
:
try!
(
ptr_to_string
(
props
.property_collectors_names
)),
compression_name
:
try!
(
ptr_to_string
(
props
.compression_name
)),
user_collected_properties
:
try!
(
props
.user_collected_properties
.to_bytes_map
()),
readable_properties
:
try!
(
props
.readable_properties
.to_strings_map
()),
};
collection
.insert
(
k
,
v
);
let
mut
it
=
TablePropertiesCollectionIter
::
new
(
self
.inner
);
while
it
.valid
()
{
let
k
=
try!
(
it
.key
());
let
v
=
TablePropertiesHandle
::
new
(
it
.value
());
let
mut
props
=
TableProperties
{
data_size
:
v
.get_u64
(
DBTableProperty
::
DataSize
),
index_size
:
v
.get_u64
(
DBTableProperty
::
IndexSize
),
filter_size
:
v
.get_u64
(
DBTableProperty
::
FilterSize
),
raw_key_size
:
v
.get_u64
(
DBTableProperty
::
RawKeySize
),
raw_value_size
:
v
.get_u64
(
DBTableProperty
::
RawValueSize
),
num_data_blocks
:
v
.get_u64
(
DBTableProperty
::
NumDataBlocks
),
num_entries
:
v
.get_u64
(
DBTableProperty
::
NumEntries
),
format_version
:
v
.get_u64
(
DBTableProperty
::
FormatVersion
),
fixed_key_len
:
v
.get_u64
(
DBTableProperty
::
FixedKeyLen
),
column_family_id
:
v
.get_u64
(
DBTableProperty
::
ColumnFamilyId
),
column_family_name
:
try!
(
v
.get_str
(
DBTableProperty
::
ColumnFamilyName
)),
filter_policy_name
:
try!
(
v
.get_str
(
DBTableProperty
::
FilterPolicyName
)),
comparator_name
:
try!
(
v
.get_str
(
DBTableProperty
::
ComparatorName
)),
merge_operator_name
:
try!
(
v
.get_str
(
DBTableProperty
::
MergeOperatorName
)),
prefix_extractor_name
:
try!
(
v
.get_str
(
DBTableProperty
::
PrefixExtractorName
)),
property_collectors_names
:
try!
(
v
.get_str
(
DBTableProperty
::
PropertyCollectorsNames
)),
compression_name
:
try!
(
v
.get_str
(
DBTableProperty
::
CompressionName
)),
user_collected_properties
:
HashMap
::
new
(),
};
let
mut
user_it
=
UserCollectedPropertiesIter
::
new
(
v
.get_user_properties
());
while
user_it
.valid
()
{
{
let
k
=
user_it
.key
();
let
v
=
user_it
.value
();
props
.user_collected_properties
.insert
(
k
.to_owned
(),
v
.to_owned
());
}
user_it
.next
();
}
collection
.insert
(
k
,
props
);
it
.next
();
}
Ok
(
collection
)
}
}
struct
TablePropertiesCollectionIter
{
pub
inner
:
*
mut
DBTablePropertiesCollectionIterator
,
}
impl
Drop
for
TablePropertiesCollectionIter
{
fn
drop
(
&
mut
self
)
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_destroy
(
self
.inner
);
}
}
}
impl
TablePropertiesCollectionIter
{
fn
new
(
inner
:
*
mut
DBTablePropertiesCollection
)
->
TablePropertiesCollectionIter
{
unsafe
{
TablePropertiesCollectionIter
{
inner
:
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_create
(
inner
),
}
}
}
fn
valid
(
&
self
)
->
bool
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_valid
(
self
.inner
)
}
}
fn
next
(
&
mut
self
)
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_next
(
self
.inner
);
}
}
fn
key
(
&
self
)
->
Result
<
String
,
String
>
{
unsafe
{
let
mut
klen
:
size_t
=
0
;
let
k
=
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_key
(
self
.inner
,
&
mut
klen
as
*
mut
size_t
);
let
bytes
=
slice
::
from_raw_parts
(
k
,
klen
);
String
::
from_utf8
(
bytes
.to_owned
())
.or_else
(|
e
|
Err
(
format!
(
"{}"
,
e
)))
}
}
fn
value
(
&
self
)
->
*
mut
DBTableProperties
{
unsafe
{
crocksdb_ffi
::
crocksdb_table_properties_collection_iter_value
(
self
.inner
)
}
}
}
struct
UserCollectedPropertiesIter
{
pub
inner
:
*
mut
DBUserCollectedPropertiesIterator
,
}
impl
Drop
for
UserCollectedPropertiesIter
{
fn
drop
(
&
mut
self
)
{
unsafe
{
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_destroy
(
self
.inner
);
}
}
}
impl
UserCollectedPropertiesIter
{
fn
new
(
inner
:
*
mut
DBUserCollectedProperties
)
->
UserCollectedPropertiesIter
{
unsafe
{
UserCollectedPropertiesIter
{
inner
:
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_create
(
inner
),
}
}
}
fn
valid
(
&
self
)
->
bool
{
unsafe
{
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_valid
(
self
.inner
)
}
}
fn
next
(
&
mut
self
)
{
unsafe
{
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_next
(
self
.inner
);
}
}
fn
key
(
&
self
)
->
&
[
u8
]
{
unsafe
{
let
mut
klen
:
size_t
=
0
;
let
k
=
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_key
(
self
.inner
,
&
mut
klen
as
*
mut
size_t
);
slice
::
from_raw_parts
(
k
,
klen
)
}
}
fn
value
(
&
self
)
->
&
[
u8
]
{
unsafe
{
let
mut
vlen
:
size_t
=
0
;
let
v
=
crocksdb_ffi
::
crocksdb_user_collected_properties_iter_value
(
self
.inner
,
&
mut
vlen
as
*
mut
size_t
);
slice
::
from_raw_parts
(
v
,
vlen
)
}
}
}
src/table_properties_collector.rs
View file @
a7c9bd69
...
...
@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use
crocksdb_ffi
::{
self
,
DBEntryType
,
DB
TablePropertiesCollectorContext
};
use
crocksdb_ffi
::{
self
,
DBEntryType
,
DB
UserCollectedProperties
,
DBTablePropertiesCollector
};
use
libc
::{
c_void
,
c_char
,
c_int
,
uint8_t
,
uint64_t
,
size_t
};
use
std
::
collections
::
HashMap
;
use
std
::
mem
;
...
...
@@ -33,28 +33,23 @@ pub trait TablePropertiesCollector {
/// Will be called when a table has already been built and is ready for
/// writing the properties block.
fn
finish
(
&
mut
self
)
->
HashMap
<
Vec
<
u8
>
,
Vec
<
u8
>>
;
/// Return the human-readable properties, where the key is property name and
/// the value is the human-readable form of value.
fn
readable_properties
(
&
self
)
->
HashMap
<
String
,
String
>
;
}
extern
"C"
fn
name
(
co
ntext
:
*
mut
c_void
)
->
*
const
c_char
{
extern
"C"
fn
name
(
co
llector
:
*
mut
c_void
)
->
*
const
c_char
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorContext
);
let
collector
=
&
mut
*
(
context
.collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
let
collector
=
&
mut
*
(
collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
collector
.name
()
.as_ptr
()
as
*
const
c_char
}
}
extern
"C"
fn
destruct
or
(
context
:
*
mut
c_void
)
{
extern
"C"
fn
destruct
(
collector
:
*
mut
c_void
)
{
unsafe
{
let
co
ntext
=
Box
::
from_raw
(
context
as
*
mut
DBTablePropertiesCollectorContext
);
Box
::
from_raw
(
co
ntext
.collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
let
co
llector
=
&
mut
*
(
collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
Box
::
from_raw
(
co
llector
);
}
}
pub
extern
"C"
fn
add_userkey
(
co
ntext
:
*
mut
c_void
,
pub
extern
"C"
fn
add_userkey
(
co
llector
:
*
mut
c_void
,
key
:
*
const
uint8_t
,
key_len
:
size_t
,
value
:
*
const
uint8_t
,
...
...
@@ -63,18 +58,16 @@ pub extern "C" fn add_userkey(context: *mut c_void,
_
:
uint64_t
,
_
:
uint64_t
)
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorContext
);
let
collector
=
&
mut
*
(
context
.collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
let
collector
=
&
mut
*
(
collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
let
key
=
slice
::
from_raw_parts
(
key
,
key_len
);
let
value
=
slice
::
from_raw_parts
(
value
,
value_len
);
collector
.add_userkey
(
key
,
value
,
mem
::
transmute
(
entry_type
))
collector
.add_userkey
(
key
,
value
,
mem
::
transmute
(
entry_type
))
;
}
}
pub
extern
"C"
fn
finish
(
co
ntext
:
*
mut
c_void
,
props
:
*
mut
c_void
)
{
pub
extern
"C"
fn
finish
(
co
llector
:
*
mut
c_void
,
props
:
*
mut
DBUserCollectedProperties
)
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorContext
);
let
collector
=
&
mut
*
(
context
.collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
let
collector
=
&
mut
*
(
collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
for
(
key
,
value
)
in
collector
.finish
()
{
crocksdb_ffi
::
crocksdb_user_collected_properties_add
(
props
,
key
.as_ptr
(),
...
...
@@ -85,28 +78,13 @@ pub extern "C" fn finish(context: *mut c_void, props: *mut c_void) {
}
}
pub
extern
"C"
fn
readable_properties
(
context
:
*
mut
c_void
,
props
:
*
mut
c_void
)
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorContext
);
let
collector
=
&
mut
*
(
context
.collector
as
*
mut
Box
<
TablePropertiesCollector
>
);
for
(
key
,
value
)
in
collector
.readable_properties
()
{
crocksdb_ffi
::
crocksdb_user_collected_properties_add
(
props
,
key
.as_ptr
(),
key
.len
(),
value
.as_ptr
(),
value
.len
());
}
}
}
pub
unsafe
fn
new_table_properties_collector_context
(
collector
:
Box
<
TablePropertiesCollector
>
)
->
Box
<
DBTablePropertiesCollectorContext
>
{
Box
::
new
(
DBTablePropertiesCollectorContext
{
collector
:
Box
::
into_raw
(
Box
::
new
(
collector
))
as
*
mut
c_void
,
name
:
name
,
destructor
:
destructor
,
add_userkey
:
add_userkey
,
finish
:
finish
,
readable_properties
:
readable_properties
,
})
pub
unsafe
fn
new_table_properties_collector
(
collector
:
Box
<
TablePropertiesCollector
>
)
->
*
mut
DBTablePropertiesCollector
{
crocksdb_ffi
::
crocksdb_table_properties_collector_create
(
Box
::
into_raw
(
Box
::
new
(
collector
))
as
*
mut
c_void
,
name
,
destruct
,
add_userkey
,
finish
,
)
}
src/table_properties_collector_factory.rs
View file @
a7c9bd69
...
...
@@ -11,9 +11,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use
crocksdb_ffi
::
DBTablePropertiesCollectorFactoryContext
;
use
crocksdb_ffi
::
{
self
,
DBTablePropertiesCollector
,
DBTablePropertiesCollectorFactory
}
;
use
libc
::{
c_void
,
c_char
,
uint32_t
};
use
table_properties_collector
::{
TablePropertiesCollector
,
new_table_properties_collector
_context
};
use
table_properties_collector
::{
TablePropertiesCollector
,
new_table_properties_collector
};
/// Constructs `TablePropertiesCollector`.
/// Internals create a new `TablePropertiesCollector` for each new table.
...
...
@@ -24,37 +24,36 @@ pub trait TablePropertiesCollectorFactory {
fn
create_table_properties_collector
(
&
mut
self
,
cf
:
u32
)
->
Box
<
TablePropertiesCollector
>
;
}
extern
"C"
fn
name
(
context
:
*
mut
c_void
)
->
*
const
c_char
{
extern
"C"
fn
name
(
factory
:
*
mut
c_void
)
->
*
const
c_char
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorFactoryContext
);
let
factory
=
&
mut
*
(
context
.factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
let
factory
=
&
mut
*
(
factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
factory
.name
()
.as_ptr
()
as
*
const
c_char
}
}
extern
"C"
fn
destruct
or
(
context
:
*
mut
c_void
)
{
extern
"C"
fn
destruct
(
factory
:
*
mut
c_void
)
{
unsafe
{
let
context
=
Box
::
from_raw
(
context
as
*
mut
DBTablePropertiesCollectorFactoryContext
);
Box
::
from_raw
(
context
.factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
Box
::
from_raw
(
factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
}
}
extern
"C"
fn
create_table_properties_collector
(
context
:
*
mut
c_void
,
cf
:
uint32_t
)
->
*
mut
c_void
{
extern
"C"
fn
create_table_properties_collector
(
factory
:
*
mut
c_void
,
cf
:
uint32_t
)
->
*
mut
DBTablePropertiesCollector
{
unsafe
{
let
context
=
&
mut
*
(
context
as
*
mut
DBTablePropertiesCollectorFactoryContext
);
let
factory
=
&
mut
*
(
context
.factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
let
factory
=
&
mut
*
(
factory
as
*
mut
Box
<
TablePropertiesCollectorFactory
>
);
let
collector
=
factory
.create_table_properties_collector
(
cf
);
Box
::
into_raw
(
new_table_properties_collector_context
(
collector
))
as
*
mut
c_void
new_table_properties_collector
(
collector
)
}
}
pub
unsafe
fn
new_table_properties_collector_factory
_context
pub
unsafe
fn
new_table_properties_collector_factory
(
factory
:
Box
<
TablePropertiesCollectorFactory
>
)
->
Box
<
DBTablePropertiesCollectorFactoryContext
>
{
Box
::
new
(
DBTablePropertiesCollectorFactoryContext
{
factory
:
Box
::
into_raw
(
Box
::
new
(
factory
))
as
*
mut
c_void
,
name
:
name
,
destructor
:
destructor
,
create_table_properties_collector
:
create_table_properties_collector
,
}
)
->
*
mut
DBTablePropertiesCollectorFactory
{
crocksdb_ffi
::
crocksdb_table_properties_collector_factory_create
(
Box
::
into_raw
(
Box
::
new
(
factory
))
as
*
mut
c_void
,
name
,
destruct
,
create_table_properties_collector
,
)
}
tests/test_table_properties.rs
View file @
a7c9bd69
...
...
@@ -106,26 +106,17 @@ impl TablePropertiesCollector for ExampleCollector {
self
.last_key
.extend_from_slice
(
key
);
}
match
entry_type
{
DBEntryType
::
DB
Put
=>
self
.num_puts
+=
1
,
DBEntryType
::
DB
Merge
=>
self
.num_merges
+=
1
,
DBEntryType
::
D
BD
elete
|
DBEntryType
::
DB
SingleDelete
=>
self
.num_deletes
+=
1
,
DBEntryType
::
DB
Other
=>
{}
DBEntryType
::
Put
=>
self
.num_puts
+=
1
,
DBEntryType
::
Merge
=>
self
.num_merges
+=
1
,
DBEntryType
::
Delete
|
DBEntryType
::
SingleDelete
=>
self
.num_deletes
+=
1
,
DBEntryType
::
Other
=>
{}
}
}
fn
finish
(
&
mut
self
)
->
HashMap
<
Vec
<
u8
>
,
Vec
<
u8
>>
{
self
.encode
()
}
fn
readable_properties
(
&
self
)
->
HashMap
<
String
,
String
>
{
let
mut
props
=
HashMap
::
new
();
props
.insert
(
"num_keys"
.to_owned
(),
self
.num_keys
.to_string
());
props
.insert
(
"num_puts"
.to_owned
(),
self
.num_puts
.to_string
());
props
.insert
(
"num_merges"
.to_owned
(),
self
.num_merges
.to_string
());
props
.insert
(
"num_deletes"
.to_owned
(),
self
.num_deletes
.to_string
());
props
}
}
struct
ExampleFactory
{}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment