...
This commit is contained in:
parent
189971509a
commit
e1ea2c06cd
@ -1,168 +0,0 @@
|
|||||||
# OurDB Migration Guide: V to Rust
|
|
||||||
|
|
||||||
This guide helps you migrate from the V implementation of OurDB to the new Rust implementation.
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
The Rust implementation of OurDB maintains the same core functionality and data format as the V implementation, allowing for a smooth transition. However, there are some API differences due to Rust's type system and idioms.
|
|
||||||
|
|
||||||
## Key Differences
|
|
||||||
|
|
||||||
### 1. Configuration
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Create a new OurDB instance
|
|
||||||
mut db := ourdb.new_db(path: '/path/to/db', incremental_mode: true)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Create a new OurDB instance
|
|
||||||
let config = OurDBConfig {
|
|
||||||
path: PathBuf::from("/path/to/db"),
|
|
||||||
incremental_mode: true,
|
|
||||||
file_size: None, // Use default (500MB)
|
|
||||||
keysize: None, // Use default (4 bytes)
|
|
||||||
};
|
|
||||||
let mut db = OurDB::new(config)?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Setting Values
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Set a value with auto-generated ID
|
|
||||||
id := db.set(data: 'Hello, World!'.bytes())!
|
|
||||||
|
|
||||||
// Set a value with explicit ID
|
|
||||||
db.set(id: 42, data: 'Hello, World!'.bytes())!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Set a value with auto-generated ID
|
|
||||||
let id = db.set(OurDBSetArgs {
|
|
||||||
id: None,
|
|
||||||
data: b"Hello, World!"
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Set a value with explicit ID
|
|
||||||
db.set(OurDBSetArgs {
|
|
||||||
id: Some(42),
|
|
||||||
data: b"Hello, World!"
|
|
||||||
})?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Getting Values
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Get a value
|
|
||||||
data := db.get(42)!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Get a value
|
|
||||||
let data = db.get(42)?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Getting History
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Get history (up to 5 versions)
|
|
||||||
history := db.get_history(42, 5)!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Get history (up to 5 versions)
|
|
||||||
let history = db.get_history(42, 5)?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. Deleting Values
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Delete a value
|
|
||||||
db.delete(42)!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Delete a value
|
|
||||||
db.delete(42)?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6. Error Handling
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// V uses the ! operator for error propagation
|
|
||||||
result := db.operation()!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Rust uses the ? operator for error propagation
|
|
||||||
let result = db.operation()?;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7. Closing the Database
|
|
||||||
|
|
||||||
**V Implementation:**
|
|
||||||
```v
|
|
||||||
// Close the database
|
|
||||||
db.close()!
|
|
||||||
```
|
|
||||||
|
|
||||||
**Rust Implementation:**
|
|
||||||
```rust
|
|
||||||
// Close the database
|
|
||||||
db.close()?;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Data Migration
|
|
||||||
|
|
||||||
The Rust implementation uses the same file format as the V implementation, so your existing database files should be compatible. However, it's always recommended to back up your data before migrating.
|
|
||||||
|
|
||||||
To migrate an existing database:
|
|
||||||
|
|
||||||
1. Back up your existing database directory
|
|
||||||
2. Point the Rust implementation to the same directory
|
|
||||||
3. Test that all your data is accessible
|
|
||||||
|
|
||||||
Example:
|
|
||||||
```rust
|
|
||||||
// Open an existing database created with the V implementation
|
|
||||||
let config = OurDBConfig {
|
|
||||||
path: PathBuf::from("/path/to/existing/db"),
|
|
||||||
incremental_mode: true, // Must match the original configuration
|
|
||||||
file_size: None,
|
|
||||||
keysize: None,
|
|
||||||
};
|
|
||||||
let mut db = OurDB::new(config)?;
|
|
||||||
|
|
||||||
// Verify data access
|
|
||||||
let data = db.get(some_known_id)?;
|
|
||||||
println!("Retrieved: {:?}", data);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Performance Considerations
|
|
||||||
|
|
||||||
The Rust implementation may have different performance characteristics compared to the V implementation. If your application is performance-sensitive, consider running benchmarks to compare the two implementations.
|
|
||||||
|
|
||||||
## Additional Features in Rust Implementation
|
|
||||||
|
|
||||||
The Rust implementation includes some additional features not present in the V implementation:
|
|
||||||
|
|
||||||
1. More comprehensive error types
|
|
||||||
2. Better memory management
|
|
||||||
3. Improved thread safety
|
|
||||||
4. More extensive testing
|
|
||||||
|
|
||||||
## Need Help?
|
|
||||||
|
|
||||||
If you encounter any issues during migration, please refer to the documentation or open an issue in the repository.
|
|
@ -117,6 +117,8 @@ Run an example with:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cargo run --example basic_usage
|
cargo run --example basic_usage
|
||||||
|
cargo run --example advanced_usage
|
||||||
|
cargo run --example benchmark
|
||||||
```
|
```
|
||||||
|
|
||||||
## Performance
|
## Performance
|
||||||
@ -125,9 +127,8 @@ OurDB is designed for efficiency and minimal overhead. The benchmark example can
|
|||||||
|
|
||||||
Typical performance metrics on modern hardware:
|
Typical performance metrics on modern hardware:
|
||||||
|
|
||||||
- **Write**: 50,000+ operations per second
|
- **Write**: 10,000+ operations per second
|
||||||
- **Read**: 100,000+ operations per second
|
- **Read**: 50,000+ operations per second
|
||||||
- **Update**: 40,000+ operations per second
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024), // 10MB
|
file_size: Some(10 * 1024 * 1024), // 10MB
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -36,7 +36,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024), // 10MB
|
file_size: Some(10 * 1024 * 1024), // 10MB
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut setup_db = OurDB::new(setup_config).unwrap();
|
let mut setup_db = OurDB::new(setup_config).unwrap();
|
||||||
@ -59,7 +59,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -78,7 +78,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -102,7 +102,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -125,7 +125,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: delete_path.clone(),
|
path: delete_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -165,7 +165,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: kv_path.clone(),
|
path: kv_path.clone(),
|
||||||
incremental_mode: false, // Key-value mode
|
incremental_mode: false, // Key-value mode
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -192,7 +192,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: inc_path.clone(),
|
path: inc_path.clone(),
|
||||||
incremental_mode: true, // Incremental mode
|
incremental_mode: true, // Incremental mode
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -221,7 +221,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: size_path.clone(),
|
path: size_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
@ -244,7 +244,7 @@ fn criterion_benchmark(c: &mut Criterion) {
|
|||||||
path: size_path.clone(),
|
path: size_path.clone(),
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024),
|
file_size: Some(10 * 1024 * 1024),
|
||||||
keysize: None,
|
keysize: Some(6), // Use keysize=6 to allow non-zero file_nr
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut db = OurDB::new(config).unwrap();
|
let mut db = OurDB::new(config).unwrap();
|
||||||
|
@ -135,7 +135,7 @@ fn performance_benchmark(base_path: &PathBuf) -> Result<(), ourdb::Error> {
|
|||||||
let config = OurDBConfig {
|
let config = OurDBConfig {
|
||||||
path: db_path,
|
path: db_path,
|
||||||
incremental_mode: true,
|
incremental_mode: true,
|
||||||
file_size: Some(10 * 1024 * 1024), // 10MB
|
file_size: Some(1024 * 1024), // 10MB
|
||||||
keysize: Some(4), // 4-byte keys
|
keysize: Some(4), // 4-byte keys
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ fn main() -> Result<(), ourdb::Error> {
|
|||||||
let config = OurDBConfig {
|
let config = OurDBConfig {
|
||||||
path: db_path.clone(),
|
path: db_path.clone(),
|
||||||
incremental_mode,
|
incremental_mode,
|
||||||
file_size: Some(50 * 1024 * 1024), // 50MB
|
file_size: Some(1024 * 1024),
|
||||||
keysize: Some(keysize),
|
keysize: Some(keysize),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ fn main() -> Result<(), ourdb::Error> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_args(args: &[String]) -> (usize, usize, bool, u8) {
|
fn parse_args(args: &[String]) -> (usize, usize, bool, u8) {
|
||||||
let mut num_operations = 10000;
|
let mut num_operations = 100000;
|
||||||
let mut record_size = 100;
|
let mut record_size = 100;
|
||||||
let mut incremental_mode = true;
|
let mut incremental_mode = true;
|
||||||
let mut keysize = 4;
|
let mut keysize = 4;
|
||||||
@ -167,7 +167,7 @@ fn print_usage() {
|
|||||||
println!("Usage: cargo run --example benchmark [OPTIONS]");
|
println!("Usage: cargo run --example benchmark [OPTIONS]");
|
||||||
println!();
|
println!();
|
||||||
println!("Options:");
|
println!("Options:");
|
||||||
println!(" --ops N Number of operations to perform (default: 10000)");
|
println!(" --ops N Number of operations to perform (default: 100000)");
|
||||||
println!(" --size N Size of each record in bytes (default: 100)");
|
println!(" --size N Size of each record in bytes (default: 100)");
|
||||||
println!(" --keyvalue Use key-value mode instead of incremental mode");
|
println!(" --keyvalue Use key-value mode instead of incremental mode");
|
||||||
println!(" --keysize N Key size in bytes (2, 3, 4, or 6) (default: 4)");
|
println!(" --keysize N Key size in bytes (2, 3, 4, or 6) (default: 4)");
|
||||||
|
Loading…
Reference in New Issue
Block a user