Skip to content

Commit fa329d7

Browse files
committed
some code improve
1 parent 21c9821 commit fa329d7

File tree

4 files changed

+64
-63
lines changed

4 files changed

+64
-63
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ pyo3 = { version = "0.18.1", features = [
1919
] }
2020
lazy_static = "1.4.0"
2121

22-
# [dev_dependencies]
23-
# rspec = "1.0"
22+
[dev_dependencies]
23+
rspec = "1.0"
2424

2525
[profile.dev]
2626
overflow-checks=false

src/entry.rs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ pub enum Value {
1717
Float(f64),
1818
Text(CacheString),
1919
Boolen(bool),
20-
UserDefined(*mut c_void, Option<Arc<DeferUnsafe>>),
21-
PyObject(*mut c_void, Arc<DeferUnsafe>),
20+
UserDefined(
21+
*mut c_void, //data
22+
i32, //kind
23+
Option<Arc<DeferUnsafe>>, // de-allocator
24+
),
2225
}
2326

2427
impl From<i64> for Value {
@@ -59,13 +62,13 @@ impl From<bool> for Value {
5962

6063
impl From<*mut c_void> for Value {
6164
fn from(value: *mut c_void) -> Self {
62-
Value::UserDefined(value, None)
65+
Value::UserDefined(value, 0, None)
6366
}
6467
}
6568

6669
impl Value {
67-
pub fn pyobj(ptr: *mut c_void, free: unsafe fn(*mut c_void)) -> Value {
68-
Value::PyObject(ptr, Arc::new(DeferUnsafe(ptr, free)))
70+
pub fn managed(ptr: *mut c_void, kind: i32, free: unsafe fn(*mut c_void)) -> Value {
71+
Value::UserDefined(ptr, kind, Arc::new(DeferUnsafe(ptr, free)).into())
6972
}
7073
}
7174

@@ -75,14 +78,15 @@ impl TryFrom<Value> for i64 {
7578
fn try_from(value: Value) -> Result<Self, Self::Error> {
7679
match value {
7780
Value::Empty => Err("empty value error".into()),
78-
Value::Int(v) => Ok(v),
81+
Value::Int(v) => Ok(v.into()),
7982
Value::Float(v) => Ok(v as i64),
8083
Value::Text(v) => v
8184
.parse::<i64>()
8285
.or_else(|_| Err(format!("error convert {} into i64", v))),
8386
Value::Boolen(v) => Ok(v.into()),
84-
Value::UserDefined(_, _) => Err("data type not matched, `Userdefined` and i64".into()),
85-
Value::PyObject(_, _) => Err("data type not matched, `PyObject` and i64".into()),
87+
Value::UserDefined(_, _, _) => {
88+
Err("data type not matched, `UserDefined` and i64".into())
89+
}
8690
}
8791
}
8892
}
@@ -99,8 +103,9 @@ impl TryFrom<Value> for f64 {
99103
.parse::<f64>()
100104
.or_else(|_| Err(format!("error convert {} into i64", v))),
101105
Value::Boolen(_) => Err("data type not matched, `Boolen` and i64".into()),
102-
Value::UserDefined(_, _) => Err("data type not matched, `Userdefined` and f64".into()),
103-
Value::PyObject(_, _) => Err("data type not matched, `PyObject` and f64".into()),
106+
Value::UserDefined(_, _, _) => {
107+
Err("data type not matched, `UserDefined` and f64".into())
108+
}
104109
}
105110
}
106111
}
@@ -115,8 +120,9 @@ impl TryFrom<Value> for String {
115120
Value::Float(v) => Ok(format!("{}", v)),
116121
Value::Text(v) => Ok(v.to_string()),
117122
Value::Boolen(v) => Ok(format!("{}", v)),
118-
Value::UserDefined(_, _) => Err("data type not matched, `Userdefined` and str".into()),
119-
Value::PyObject(_, _) => Err("data type not matched, `PyObject` and str".into()),
123+
Value::UserDefined(_, _, _) => {
124+
Err("data type not matched, `UserDefined` and str".into())
125+
}
120126
}
121127
}
122128
}
@@ -131,8 +137,9 @@ impl TryFrom<Value> for bool {
131137
Value::Float(_) => Err("data type not matched, `Float` and bool".into()),
132138
Value::Text(_) => Err("data type not matched, `Text` and bool".into()),
133139
Value::Boolen(v) => Ok(v),
134-
Value::UserDefined(_, _) => Err("data type not matched, `Userdefined` and str".into()),
135-
Value::PyObject(_, _) => Err("data type not matched, `PyObject` and str".into()),
140+
Value::UserDefined(_, _, _) => {
141+
Err("data type not matched, `UserDefined` and str".into())
142+
}
136143
}
137144
}
138145
}
@@ -182,11 +189,10 @@ impl Entry {
182189
}
183190

184191
pub fn update<V: Into<Value>>(&mut self, val: V) {
185-
let his = self.val.history();
186-
if his.is_none() {
187-
self.val = EntryValue::Single(val.into());
192+
if let Some(his) = self.val.history() {
193+
self.val = EntryValue::Versioned(val.into(), his.clone());
188194
} else {
189-
self.val = EntryValue::Versioned(val.into(), (*his.unwrap()).clone());
195+
self.val = EntryValue::Single(val.into());
190196
}
191197
}
192198

@@ -196,13 +202,10 @@ impl Entry {
196202
}
197203

198204
pub fn rollback(&mut self) -> Result<(), ()> {
199-
let his = self.val.history();
200-
match his {
201-
None => Err(()),
202-
Some(h) => {
203-
self.val = *h.clone();
204-
Ok(())
205-
}
205+
if let Some(h) = self.val.history() {
206+
self.val = *h.clone();
207+
return Ok(());
206208
}
209+
return Err(());
207210
}
208211
}

src/ext.rs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,23 @@ use crate::storage::Storage;
1919
use crate::storage::StorageManager;
2020
use crate::storage::MGR;
2121

22+
#[repr(C)]
23+
enum UserDefinedType {
24+
PyObjectType = 1,
25+
}
26+
27+
impl Into<Value> for *mut pyo3::ffi::PyObject {
28+
fn into(self) -> Value {
29+
Value::managed(
30+
self as *mut c_void,
31+
UserDefinedType::PyObjectType as i32,
32+
|obj: *mut c_void| unsafe {
33+
Py_DecRef(obj as *mut pyo3::ffi::PyObject);
34+
},
35+
)
36+
}
37+
}
38+
2239
#[pyclass]
2340
pub struct KVStorage {
2441
storage: Storage,
@@ -44,9 +61,12 @@ impl KVStorage {
4461
Value::Float(v) => res.set_item(k, v),
4562
Value::Text(v) => res.set_item(k, v.as_str()),
4663
Value::Boolen(v) => res.set_item(k, v),
47-
Value::UserDefined(v, _) => res.set_item(k, v as u64),
48-
Value::PyObject(v, _) => {
49-
res.set_item(k, PyAny::from_owned_ptr(py, v as *mut pyo3::ffi::PyObject))
64+
Value::UserDefined(v, k, _) => {
65+
if k == UserDefinedType::PyObjectType as i32 {
66+
res.set_item(k, PyAny::from_owned_ptr(py, v as *mut pyo3::ffi::PyObject))
67+
} else {
68+
res.set_item(k, v as u64)
69+
}
5070
}
5171
}
5272
.unwrap();
@@ -93,10 +113,15 @@ impl KVStorage {
93113
Value::Float(v) => Ok(Some(v.into_py(py))),
94114
Value::Text(v) => Ok(Some(v.into_py(py))),
95115
Value::Boolen(v) => Ok(Some(v.into_py(py))),
96-
Value::UserDefined(v, _) => Ok(Some((v as u64).into_py(py))),
97-
Value::PyObject(v, _) => Ok(Some(
98-
PyAny::from_borrowed_ptr(py, v as *mut pyo3::ffi::PyObject).into(),
99-
)),
116+
Value::UserDefined(v, k, _) => {
117+
if k == UserDefinedType::PyObjectType as i32 {
118+
Ok(Some(
119+
PyAny::from_borrowed_ptr(py, v as *mut pyo3::ffi::PyObject).into(),
120+
))
121+
} else {
122+
Ok(Some((v as u64).into_py(py)))
123+
}
124+
}
100125
},
101126
None => Err(PyValueError::new_err("not found")),
102127
}
@@ -105,13 +130,10 @@ impl KVStorage {
105130
pub unsafe fn put(&mut self, key: String, val: &PyAny) -> PyResult<()> {
106131
if self.isview {
107132
MGR.with(|mgr: &RefCell<StorageManager>| mgr.borrow_mut().put_key(key.clone()));
108-
// MGR.with_borrow_mut(|mgr| mgr.put_key(key.clone()));
109133
}
110134
if val.is_none() {
111135
self.storage.put(key, Value::Empty);
112-
return Ok(());
113-
}
114-
if val.is_instance_of::<PyBool>().unwrap() {
136+
} else if val.is_instance_of::<PyBool>().unwrap() {
115137
self.storage.put(key, val.extract::<bool>().unwrap());
116138
} else if val.is_instance_of::<PyFloat>().unwrap() {
117139
self.storage.put(key, val.extract::<f64>().unwrap());
@@ -120,14 +142,8 @@ impl KVStorage {
120142
} else if val.is_instance_of::<PyInt>().unwrap() {
121143
self.storage.put(key, val.extract::<i64>().unwrap());
122144
} else {
123-
// TODO support release pyobj
124145
Py_IncRef(val.into_ptr());
125-
self.storage.put(
126-
key,
127-
Value::pyobj(val.into_ptr() as *mut c_void, |obj: *mut c_void| {
128-
Py_DecRef(obj as *mut pyo3::ffi::PyObject);
129-
}),
130-
);
146+
self.storage.put(key, val.into_ptr());
131147
}
132148
Ok(())
133149
}

src/storage.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,6 @@ impl Storage {
156156
let keys = self.tree().keys().cloned().collect();
157157
m.borrow_mut().stack.push(RefCell::new(keys));
158158
});
159-
// MGR.with_borrow_mut(|m| {
160-
// for (k, v) in self.tree().iter() {
161-
// if m.tls.borrow().contains_key(&k) {
162-
// tree_revision(m.tls.borrow_mut(), *k, v.clone_value());
163-
// } else {
164-
// m.tls.borrow_mut().insert(*k, v.clone());
165-
// }
166-
// }
167-
// let keys = self.tree().keys().cloned().collect();
168-
// m.stack.push(RefCell::new(keys));
169-
// });
170159
self.isview += 1;
171160
}
172161

@@ -179,13 +168,6 @@ impl Storage {
179168
.for_each(|k| tree_rollback(m.tls.borrow_mut(), *k));
180169
}
181170
});
182-
// MGR.with_borrow_mut(|m| {
183-
// if let Some(keys) = m.stack.pop() {
184-
// keys.borrow()
185-
// .iter()
186-
// .for_each(|k| tree_rollback(m.tls.borrow_mut(), *k));
187-
// }
188-
// });
189171
self.isview -= 1;
190172
}
191173

0 commit comments

Comments
 (0)