pub struct VStorage { /* private fields */ }Expand description
Контейнер для хранилища с динамической диспетчеризацией
Ответственности:
- Хранение экземпляра Storage
- Диспетчеризация вызовов к хранилищу
- Обработка состояния “не инициализировано”
Implementations§
Source§impl VStorage
impl VStorage
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Проверяет, пусто ли хранилище
Examples found in repository?
examples/storage_types.rs (line 30)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Storage Types Comparison ===\n");
14
15 // === 1. Dynamic storage (VStorage) ===
16 println!("🎭 1. Dynamic storage (VStorage)");
17 println!(" • Uses trait objects (Box<dyn Storage>)");
18 println!(" • Runtime flexibility, but has vtable lookup overhead");
19
20 let storage_box = VStorage::builder().memory().build()?;
21 let mut dynamic_storage = VStorage::new(storage_box);
22
23 // Demonstrate operations
24 let _ = dynamic_storage.put_value(StorageId::Individuals, "dynamic:key", "dynamic:value");
25
26 if let StorageResult::Ok(value) = dynamic_storage.get_value(StorageId::Individuals, "dynamic:key") {
27 println!(" • Stored and read: {}", value);
28 }
29
30 println!(" • Storage is empty: {}", dynamic_storage.is_empty());
31
32 // === 2. Generic storage (VStorageGeneric) ===
33 println!("\n🔧 2. Generic storage (VStorageGeneric)");
34 println!(" • Compile-time typing");
35 println!(" • No vtable overhead, but less flexible");
36
37 let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
38
39 let _ = generic_storage.put_value(StorageId::Individuals, "generic:key", "generic:value");
40
41 if let StorageResult::Ok(value) = generic_storage.get_value(StorageId::Individuals, "generic:key") {
42 println!(" • Stored and read: {}", value);
43 }
44
45 println!(" • Storage is empty: {}", generic_storage.is_empty());
46
47 // Can extract inner storage
48 if let Some(inner_storage) = generic_storage.storage() {
49 println!(" • Access to inner storage: available");
50 }
51
52 // === 3. Enum storage (VStorageEnum) ===
53 println!("\n⚡ 3. Enum storage (VStorageEnum)");
54 println!(" • Static dispatch through enum");
55 println!(" • Static dispatch");
56
57 let mut enum_storage = VStorageEnum::memory();
58
59 let _ = enum_storage.put_value(StorageId::Individuals, "enum:key", "enum:value");
60
61 if let StorageResult::Ok(value) = enum_storage.get_value(StorageId::Individuals, "enum:key") {
62 println!(" • Stored and read: {}", value);
63 }
64
65 println!(" • Storage is empty: {}", enum_storage.is_empty());
66
67 // === 4. API consistency ===
68 println!("\n🔄 4. API consistency between types");
69 println!(" • All types have the same Storage interface");
70
71 let test_data = vec![
72 ("test1", "value1"),
73 ("test2", "value2"),
74 ("test3", "value3"),
75 ];
76
77 // Store data in all storage types
78 for (key, value) in &test_data {
79 let _ = dynamic_storage.put_value(StorageId::Tickets, key, value);
80 let _ = generic_storage.put_value(StorageId::Tickets, key, value);
81 let _ = enum_storage.put_value(StorageId::Tickets, key, value);
82 }
83
84 // Check that all return the same results
85 println!(" • Consistency check:");
86 for (key, expected_value) in &test_data {
87 let dynamic_result = dynamic_storage.get_value(StorageId::Tickets, key);
88 let generic_result = generic_storage.get_value(StorageId::Tickets, key);
89 let enum_result = enum_storage.get_value(StorageId::Tickets, key);
90
91 match (dynamic_result, generic_result, enum_result) {
92 (StorageResult::Ok(v1), StorageResult::Ok(v2), StorageResult::Ok(v3)) => {
93 let consistent = v1 == *expected_value && v2 == *expected_value && v3 == *expected_value;
94 println!(" {} -> {}", key, if consistent { "✅ consistent" } else { "❌ inconsistent" });
95 }
96 _ => println!(" {} -> ❌ read error", key),
97 }
98 }
99
100 // === 5. Different constructor demonstrations ===
101 println!("\n🏗️ 5. Different ways to create storages");
102
103 // VStorageEnum - direct creation
104 let _enum_direct = VStorageEnum::memory();
105 println!(" • VStorageEnum::memory() - direct creation");
106
107 // VStorageGeneric - through constructor
108 let _generic_direct = VMemoryStorage::new(memory_storage::MemoryStorage::new());
109 println!(" • VMemoryStorage::new() - through constructor");
110
111 // VStorage - through builder
112 let _dynamic_builder = VStorage::builder().memory().build()?;
113 println!(" • VStorage::builder() - through builder pattern");
114
115 // === 6. Features of each type ===
116 println!("\n📋 6. Usage characteristics");
117
118 println!(" VStorage (Dynamic):");
119 println!(" ✅ Maximum flexibility");
120 println!(" ✅ Can change storage type at runtime");
121 println!(" ❌ Vtable lookup overhead");
122 println!(" ❌ No access to inner type");
123
124 println!(" VStorageGeneric<T> (Generic):");
125 println!(" ✅ Compile-time optimization");
126 println!(" ✅ Access to inner storage");
127 println!(" ✅ Type safety");
128 println!(" ❌ Less flexible at runtime");
129
130 println!(" VStorageEnum (Enum):");
131 println!(" ✅ Static dispatch");
132 println!(" ✅ No heap allocation for storage");
133 println!(" ❌ Fixed set of types");
134
135 // === 7. Usage recommendations ===
136 println!("\n💡 7. Storage type selection recommendations");
137
138 println!(" Use VStorage when:");
139 println!(" • Maximum flexibility is needed");
140 println!(" • Storage type is determined at runtime");
141 println!(" • Flexibility is more important than dispatch overhead");
142
143 println!(" Use VStorageGeneric when:");
144 println!(" • Access to inner storage is needed");
145 println!(" • Type safety is important");
146 println!(" • Storage type is known at compile time");
147
148 println!(" Use VStorageEnum when:");
149 println!(" • Static dispatch is preferred");
150 println!(" • Doing many operations (batch processing)");
151 println!(" • Fixed set of types is suitable");
152
153 println!("\n✨ Demonstration completed!");
154 Ok(())
155}Sourcepub fn new(storage: Box<dyn Storage>) -> VStorage
pub fn new(storage: Box<dyn Storage>) -> VStorage
Основной конструктор принимающий готовое хранилище
Examples found in repository?
examples/basic_usage.rs (line 19)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}More examples
examples/storage_types.rs (line 21)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Storage Types Comparison ===\n");
14
15 // === 1. Dynamic storage (VStorage) ===
16 println!("🎭 1. Dynamic storage (VStorage)");
17 println!(" • Uses trait objects (Box<dyn Storage>)");
18 println!(" • Runtime flexibility, but has vtable lookup overhead");
19
20 let storage_box = VStorage::builder().memory().build()?;
21 let mut dynamic_storage = VStorage::new(storage_box);
22
23 // Demonstrate operations
24 let _ = dynamic_storage.put_value(StorageId::Individuals, "dynamic:key", "dynamic:value");
25
26 if let StorageResult::Ok(value) = dynamic_storage.get_value(StorageId::Individuals, "dynamic:key") {
27 println!(" • Stored and read: {}", value);
28 }
29
30 println!(" • Storage is empty: {}", dynamic_storage.is_empty());
31
32 // === 2. Generic storage (VStorageGeneric) ===
33 println!("\n🔧 2. Generic storage (VStorageGeneric)");
34 println!(" • Compile-time typing");
35 println!(" • No vtable overhead, but less flexible");
36
37 let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
38
39 let _ = generic_storage.put_value(StorageId::Individuals, "generic:key", "generic:value");
40
41 if let StorageResult::Ok(value) = generic_storage.get_value(StorageId::Individuals, "generic:key") {
42 println!(" • Stored and read: {}", value);
43 }
44
45 println!(" • Storage is empty: {}", generic_storage.is_empty());
46
47 // Can extract inner storage
48 if let Some(inner_storage) = generic_storage.storage() {
49 println!(" • Access to inner storage: available");
50 }
51
52 // === 3. Enum storage (VStorageEnum) ===
53 println!("\n⚡ 3. Enum storage (VStorageEnum)");
54 println!(" • Static dispatch through enum");
55 println!(" • Static dispatch");
56
57 let mut enum_storage = VStorageEnum::memory();
58
59 let _ = enum_storage.put_value(StorageId::Individuals, "enum:key", "enum:value");
60
61 if let StorageResult::Ok(value) = enum_storage.get_value(StorageId::Individuals, "enum:key") {
62 println!(" • Stored and read: {}", value);
63 }
64
65 println!(" • Storage is empty: {}", enum_storage.is_empty());
66
67 // === 4. API consistency ===
68 println!("\n🔄 4. API consistency between types");
69 println!(" • All types have the same Storage interface");
70
71 let test_data = vec![
72 ("test1", "value1"),
73 ("test2", "value2"),
74 ("test3", "value3"),
75 ];
76
77 // Store data in all storage types
78 for (key, value) in &test_data {
79 let _ = dynamic_storage.put_value(StorageId::Tickets, key, value);
80 let _ = generic_storage.put_value(StorageId::Tickets, key, value);
81 let _ = enum_storage.put_value(StorageId::Tickets, key, value);
82 }
83
84 // Check that all return the same results
85 println!(" • Consistency check:");
86 for (key, expected_value) in &test_data {
87 let dynamic_result = dynamic_storage.get_value(StorageId::Tickets, key);
88 let generic_result = generic_storage.get_value(StorageId::Tickets, key);
89 let enum_result = enum_storage.get_value(StorageId::Tickets, key);
90
91 match (dynamic_result, generic_result, enum_result) {
92 (StorageResult::Ok(v1), StorageResult::Ok(v2), StorageResult::Ok(v3)) => {
93 let consistent = v1 == *expected_value && v2 == *expected_value && v3 == *expected_value;
94 println!(" {} -> {}", key, if consistent { "✅ consistent" } else { "❌ inconsistent" });
95 }
96 _ => println!(" {} -> ❌ read error", key),
97 }
98 }
99
100 // === 5. Different constructor demonstrations ===
101 println!("\n🏗️ 5. Different ways to create storages");
102
103 // VStorageEnum - direct creation
104 let _enum_direct = VStorageEnum::memory();
105 println!(" • VStorageEnum::memory() - direct creation");
106
107 // VStorageGeneric - through constructor
108 let _generic_direct = VMemoryStorage::new(memory_storage::MemoryStorage::new());
109 println!(" • VMemoryStorage::new() - through constructor");
110
111 // VStorage - through builder
112 let _dynamic_builder = VStorage::builder().memory().build()?;
113 println!(" • VStorage::builder() - through builder pattern");
114
115 // === 6. Features of each type ===
116 println!("\n📋 6. Usage characteristics");
117
118 println!(" VStorage (Dynamic):");
119 println!(" ✅ Maximum flexibility");
120 println!(" ✅ Can change storage type at runtime");
121 println!(" ❌ Vtable lookup overhead");
122 println!(" ❌ No access to inner type");
123
124 println!(" VStorageGeneric<T> (Generic):");
125 println!(" ✅ Compile-time optimization");
126 println!(" ✅ Access to inner storage");
127 println!(" ✅ Type safety");
128 println!(" ❌ Less flexible at runtime");
129
130 println!(" VStorageEnum (Enum):");
131 println!(" ✅ Static dispatch");
132 println!(" ✅ No heap allocation for storage");
133 println!(" ❌ Fixed set of types");
134
135 // === 7. Usage recommendations ===
136 println!("\n💡 7. Storage type selection recommendations");
137
138 println!(" Use VStorage when:");
139 println!(" • Maximum flexibility is needed");
140 println!(" • Storage type is determined at runtime");
141 println!(" • Flexibility is more important than dispatch overhead");
142
143 println!(" Use VStorageGeneric when:");
144 println!(" • Access to inner storage is needed");
145 println!(" • Type safety is important");
146 println!(" • Storage type is known at compile time");
147
148 println!(" Use VStorageEnum when:");
149 println!(" • Static dispatch is preferred");
150 println!(" • Doing many operations (batch processing)");
151 println!(" • Fixed set of types is suitable");
152
153 println!("\n✨ Demonstration completed!");
154 Ok(())
155}examples/individual_operations.rs (line 20)
16fn main() {
17 println!("=== Демонстрация работы с Individual в v-storage ===\n");
18
19 // Создаем хранилище в памяти
20 let mut storage = VStorage::new(Box::new(MemoryStorage::new()));
21
22 // Создаем Individual
23 let mut individual = Individual::default();
24
25 println!("1. Загрузка несуществующего Individual:");
26 match storage.get_individual("test:nonexistent", &mut individual) {
27 StorageResult::Ok(_) => {
28 println!(" ✓ Individual найден!");
29 println!(" • ID: {}", individual.get_id());
30 },
31 StorageResult::UnprocessableEntity => {
32 println!(" ✗ Individual найден, но не может быть обработан");
33 println!(" • Возможно, данные повреждены или имеют неверный формат");
34 },
35 StorageResult::NotFound => {
36 println!(" ✗ Individual не найден");
37 println!(" • Ключ 'test:nonexistent' не существует в хранилище");
38 },
39 StorageResult::NotReady => {
40 println!(" ✗ Хранилище не готово");
41 },
42 StorageResult::Error(msg) => {
43 println!(" ✗ Ошибка: {}", msg);
44 }
45 }
46
47 println!("\n2. Сохранение Individual данных:");
48
49 // Сохраняем корректные данные Individual
50 let individual_data = r#"{"@":"individual","@id":"test:person","rdfs:label":[{"data":"Тестовый пользователь","lang":"ru","type":"_string"}]}"#;
51
52 match storage.put_value(StorageId::Individuals, "test:person", individual_data) {
53 StorageResult::Ok(_) => {
54 println!(" ✓ Individual успешно сохранен");
55 },
56 StorageResult::Error(msg) => {
57 println!(" ✗ Ошибка при сохранении: {}", msg);
58 },
59 _ => {
60 println!(" ✗ Неожиданная ошибка при сохранении");
61 }
62 }
63
64 println!("\n3. Загрузка существующего Individual:");
65 match storage.get_individual("test:person", &mut individual) {
66 StorageResult::Ok(_) => {
67 println!(" ✓ Individual успешно загружен!");
68 println!(" • ID: {}", individual.get_id());
69 println!(" • Сырые данные: {} байт", individual.get_raw_len());
70 },
71 StorageResult::UnprocessableEntity => {
72 println!(" ✗ Individual найден, но не может быть обработан");
73 println!(" • Проверьте формат данных");
74 },
75 StorageResult::NotFound => {
76 println!(" ✗ Individual не найден");
77 },
78 StorageResult::NotReady => {
79 println!(" ✗ Хранилище не готово");
80 },
81 StorageResult::Error(msg) => {
82 println!(" ✗ Ошибка: {}", msg);
83 }
84 }
85
86 println!("\n4. Тестирование с невалидными данными:");
87
88 // Сохраняем невалидные данные
89 let invalid_data = "это не JSON и не Individual";
90 match storage.put_value(StorageId::Individuals, "test:invalid", invalid_data) {
91 StorageResult::Ok(_) => {
92 println!(" ✓ Невалидные данные сохранены (для тестирования)");
93 },
94 StorageResult::Error(msg) => {
95 println!(" ✗ Ошибка при сохранении: {}", msg);
96 },
97 _ => {
98 println!(" ✗ Неожиданная ошибка при сохранении");
99 }
100 }
101
102 // Пытаемся загрузить невалидные данные
103 match storage.get_individual("test:invalid", &mut individual) {
104 StorageResult::Ok(_) => {
105 println!(" ✓ Данные загружены (неожиданно)");
106 },
107 StorageResult::UnprocessableEntity => {
108 println!(" ✓ Корректно обработаны невалидные данные");
109 println!(" • Система правильно определила, что данные не являются Individual");
110 },
111 StorageResult::NotFound => {
112 println!(" ✗ Данные не найдены (неожиданно)");
113 },
114 StorageResult::NotReady => {
115 println!(" ✗ Хранилище не готово");
116 },
117 StorageResult::Error(msg) => {
118 println!(" ✗ Ошибка: {}", msg);
119 }
120 }
121
122 println!("\n5. Работа с различными типами хранилищ:");
123
124 // Демонстрация работы с разными типами хранилищ
125 let mut memory_storage = VStorageEnum::memory();
126
127 println!(" • Память: сохранение данных...");
128 match memory_storage.put_value(StorageId::Individuals, "test:memory", individual_data) {
129 StorageResult::Ok(_) => {
130 println!(" ✓ Данные сохранены в памяти");
131
132 // Проверяем загрузку
133 match memory_storage.get_individual(StorageId::Individuals, "test:memory", &mut individual) {
134 StorageResult::Ok(_) => {
135 println!(" ✓ Данные успешно загружены из памяти");
136 println!(" • ID: {}", individual.get_id());
137 },
138 result => {
139 println!(" ✗ Не удалось загрузить данные: {:?}", result);
140 }
141 }
142 },
143 StorageResult::Error(msg) => {
144 println!(" ✗ Ошибка при сохранении: {}", msg);
145 },
146 _ => {
147 println!(" ✗ Неожиданная ошибка при сохранении");
148 }
149 }
150
151 println!("\n6. Подсчет количества Individual:");
152 match storage.count(StorageId::Individuals) {
153 StorageResult::Ok(count) => {
154 println!(" ✓ В хранилище {} Individual(s)", count);
155 },
156 StorageResult::Error(msg) => {
157 println!(" ✗ Ошибка при подсчете: {}", msg);
158 },
159 _ => {
160 println!(" ✗ Подсчет недоступен");
161 }
162 }
163
164 println!("\n7. Лучшие практики:");
165 println!(" • Всегда проверяйте StorageResult при загрузке Individual");
166 println!(" • StorageResult::UnprocessableEntity означает, что данные есть, но не валидны");
167 println!(" • StorageResult::NotFound означает, что данных нет");
168 println!(" • StorageResult::NotReady означает, что хранилище не готово к работе");
169 println!(" • Используйте соответствующие методы для разных типов данных");
170
171 println!("\n=== Демонстрация завершена ===");
172}Sourcepub fn builder() -> StorageBuilder
pub fn builder() -> StorageBuilder
Получает ссылку на Builder для создания хранилищ
Examples found in repository?
examples/basic_usage.rs (line 16)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}More examples
examples/storage_types.rs (line 20)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Storage Types Comparison ===\n");
14
15 // === 1. Dynamic storage (VStorage) ===
16 println!("🎭 1. Dynamic storage (VStorage)");
17 println!(" • Uses trait objects (Box<dyn Storage>)");
18 println!(" • Runtime flexibility, but has vtable lookup overhead");
19
20 let storage_box = VStorage::builder().memory().build()?;
21 let mut dynamic_storage = VStorage::new(storage_box);
22
23 // Demonstrate operations
24 let _ = dynamic_storage.put_value(StorageId::Individuals, "dynamic:key", "dynamic:value");
25
26 if let StorageResult::Ok(value) = dynamic_storage.get_value(StorageId::Individuals, "dynamic:key") {
27 println!(" • Stored and read: {}", value);
28 }
29
30 println!(" • Storage is empty: {}", dynamic_storage.is_empty());
31
32 // === 2. Generic storage (VStorageGeneric) ===
33 println!("\n🔧 2. Generic storage (VStorageGeneric)");
34 println!(" • Compile-time typing");
35 println!(" • No vtable overhead, but less flexible");
36
37 let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
38
39 let _ = generic_storage.put_value(StorageId::Individuals, "generic:key", "generic:value");
40
41 if let StorageResult::Ok(value) = generic_storage.get_value(StorageId::Individuals, "generic:key") {
42 println!(" • Stored and read: {}", value);
43 }
44
45 println!(" • Storage is empty: {}", generic_storage.is_empty());
46
47 // Can extract inner storage
48 if let Some(inner_storage) = generic_storage.storage() {
49 println!(" • Access to inner storage: available");
50 }
51
52 // === 3. Enum storage (VStorageEnum) ===
53 println!("\n⚡ 3. Enum storage (VStorageEnum)");
54 println!(" • Static dispatch through enum");
55 println!(" • Static dispatch");
56
57 let mut enum_storage = VStorageEnum::memory();
58
59 let _ = enum_storage.put_value(StorageId::Individuals, "enum:key", "enum:value");
60
61 if let StorageResult::Ok(value) = enum_storage.get_value(StorageId::Individuals, "enum:key") {
62 println!(" • Stored and read: {}", value);
63 }
64
65 println!(" • Storage is empty: {}", enum_storage.is_empty());
66
67 // === 4. API consistency ===
68 println!("\n🔄 4. API consistency between types");
69 println!(" • All types have the same Storage interface");
70
71 let test_data = vec![
72 ("test1", "value1"),
73 ("test2", "value2"),
74 ("test3", "value3"),
75 ];
76
77 // Store data in all storage types
78 for (key, value) in &test_data {
79 let _ = dynamic_storage.put_value(StorageId::Tickets, key, value);
80 let _ = generic_storage.put_value(StorageId::Tickets, key, value);
81 let _ = enum_storage.put_value(StorageId::Tickets, key, value);
82 }
83
84 // Check that all return the same results
85 println!(" • Consistency check:");
86 for (key, expected_value) in &test_data {
87 let dynamic_result = dynamic_storage.get_value(StorageId::Tickets, key);
88 let generic_result = generic_storage.get_value(StorageId::Tickets, key);
89 let enum_result = enum_storage.get_value(StorageId::Tickets, key);
90
91 match (dynamic_result, generic_result, enum_result) {
92 (StorageResult::Ok(v1), StorageResult::Ok(v2), StorageResult::Ok(v3)) => {
93 let consistent = v1 == *expected_value && v2 == *expected_value && v3 == *expected_value;
94 println!(" {} -> {}", key, if consistent { "✅ consistent" } else { "❌ inconsistent" });
95 }
96 _ => println!(" {} -> ❌ read error", key),
97 }
98 }
99
100 // === 5. Different constructor demonstrations ===
101 println!("\n🏗️ 5. Different ways to create storages");
102
103 // VStorageEnum - direct creation
104 let _enum_direct = VStorageEnum::memory();
105 println!(" • VStorageEnum::memory() - direct creation");
106
107 // VStorageGeneric - through constructor
108 let _generic_direct = VMemoryStorage::new(memory_storage::MemoryStorage::new());
109 println!(" • VMemoryStorage::new() - through constructor");
110
111 // VStorage - through builder
112 let _dynamic_builder = VStorage::builder().memory().build()?;
113 println!(" • VStorage::builder() - through builder pattern");
114
115 // === 6. Features of each type ===
116 println!("\n📋 6. Usage characteristics");
117
118 println!(" VStorage (Dynamic):");
119 println!(" ✅ Maximum flexibility");
120 println!(" ✅ Can change storage type at runtime");
121 println!(" ❌ Vtable lookup overhead");
122 println!(" ❌ No access to inner type");
123
124 println!(" VStorageGeneric<T> (Generic):");
125 println!(" ✅ Compile-time optimization");
126 println!(" ✅ Access to inner storage");
127 println!(" ✅ Type safety");
128 println!(" ❌ Less flexible at runtime");
129
130 println!(" VStorageEnum (Enum):");
131 println!(" ✅ Static dispatch");
132 println!(" ✅ No heap allocation for storage");
133 println!(" ❌ Fixed set of types");
134
135 // === 7. Usage recommendations ===
136 println!("\n💡 7. Storage type selection recommendations");
137
138 println!(" Use VStorage when:");
139 println!(" • Maximum flexibility is needed");
140 println!(" • Storage type is determined at runtime");
141 println!(" • Flexibility is more important than dispatch overhead");
142
143 println!(" Use VStorageGeneric when:");
144 println!(" • Access to inner storage is needed");
145 println!(" • Type safety is important");
146 println!(" • Storage type is known at compile time");
147
148 println!(" Use VStorageEnum when:");
149 println!(" • Static dispatch is preferred");
150 println!(" • Doing many operations (batch processing)");
151 println!(" • Fixed set of types is suitable");
152
153 println!("\n✨ Demonstration completed!");
154 Ok(())
155}Sourcepub fn from_config(config: StorageConfig) -> Result<VStorage, StorageError>
pub fn from_config(config: StorageConfig) -> Result<VStorage, StorageError>
Создание через конфигурацию
Examples found in repository?
examples/factory_patterns.rs (line 96)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Factory Patterns Demonstration ===\n");
14
15 // === 1. Builder Pattern ===
16 println!("🏗️ 1. Builder Pattern - step-by-step creation");
17 println!(" • Flexible and readable way to configure storage");
18
19 // Create memory storage through builder
20 let memory_storage = StorageBuilder::new()
21 .memory()
22 .build()?;
23 println!(" • Created memory storage through builder");
24
25 // Create LMDB storage through builder
26 let lmdb_storage = StorageBuilder::new()
27 .lmdb("/tmp/example_lmdb", StorageMode::ReadWrite, Some(1000))
28 .build();
29
30 match lmdb_storage {
31 Ok(_) => println!(" • Created LMDB storage through builder"),
32 Err(e) => println!(" • LMDB unavailable: {}", e),
33 }
34
35 // Create remote storage through builder
36 let remote_storage = StorageBuilder::new()
37 .remote("127.0.0.1:8080")
38 .build();
39
40 match remote_storage {
41 Ok(_) => println!(" • Created remote storage through builder"),
42 Err(e) => println!(" • Remote unavailable: {}", e),
43 }
44
45 // === 2. Provider Pattern ===
46 println!("\n🏭 2. Provider Pattern - ready factory methods");
47 println!(" • Quick creation of standard configurations");
48
49 // Direct creation of storages through Provider
50 let _provider_memory = StorageProvider::memory();
51 println!(" • StorageProvider::memory() - created");
52
53 let _provider_lmdb = StorageProvider::lmdb("/tmp/provider_lmdb", StorageMode::ReadOnly, None);
54 println!(" • StorageProvider::lmdb() - created");
55
56 let _provider_remote = StorageProvider::remote("127.0.0.1:8080");
57 println!(" • StorageProvider::remote() - created");
58
59 // Create VStorage through Provider
60 let mut vstorage_memory = StorageProvider::vstorage_memory();
61 println!(" • StorageProvider::vstorage_memory() - created VStorage");
62
63 // Demonstrate functionality with semantic Individual
64 let provider_individual = r#"{
65 "@": "provider:test",
66 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
67 "rdfs:label": [{"type": "String", "data": "Provider Test User"}],
68 "foaf:name": [{"type": "String", "data": "Test"}],
69 "veda:createdBy": [{"type": "Uri", "data": "provider:factory"}],
70 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T17:00:00Z"}]
71 }"#;
72
73 let _ = vstorage_memory.put_value(StorageId::Individuals, "provider:test", provider_individual);
74 if let StorageResult::Ok(value) = vstorage_memory.get_value(StorageId::Individuals, "provider:test") {
75 println!(" Test: stored Individual ({} bytes) through Provider", value.len());
76 }
77
78 // === 3. Config Pattern ===
79 println!("\n⚙️ 3. Config Pattern - creation from configuration");
80 println!(" • Creating storages from configuration structures");
81
82 // Create from different configurations
83 let configs = vec![
84 ("Memory", StorageConfig::Memory),
85 ("LMDB", StorageConfig::Lmdb {
86 path: "/tmp/config_lmdb".to_string(),
87 mode: StorageMode::ReadWrite,
88 max_read_counter_reopen: Some(500)
89 }),
90 ("Remote", StorageConfig::Remote {
91 address: "127.0.0.1:8080".to_string()
92 }),
93 ];
94
95 for (name, config) in configs {
96 match VStorage::from_config(config) {
97 Ok(mut storage) => {
98 println!(" • {} configuration: created successfully", name);
99
100 // Test the created storage with semantic Individual
101 let test_key = format!("config:{}:key", name.to_lowercase());
102 let test_value = format!(r#"{{
103 "@": "{}",
104 "rdf:type": [{{"type": "Uri", "data": "veda:ConfigTest"}}],
105 "rdfs:label": [{{"type": "String", "data": "Config Test for {}"}}],
106 "veda:configType": [{{"type": "String", "data": "{}"}}],
107 "dcterms:created": [{{"type": "Datetime", "data": "2024-01-15T17:30:00Z"}}]
108 }}"#, test_key, name, name);
109
110 let _ = storage.put_value(StorageId::Individuals, &test_key, &test_value);
111 if let StorageResult::Ok(retrieved) = storage.get_value(StorageId::Individuals, &test_key) {
112 println!(" Test: {} Individual ({} bytes)", name, retrieved.len());
113 }
114 },
115 Err(e) => println!(" • {} configuration: error - {}", name, e),
116 }
117 }
118
119 // === 4. Generic Builders ===
120 println!("\n🔧 4. Generic Builders - compile-time optimization");
121 println!(" • Typed builders without runtime overhead");
122
123 // Generic memory builder
124 let generic_memory = StorageBuilder::new()
125 .memory()
126 .build_memory_generic()?;
127 println!(" • build_memory_generic() - created VMemoryStorage");
128
129 // Generic LMDB builder
130 let generic_lmdb = StorageBuilder::new()
131 .lmdb("/tmp/generic_lmdb", StorageMode::ReadWrite, None)
132 .build_lmdb_generic();
133
134 match generic_lmdb {
135 Ok(_storage) => println!(" • build_lmdb_generic() - created VLMDBStorage"),
136 Err(e) => println!(" • build_lmdb_generic() - error: {}", e),
137 }
138
139 // Generic remote builder
140 let generic_remote = StorageBuilder::new()
141 .remote("127.0.0.1:8080")
142 .build_remote_generic();
143
144 match generic_remote {
145 Ok(_storage) => println!(" • build_remote_generic() - created VRemoteStorage"),
146 Err(e) => println!(" • build_remote_generic() - error: {}", e),
147 }
148
149 // === 5. Provider Generic Methods ===
150 println!("\n🎯 5. Provider Generic Methods - static types");
151 println!(" • Direct creation of typed storages");
152
153 let mut provider_generic_memory = StorageProvider::memory_generic();
154 println!(" • StorageProvider::memory_generic() - VMemoryStorage");
155
156 let provider_generic_lmdb = StorageProvider::lmdb_generic("/tmp/generic_provider", StorageMode::ReadOnly, None);
157 println!(" • StorageProvider::lmdb_generic() - VLMDBStorage");
158
159 let provider_generic_remote = StorageProvider::remote_generic("127.0.0.1:8080");
160 println!(" • StorageProvider::remote_generic() - VRemoteStorage");
161
162 // Demonstrate work with typed storage using semantic Individual
163 let generic_individual = r#"{
164 "@": "generic:test",
165 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
166 "rdfs:label": [{"type": "String", "data": "Generic Test User"}],
167 "foaf:name": [{"type": "String", "data": "Generic"}],
168 "veda:storageType": [{"type": "String", "data": "memory_generic"}],
169 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T18:00:00Z"}]
170 }"#;
171
172 let _ = provider_generic_memory.put_value(StorageId::Individuals, "generic:test", generic_individual);
173 if let StorageResult::Ok(value) = provider_generic_memory.get_value(StorageId::Individuals, "generic:test") {
174 println!(" Generic test: Individual ({} bytes)", value.len());
175 }
176
177 // === 6. Approach comparison ===
178 println!("\n📊 6. Storage creation approach comparison");
179
180 println!(" Builder Pattern:");
181 println!(" ✅ Readable and flexible API");
182 println!(" ✅ Validation at build() stage");
183 println!(" ✅ Can create both dynamic and generic types");
184 println!(" ❌ More code for simple cases");
185
186 println!(" Provider Pattern:");
187 println!(" ✅ Concise code for standard cases");
188 println!(" ✅ Ready optimal configurations");
189 println!(" ❌ Less flexible for customization");
190
191 println!(" Config Pattern:");
192 println!(" ✅ Excellent for loading from files/ENV");
193 println!(" ✅ Unified interface for all types");
194 println!(" ❌ Only dynamic dispatch");
195
196 println!(" Generic Methods:");
197 println!(" ✅ Static dispatch");
198 println!(" ✅ Compile-time typing");
199 println!(" ❌ Less flexible at runtime");
200
201 // === 7. Usage recommendations ===
202 println!("\n💡 7. Pattern selection recommendations");
203
204 println!(" Use Builder when:");
205 println!(" • Parameter customization is needed");
206 println!(" • Complex creation logic");
207 println!(" • Code readability is needed");
208
209 println!(" Use Provider when:");
210 println!(" • Need to quickly create standard storage");
211 println!(" • Default parameters are suitable");
212 println!(" • Minimal boilerplate code");
213
214 println!(" Use Config when:");
215 println!(" • Configuration is loaded from external sources");
216 println!(" • Storage type is determined at runtime");
217 println!(" • Uniform handling of different types is needed");
218
219 println!(" Use Generic methods when:");
220 println!(" • Static dispatch is preferred");
221 println!(" • Storage type is known at compile time");
222 println!(" • Access to type-specific methods is needed");
223
224 println!("\n✨ Factory patterns demonstration completed!");
225 Ok(())
226}Sourcepub fn get_individual(
&mut self,
id: &str,
iraw: &mut Individual,
) -> StorageResult<()>
pub fn get_individual( &mut self, id: &str, iraw: &mut Individual, ) -> StorageResult<()>
Examples found in repository?
examples/individual_operations.rs (line 26)
16fn main() {
17 println!("=== Демонстрация работы с Individual в v-storage ===\n");
18
19 // Создаем хранилище в памяти
20 let mut storage = VStorage::new(Box::new(MemoryStorage::new()));
21
22 // Создаем Individual
23 let mut individual = Individual::default();
24
25 println!("1. Загрузка несуществующего Individual:");
26 match storage.get_individual("test:nonexistent", &mut individual) {
27 StorageResult::Ok(_) => {
28 println!(" ✓ Individual найден!");
29 println!(" • ID: {}", individual.get_id());
30 },
31 StorageResult::UnprocessableEntity => {
32 println!(" ✗ Individual найден, но не может быть обработан");
33 println!(" • Возможно, данные повреждены или имеют неверный формат");
34 },
35 StorageResult::NotFound => {
36 println!(" ✗ Individual не найден");
37 println!(" • Ключ 'test:nonexistent' не существует в хранилище");
38 },
39 StorageResult::NotReady => {
40 println!(" ✗ Хранилище не готово");
41 },
42 StorageResult::Error(msg) => {
43 println!(" ✗ Ошибка: {}", msg);
44 }
45 }
46
47 println!("\n2. Сохранение Individual данных:");
48
49 // Сохраняем корректные данные Individual
50 let individual_data = r#"{"@":"individual","@id":"test:person","rdfs:label":[{"data":"Тестовый пользователь","lang":"ru","type":"_string"}]}"#;
51
52 match storage.put_value(StorageId::Individuals, "test:person", individual_data) {
53 StorageResult::Ok(_) => {
54 println!(" ✓ Individual успешно сохранен");
55 },
56 StorageResult::Error(msg) => {
57 println!(" ✗ Ошибка при сохранении: {}", msg);
58 },
59 _ => {
60 println!(" ✗ Неожиданная ошибка при сохранении");
61 }
62 }
63
64 println!("\n3. Загрузка существующего Individual:");
65 match storage.get_individual("test:person", &mut individual) {
66 StorageResult::Ok(_) => {
67 println!(" ✓ Individual успешно загружен!");
68 println!(" • ID: {}", individual.get_id());
69 println!(" • Сырые данные: {} байт", individual.get_raw_len());
70 },
71 StorageResult::UnprocessableEntity => {
72 println!(" ✗ Individual найден, но не может быть обработан");
73 println!(" • Проверьте формат данных");
74 },
75 StorageResult::NotFound => {
76 println!(" ✗ Individual не найден");
77 },
78 StorageResult::NotReady => {
79 println!(" ✗ Хранилище не готово");
80 },
81 StorageResult::Error(msg) => {
82 println!(" ✗ Ошибка: {}", msg);
83 }
84 }
85
86 println!("\n4. Тестирование с невалидными данными:");
87
88 // Сохраняем невалидные данные
89 let invalid_data = "это не JSON и не Individual";
90 match storage.put_value(StorageId::Individuals, "test:invalid", invalid_data) {
91 StorageResult::Ok(_) => {
92 println!(" ✓ Невалидные данные сохранены (для тестирования)");
93 },
94 StorageResult::Error(msg) => {
95 println!(" ✗ Ошибка при сохранении: {}", msg);
96 },
97 _ => {
98 println!(" ✗ Неожиданная ошибка при сохранении");
99 }
100 }
101
102 // Пытаемся загрузить невалидные данные
103 match storage.get_individual("test:invalid", &mut individual) {
104 StorageResult::Ok(_) => {
105 println!(" ✓ Данные загружены (неожиданно)");
106 },
107 StorageResult::UnprocessableEntity => {
108 println!(" ✓ Корректно обработаны невалидные данные");
109 println!(" • Система правильно определила, что данные не являются Individual");
110 },
111 StorageResult::NotFound => {
112 println!(" ✗ Данные не найдены (неожиданно)");
113 },
114 StorageResult::NotReady => {
115 println!(" ✗ Хранилище не готово");
116 },
117 StorageResult::Error(msg) => {
118 println!(" ✗ Ошибка: {}", msg);
119 }
120 }
121
122 println!("\n5. Работа с различными типами хранилищ:");
123
124 // Демонстрация работы с разными типами хранилищ
125 let mut memory_storage = VStorageEnum::memory();
126
127 println!(" • Память: сохранение данных...");
128 match memory_storage.put_value(StorageId::Individuals, "test:memory", individual_data) {
129 StorageResult::Ok(_) => {
130 println!(" ✓ Данные сохранены в памяти");
131
132 // Проверяем загрузку
133 match memory_storage.get_individual(StorageId::Individuals, "test:memory", &mut individual) {
134 StorageResult::Ok(_) => {
135 println!(" ✓ Данные успешно загружены из памяти");
136 println!(" • ID: {}", individual.get_id());
137 },
138 result => {
139 println!(" ✗ Не удалось загрузить данные: {:?}", result);
140 }
141 }
142 },
143 StorageResult::Error(msg) => {
144 println!(" ✗ Ошибка при сохранении: {}", msg);
145 },
146 _ => {
147 println!(" ✗ Неожиданная ошибка при сохранении");
148 }
149 }
150
151 println!("\n6. Подсчет количества Individual:");
152 match storage.count(StorageId::Individuals) {
153 StorageResult::Ok(count) => {
154 println!(" ✓ В хранилище {} Individual(s)", count);
155 },
156 StorageResult::Error(msg) => {
157 println!(" ✗ Ошибка при подсчете: {}", msg);
158 },
159 _ => {
160 println!(" ✗ Подсчет недоступен");
161 }
162 }
163
164 println!("\n7. Лучшие практики:");
165 println!(" • Всегда проверяйте StorageResult при загрузке Individual");
166 println!(" • StorageResult::UnprocessableEntity означает, что данные есть, но не валидны");
167 println!(" • StorageResult::NotFound означает, что данных нет");
168 println!(" • StorageResult::NotReady означает, что хранилище не готово к работе");
169 println!(" • Используйте соответствующие методы для разных типов данных");
170
171 println!("\n=== Демонстрация завершена ===");
172}pub fn get_individual_from_storage( &mut self, storage: StorageId, id: &str, iraw: &mut Individual, ) -> StorageResult<()>
Sourcepub fn get_value(
&mut self,
storage: StorageId,
id: &str,
) -> StorageResult<String>
pub fn get_value( &mut self, storage: StorageId, id: &str, ) -> StorageResult<String>
Examples found in repository?
examples/basic_usage.rs (line 64)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}More examples
examples/storage_types.rs (line 26)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Storage Types Comparison ===\n");
14
15 // === 1. Dynamic storage (VStorage) ===
16 println!("🎭 1. Dynamic storage (VStorage)");
17 println!(" • Uses trait objects (Box<dyn Storage>)");
18 println!(" • Runtime flexibility, but has vtable lookup overhead");
19
20 let storage_box = VStorage::builder().memory().build()?;
21 let mut dynamic_storage = VStorage::new(storage_box);
22
23 // Demonstrate operations
24 let _ = dynamic_storage.put_value(StorageId::Individuals, "dynamic:key", "dynamic:value");
25
26 if let StorageResult::Ok(value) = dynamic_storage.get_value(StorageId::Individuals, "dynamic:key") {
27 println!(" • Stored and read: {}", value);
28 }
29
30 println!(" • Storage is empty: {}", dynamic_storage.is_empty());
31
32 // === 2. Generic storage (VStorageGeneric) ===
33 println!("\n🔧 2. Generic storage (VStorageGeneric)");
34 println!(" • Compile-time typing");
35 println!(" • No vtable overhead, but less flexible");
36
37 let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
38
39 let _ = generic_storage.put_value(StorageId::Individuals, "generic:key", "generic:value");
40
41 if let StorageResult::Ok(value) = generic_storage.get_value(StorageId::Individuals, "generic:key") {
42 println!(" • Stored and read: {}", value);
43 }
44
45 println!(" • Storage is empty: {}", generic_storage.is_empty());
46
47 // Can extract inner storage
48 if let Some(inner_storage) = generic_storage.storage() {
49 println!(" • Access to inner storage: available");
50 }
51
52 // === 3. Enum storage (VStorageEnum) ===
53 println!("\n⚡ 3. Enum storage (VStorageEnum)");
54 println!(" • Static dispatch through enum");
55 println!(" • Static dispatch");
56
57 let mut enum_storage = VStorageEnum::memory();
58
59 let _ = enum_storage.put_value(StorageId::Individuals, "enum:key", "enum:value");
60
61 if let StorageResult::Ok(value) = enum_storage.get_value(StorageId::Individuals, "enum:key") {
62 println!(" • Stored and read: {}", value);
63 }
64
65 println!(" • Storage is empty: {}", enum_storage.is_empty());
66
67 // === 4. API consistency ===
68 println!("\n🔄 4. API consistency between types");
69 println!(" • All types have the same Storage interface");
70
71 let test_data = vec![
72 ("test1", "value1"),
73 ("test2", "value2"),
74 ("test3", "value3"),
75 ];
76
77 // Store data in all storage types
78 for (key, value) in &test_data {
79 let _ = dynamic_storage.put_value(StorageId::Tickets, key, value);
80 let _ = generic_storage.put_value(StorageId::Tickets, key, value);
81 let _ = enum_storage.put_value(StorageId::Tickets, key, value);
82 }
83
84 // Check that all return the same results
85 println!(" • Consistency check:");
86 for (key, expected_value) in &test_data {
87 let dynamic_result = dynamic_storage.get_value(StorageId::Tickets, key);
88 let generic_result = generic_storage.get_value(StorageId::Tickets, key);
89 let enum_result = enum_storage.get_value(StorageId::Tickets, key);
90
91 match (dynamic_result, generic_result, enum_result) {
92 (StorageResult::Ok(v1), StorageResult::Ok(v2), StorageResult::Ok(v3)) => {
93 let consistent = v1 == *expected_value && v2 == *expected_value && v3 == *expected_value;
94 println!(" {} -> {}", key, if consistent { "✅ consistent" } else { "❌ inconsistent" });
95 }
96 _ => println!(" {} -> ❌ read error", key),
97 }
98 }
99
100 // === 5. Different constructor demonstrations ===
101 println!("\n🏗️ 5. Different ways to create storages");
102
103 // VStorageEnum - direct creation
104 let _enum_direct = VStorageEnum::memory();
105 println!(" • VStorageEnum::memory() - direct creation");
106
107 // VStorageGeneric - through constructor
108 let _generic_direct = VMemoryStorage::new(memory_storage::MemoryStorage::new());
109 println!(" • VMemoryStorage::new() - through constructor");
110
111 // VStorage - through builder
112 let _dynamic_builder = VStorage::builder().memory().build()?;
113 println!(" • VStorage::builder() - through builder pattern");
114
115 // === 6. Features of each type ===
116 println!("\n📋 6. Usage characteristics");
117
118 println!(" VStorage (Dynamic):");
119 println!(" ✅ Maximum flexibility");
120 println!(" ✅ Can change storage type at runtime");
121 println!(" ❌ Vtable lookup overhead");
122 println!(" ❌ No access to inner type");
123
124 println!(" VStorageGeneric<T> (Generic):");
125 println!(" ✅ Compile-time optimization");
126 println!(" ✅ Access to inner storage");
127 println!(" ✅ Type safety");
128 println!(" ❌ Less flexible at runtime");
129
130 println!(" VStorageEnum (Enum):");
131 println!(" ✅ Static dispatch");
132 println!(" ✅ No heap allocation for storage");
133 println!(" ❌ Fixed set of types");
134
135 // === 7. Usage recommendations ===
136 println!("\n💡 7. Storage type selection recommendations");
137
138 println!(" Use VStorage when:");
139 println!(" • Maximum flexibility is needed");
140 println!(" • Storage type is determined at runtime");
141 println!(" • Flexibility is more important than dispatch overhead");
142
143 println!(" Use VStorageGeneric when:");
144 println!(" • Access to inner storage is needed");
145 println!(" • Type safety is important");
146 println!(" • Storage type is known at compile time");
147
148 println!(" Use VStorageEnum when:");
149 println!(" • Static dispatch is preferred");
150 println!(" • Doing many operations (batch processing)");
151 println!(" • Fixed set of types is suitable");
152
153 println!("\n✨ Demonstration completed!");
154 Ok(())
155}examples/factory_patterns.rs (line 74)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Factory Patterns Demonstration ===\n");
14
15 // === 1. Builder Pattern ===
16 println!("🏗️ 1. Builder Pattern - step-by-step creation");
17 println!(" • Flexible and readable way to configure storage");
18
19 // Create memory storage through builder
20 let memory_storage = StorageBuilder::new()
21 .memory()
22 .build()?;
23 println!(" • Created memory storage through builder");
24
25 // Create LMDB storage through builder
26 let lmdb_storage = StorageBuilder::new()
27 .lmdb("/tmp/example_lmdb", StorageMode::ReadWrite, Some(1000))
28 .build();
29
30 match lmdb_storage {
31 Ok(_) => println!(" • Created LMDB storage through builder"),
32 Err(e) => println!(" • LMDB unavailable: {}", e),
33 }
34
35 // Create remote storage through builder
36 let remote_storage = StorageBuilder::new()
37 .remote("127.0.0.1:8080")
38 .build();
39
40 match remote_storage {
41 Ok(_) => println!(" • Created remote storage through builder"),
42 Err(e) => println!(" • Remote unavailable: {}", e),
43 }
44
45 // === 2. Provider Pattern ===
46 println!("\n🏭 2. Provider Pattern - ready factory methods");
47 println!(" • Quick creation of standard configurations");
48
49 // Direct creation of storages through Provider
50 let _provider_memory = StorageProvider::memory();
51 println!(" • StorageProvider::memory() - created");
52
53 let _provider_lmdb = StorageProvider::lmdb("/tmp/provider_lmdb", StorageMode::ReadOnly, None);
54 println!(" • StorageProvider::lmdb() - created");
55
56 let _provider_remote = StorageProvider::remote("127.0.0.1:8080");
57 println!(" • StorageProvider::remote() - created");
58
59 // Create VStorage through Provider
60 let mut vstorage_memory = StorageProvider::vstorage_memory();
61 println!(" • StorageProvider::vstorage_memory() - created VStorage");
62
63 // Demonstrate functionality with semantic Individual
64 let provider_individual = r#"{
65 "@": "provider:test",
66 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
67 "rdfs:label": [{"type": "String", "data": "Provider Test User"}],
68 "foaf:name": [{"type": "String", "data": "Test"}],
69 "veda:createdBy": [{"type": "Uri", "data": "provider:factory"}],
70 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T17:00:00Z"}]
71 }"#;
72
73 let _ = vstorage_memory.put_value(StorageId::Individuals, "provider:test", provider_individual);
74 if let StorageResult::Ok(value) = vstorage_memory.get_value(StorageId::Individuals, "provider:test") {
75 println!(" Test: stored Individual ({} bytes) through Provider", value.len());
76 }
77
78 // === 3. Config Pattern ===
79 println!("\n⚙️ 3. Config Pattern - creation from configuration");
80 println!(" • Creating storages from configuration structures");
81
82 // Create from different configurations
83 let configs = vec![
84 ("Memory", StorageConfig::Memory),
85 ("LMDB", StorageConfig::Lmdb {
86 path: "/tmp/config_lmdb".to_string(),
87 mode: StorageMode::ReadWrite,
88 max_read_counter_reopen: Some(500)
89 }),
90 ("Remote", StorageConfig::Remote {
91 address: "127.0.0.1:8080".to_string()
92 }),
93 ];
94
95 for (name, config) in configs {
96 match VStorage::from_config(config) {
97 Ok(mut storage) => {
98 println!(" • {} configuration: created successfully", name);
99
100 // Test the created storage with semantic Individual
101 let test_key = format!("config:{}:key", name.to_lowercase());
102 let test_value = format!(r#"{{
103 "@": "{}",
104 "rdf:type": [{{"type": "Uri", "data": "veda:ConfigTest"}}],
105 "rdfs:label": [{{"type": "String", "data": "Config Test for {}"}}],
106 "veda:configType": [{{"type": "String", "data": "{}"}}],
107 "dcterms:created": [{{"type": "Datetime", "data": "2024-01-15T17:30:00Z"}}]
108 }}"#, test_key, name, name);
109
110 let _ = storage.put_value(StorageId::Individuals, &test_key, &test_value);
111 if let StorageResult::Ok(retrieved) = storage.get_value(StorageId::Individuals, &test_key) {
112 println!(" Test: {} Individual ({} bytes)", name, retrieved.len());
113 }
114 },
115 Err(e) => println!(" • {} configuration: error - {}", name, e),
116 }
117 }
118
119 // === 4. Generic Builders ===
120 println!("\n🔧 4. Generic Builders - compile-time optimization");
121 println!(" • Typed builders without runtime overhead");
122
123 // Generic memory builder
124 let generic_memory = StorageBuilder::new()
125 .memory()
126 .build_memory_generic()?;
127 println!(" • build_memory_generic() - created VMemoryStorage");
128
129 // Generic LMDB builder
130 let generic_lmdb = StorageBuilder::new()
131 .lmdb("/tmp/generic_lmdb", StorageMode::ReadWrite, None)
132 .build_lmdb_generic();
133
134 match generic_lmdb {
135 Ok(_storage) => println!(" • build_lmdb_generic() - created VLMDBStorage"),
136 Err(e) => println!(" • build_lmdb_generic() - error: {}", e),
137 }
138
139 // Generic remote builder
140 let generic_remote = StorageBuilder::new()
141 .remote("127.0.0.1:8080")
142 .build_remote_generic();
143
144 match generic_remote {
145 Ok(_storage) => println!(" • build_remote_generic() - created VRemoteStorage"),
146 Err(e) => println!(" • build_remote_generic() - error: {}", e),
147 }
148
149 // === 5. Provider Generic Methods ===
150 println!("\n🎯 5. Provider Generic Methods - static types");
151 println!(" • Direct creation of typed storages");
152
153 let mut provider_generic_memory = StorageProvider::memory_generic();
154 println!(" • StorageProvider::memory_generic() - VMemoryStorage");
155
156 let provider_generic_lmdb = StorageProvider::lmdb_generic("/tmp/generic_provider", StorageMode::ReadOnly, None);
157 println!(" • StorageProvider::lmdb_generic() - VLMDBStorage");
158
159 let provider_generic_remote = StorageProvider::remote_generic("127.0.0.1:8080");
160 println!(" • StorageProvider::remote_generic() - VRemoteStorage");
161
162 // Demonstrate work with typed storage using semantic Individual
163 let generic_individual = r#"{
164 "@": "generic:test",
165 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
166 "rdfs:label": [{"type": "String", "data": "Generic Test User"}],
167 "foaf:name": [{"type": "String", "data": "Generic"}],
168 "veda:storageType": [{"type": "String", "data": "memory_generic"}],
169 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T18:00:00Z"}]
170 }"#;
171
172 let _ = provider_generic_memory.put_value(StorageId::Individuals, "generic:test", generic_individual);
173 if let StorageResult::Ok(value) = provider_generic_memory.get_value(StorageId::Individuals, "generic:test") {
174 println!(" Generic test: Individual ({} bytes)", value.len());
175 }
176
177 // === 6. Approach comparison ===
178 println!("\n📊 6. Storage creation approach comparison");
179
180 println!(" Builder Pattern:");
181 println!(" ✅ Readable and flexible API");
182 println!(" ✅ Validation at build() stage");
183 println!(" ✅ Can create both dynamic and generic types");
184 println!(" ❌ More code for simple cases");
185
186 println!(" Provider Pattern:");
187 println!(" ✅ Concise code for standard cases");
188 println!(" ✅ Ready optimal configurations");
189 println!(" ❌ Less flexible for customization");
190
191 println!(" Config Pattern:");
192 println!(" ✅ Excellent for loading from files/ENV");
193 println!(" ✅ Unified interface for all types");
194 println!(" ❌ Only dynamic dispatch");
195
196 println!(" Generic Methods:");
197 println!(" ✅ Static dispatch");
198 println!(" ✅ Compile-time typing");
199 println!(" ❌ Less flexible at runtime");
200
201 // === 7. Usage recommendations ===
202 println!("\n💡 7. Pattern selection recommendations");
203
204 println!(" Use Builder when:");
205 println!(" • Parameter customization is needed");
206 println!(" • Complex creation logic");
207 println!(" • Code readability is needed");
208
209 println!(" Use Provider when:");
210 println!(" • Need to quickly create standard storage");
211 println!(" • Default parameters are suitable");
212 println!(" • Minimal boilerplate code");
213
214 println!(" Use Config when:");
215 println!(" • Configuration is loaded from external sources");
216 println!(" • Storage type is determined at runtime");
217 println!(" • Uniform handling of different types is needed");
218
219 println!(" Use Generic methods when:");
220 println!(" • Static dispatch is preferred");
221 println!(" • Storage type is known at compile time");
222 println!(" • Access to type-specific methods is needed");
223
224 println!("\n✨ Factory patterns demonstration completed!");
225 Ok(())
226}Sourcepub fn get_raw_value(
&mut self,
storage: StorageId,
id: &str,
) -> StorageResult<Vec<u8>>
pub fn get_raw_value( &mut self, storage: StorageId, id: &str, ) -> StorageResult<Vec<u8>>
Examples found in repository?
examples/basic_usage.rs (line 82)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}Sourcepub fn put_value(
&mut self,
storage: StorageId,
key: &str,
val: &str,
) -> StorageResult<()>
pub fn put_value( &mut self, storage: StorageId, key: &str, val: &str, ) -> StorageResult<()>
Examples found in repository?
examples/basic_usage.rs (lines 28-37)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}More examples
examples/storage_types.rs (line 24)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Storage Types Comparison ===\n");
14
15 // === 1. Dynamic storage (VStorage) ===
16 println!("🎭 1. Dynamic storage (VStorage)");
17 println!(" • Uses trait objects (Box<dyn Storage>)");
18 println!(" • Runtime flexibility, but has vtable lookup overhead");
19
20 let storage_box = VStorage::builder().memory().build()?;
21 let mut dynamic_storage = VStorage::new(storage_box);
22
23 // Demonstrate operations
24 let _ = dynamic_storage.put_value(StorageId::Individuals, "dynamic:key", "dynamic:value");
25
26 if let StorageResult::Ok(value) = dynamic_storage.get_value(StorageId::Individuals, "dynamic:key") {
27 println!(" • Stored and read: {}", value);
28 }
29
30 println!(" • Storage is empty: {}", dynamic_storage.is_empty());
31
32 // === 2. Generic storage (VStorageGeneric) ===
33 println!("\n🔧 2. Generic storage (VStorageGeneric)");
34 println!(" • Compile-time typing");
35 println!(" • No vtable overhead, but less flexible");
36
37 let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
38
39 let _ = generic_storage.put_value(StorageId::Individuals, "generic:key", "generic:value");
40
41 if let StorageResult::Ok(value) = generic_storage.get_value(StorageId::Individuals, "generic:key") {
42 println!(" • Stored and read: {}", value);
43 }
44
45 println!(" • Storage is empty: {}", generic_storage.is_empty());
46
47 // Can extract inner storage
48 if let Some(inner_storage) = generic_storage.storage() {
49 println!(" • Access to inner storage: available");
50 }
51
52 // === 3. Enum storage (VStorageEnum) ===
53 println!("\n⚡ 3. Enum storage (VStorageEnum)");
54 println!(" • Static dispatch through enum");
55 println!(" • Static dispatch");
56
57 let mut enum_storage = VStorageEnum::memory();
58
59 let _ = enum_storage.put_value(StorageId::Individuals, "enum:key", "enum:value");
60
61 if let StorageResult::Ok(value) = enum_storage.get_value(StorageId::Individuals, "enum:key") {
62 println!(" • Stored and read: {}", value);
63 }
64
65 println!(" • Storage is empty: {}", enum_storage.is_empty());
66
67 // === 4. API consistency ===
68 println!("\n🔄 4. API consistency between types");
69 println!(" • All types have the same Storage interface");
70
71 let test_data = vec![
72 ("test1", "value1"),
73 ("test2", "value2"),
74 ("test3", "value3"),
75 ];
76
77 // Store data in all storage types
78 for (key, value) in &test_data {
79 let _ = dynamic_storage.put_value(StorageId::Tickets, key, value);
80 let _ = generic_storage.put_value(StorageId::Tickets, key, value);
81 let _ = enum_storage.put_value(StorageId::Tickets, key, value);
82 }
83
84 // Check that all return the same results
85 println!(" • Consistency check:");
86 for (key, expected_value) in &test_data {
87 let dynamic_result = dynamic_storage.get_value(StorageId::Tickets, key);
88 let generic_result = generic_storage.get_value(StorageId::Tickets, key);
89 let enum_result = enum_storage.get_value(StorageId::Tickets, key);
90
91 match (dynamic_result, generic_result, enum_result) {
92 (StorageResult::Ok(v1), StorageResult::Ok(v2), StorageResult::Ok(v3)) => {
93 let consistent = v1 == *expected_value && v2 == *expected_value && v3 == *expected_value;
94 println!(" {} -> {}", key, if consistent { "✅ consistent" } else { "❌ inconsistent" });
95 }
96 _ => println!(" {} -> ❌ read error", key),
97 }
98 }
99
100 // === 5. Different constructor demonstrations ===
101 println!("\n🏗️ 5. Different ways to create storages");
102
103 // VStorageEnum - direct creation
104 let _enum_direct = VStorageEnum::memory();
105 println!(" • VStorageEnum::memory() - direct creation");
106
107 // VStorageGeneric - through constructor
108 let _generic_direct = VMemoryStorage::new(memory_storage::MemoryStorage::new());
109 println!(" • VMemoryStorage::new() - through constructor");
110
111 // VStorage - through builder
112 let _dynamic_builder = VStorage::builder().memory().build()?;
113 println!(" • VStorage::builder() - through builder pattern");
114
115 // === 6. Features of each type ===
116 println!("\n📋 6. Usage characteristics");
117
118 println!(" VStorage (Dynamic):");
119 println!(" ✅ Maximum flexibility");
120 println!(" ✅ Can change storage type at runtime");
121 println!(" ❌ Vtable lookup overhead");
122 println!(" ❌ No access to inner type");
123
124 println!(" VStorageGeneric<T> (Generic):");
125 println!(" ✅ Compile-time optimization");
126 println!(" ✅ Access to inner storage");
127 println!(" ✅ Type safety");
128 println!(" ❌ Less flexible at runtime");
129
130 println!(" VStorageEnum (Enum):");
131 println!(" ✅ Static dispatch");
132 println!(" ✅ No heap allocation for storage");
133 println!(" ❌ Fixed set of types");
134
135 // === 7. Usage recommendations ===
136 println!("\n💡 7. Storage type selection recommendations");
137
138 println!(" Use VStorage when:");
139 println!(" • Maximum flexibility is needed");
140 println!(" • Storage type is determined at runtime");
141 println!(" • Flexibility is more important than dispatch overhead");
142
143 println!(" Use VStorageGeneric when:");
144 println!(" • Access to inner storage is needed");
145 println!(" • Type safety is important");
146 println!(" • Storage type is known at compile time");
147
148 println!(" Use VStorageEnum when:");
149 println!(" • Static dispatch is preferred");
150 println!(" • Doing many operations (batch processing)");
151 println!(" • Fixed set of types is suitable");
152
153 println!("\n✨ Demonstration completed!");
154 Ok(())
155}examples/individual_operations.rs (line 52)
16fn main() {
17 println!("=== Демонстрация работы с Individual в v-storage ===\n");
18
19 // Создаем хранилище в памяти
20 let mut storage = VStorage::new(Box::new(MemoryStorage::new()));
21
22 // Создаем Individual
23 let mut individual = Individual::default();
24
25 println!("1. Загрузка несуществующего Individual:");
26 match storage.get_individual("test:nonexistent", &mut individual) {
27 StorageResult::Ok(_) => {
28 println!(" ✓ Individual найден!");
29 println!(" • ID: {}", individual.get_id());
30 },
31 StorageResult::UnprocessableEntity => {
32 println!(" ✗ Individual найден, но не может быть обработан");
33 println!(" • Возможно, данные повреждены или имеют неверный формат");
34 },
35 StorageResult::NotFound => {
36 println!(" ✗ Individual не найден");
37 println!(" • Ключ 'test:nonexistent' не существует в хранилище");
38 },
39 StorageResult::NotReady => {
40 println!(" ✗ Хранилище не готово");
41 },
42 StorageResult::Error(msg) => {
43 println!(" ✗ Ошибка: {}", msg);
44 }
45 }
46
47 println!("\n2. Сохранение Individual данных:");
48
49 // Сохраняем корректные данные Individual
50 let individual_data = r#"{"@":"individual","@id":"test:person","rdfs:label":[{"data":"Тестовый пользователь","lang":"ru","type":"_string"}]}"#;
51
52 match storage.put_value(StorageId::Individuals, "test:person", individual_data) {
53 StorageResult::Ok(_) => {
54 println!(" ✓ Individual успешно сохранен");
55 },
56 StorageResult::Error(msg) => {
57 println!(" ✗ Ошибка при сохранении: {}", msg);
58 },
59 _ => {
60 println!(" ✗ Неожиданная ошибка при сохранении");
61 }
62 }
63
64 println!("\n3. Загрузка существующего Individual:");
65 match storage.get_individual("test:person", &mut individual) {
66 StorageResult::Ok(_) => {
67 println!(" ✓ Individual успешно загружен!");
68 println!(" • ID: {}", individual.get_id());
69 println!(" • Сырые данные: {} байт", individual.get_raw_len());
70 },
71 StorageResult::UnprocessableEntity => {
72 println!(" ✗ Individual найден, но не может быть обработан");
73 println!(" • Проверьте формат данных");
74 },
75 StorageResult::NotFound => {
76 println!(" ✗ Individual не найден");
77 },
78 StorageResult::NotReady => {
79 println!(" ✗ Хранилище не готово");
80 },
81 StorageResult::Error(msg) => {
82 println!(" ✗ Ошибка: {}", msg);
83 }
84 }
85
86 println!("\n4. Тестирование с невалидными данными:");
87
88 // Сохраняем невалидные данные
89 let invalid_data = "это не JSON и не Individual";
90 match storage.put_value(StorageId::Individuals, "test:invalid", invalid_data) {
91 StorageResult::Ok(_) => {
92 println!(" ✓ Невалидные данные сохранены (для тестирования)");
93 },
94 StorageResult::Error(msg) => {
95 println!(" ✗ Ошибка при сохранении: {}", msg);
96 },
97 _ => {
98 println!(" ✗ Неожиданная ошибка при сохранении");
99 }
100 }
101
102 // Пытаемся загрузить невалидные данные
103 match storage.get_individual("test:invalid", &mut individual) {
104 StorageResult::Ok(_) => {
105 println!(" ✓ Данные загружены (неожиданно)");
106 },
107 StorageResult::UnprocessableEntity => {
108 println!(" ✓ Корректно обработаны невалидные данные");
109 println!(" • Система правильно определила, что данные не являются Individual");
110 },
111 StorageResult::NotFound => {
112 println!(" ✗ Данные не найдены (неожиданно)");
113 },
114 StorageResult::NotReady => {
115 println!(" ✗ Хранилище не готово");
116 },
117 StorageResult::Error(msg) => {
118 println!(" ✗ Ошибка: {}", msg);
119 }
120 }
121
122 println!("\n5. Работа с различными типами хранилищ:");
123
124 // Демонстрация работы с разными типами хранилищ
125 let mut memory_storage = VStorageEnum::memory();
126
127 println!(" • Память: сохранение данных...");
128 match memory_storage.put_value(StorageId::Individuals, "test:memory", individual_data) {
129 StorageResult::Ok(_) => {
130 println!(" ✓ Данные сохранены в памяти");
131
132 // Проверяем загрузку
133 match memory_storage.get_individual(StorageId::Individuals, "test:memory", &mut individual) {
134 StorageResult::Ok(_) => {
135 println!(" ✓ Данные успешно загружены из памяти");
136 println!(" • ID: {}", individual.get_id());
137 },
138 result => {
139 println!(" ✗ Не удалось загрузить данные: {:?}", result);
140 }
141 }
142 },
143 StorageResult::Error(msg) => {
144 println!(" ✗ Ошибка при сохранении: {}", msg);
145 },
146 _ => {
147 println!(" ✗ Неожиданная ошибка при сохранении");
148 }
149 }
150
151 println!("\n6. Подсчет количества Individual:");
152 match storage.count(StorageId::Individuals) {
153 StorageResult::Ok(count) => {
154 println!(" ✓ В хранилище {} Individual(s)", count);
155 },
156 StorageResult::Error(msg) => {
157 println!(" ✗ Ошибка при подсчете: {}", msg);
158 },
159 _ => {
160 println!(" ✗ Подсчет недоступен");
161 }
162 }
163
164 println!("\n7. Лучшие практики:");
165 println!(" • Всегда проверяйте StorageResult при загрузке Individual");
166 println!(" • StorageResult::UnprocessableEntity означает, что данные есть, но не валидны");
167 println!(" • StorageResult::NotFound означает, что данных нет");
168 println!(" • StorageResult::NotReady означает, что хранилище не готово к работе");
169 println!(" • Используйте соответствующие методы для разных типов данных");
170
171 println!("\n=== Демонстрация завершена ===");
172}examples/factory_patterns.rs (line 73)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== v-storage Factory Patterns Demonstration ===\n");
14
15 // === 1. Builder Pattern ===
16 println!("🏗️ 1. Builder Pattern - step-by-step creation");
17 println!(" • Flexible and readable way to configure storage");
18
19 // Create memory storage through builder
20 let memory_storage = StorageBuilder::new()
21 .memory()
22 .build()?;
23 println!(" • Created memory storage through builder");
24
25 // Create LMDB storage through builder
26 let lmdb_storage = StorageBuilder::new()
27 .lmdb("/tmp/example_lmdb", StorageMode::ReadWrite, Some(1000))
28 .build();
29
30 match lmdb_storage {
31 Ok(_) => println!(" • Created LMDB storage through builder"),
32 Err(e) => println!(" • LMDB unavailable: {}", e),
33 }
34
35 // Create remote storage through builder
36 let remote_storage = StorageBuilder::new()
37 .remote("127.0.0.1:8080")
38 .build();
39
40 match remote_storage {
41 Ok(_) => println!(" • Created remote storage through builder"),
42 Err(e) => println!(" • Remote unavailable: {}", e),
43 }
44
45 // === 2. Provider Pattern ===
46 println!("\n🏭 2. Provider Pattern - ready factory methods");
47 println!(" • Quick creation of standard configurations");
48
49 // Direct creation of storages through Provider
50 let _provider_memory = StorageProvider::memory();
51 println!(" • StorageProvider::memory() - created");
52
53 let _provider_lmdb = StorageProvider::lmdb("/tmp/provider_lmdb", StorageMode::ReadOnly, None);
54 println!(" • StorageProvider::lmdb() - created");
55
56 let _provider_remote = StorageProvider::remote("127.0.0.1:8080");
57 println!(" • StorageProvider::remote() - created");
58
59 // Create VStorage through Provider
60 let mut vstorage_memory = StorageProvider::vstorage_memory();
61 println!(" • StorageProvider::vstorage_memory() - created VStorage");
62
63 // Demonstrate functionality with semantic Individual
64 let provider_individual = r#"{
65 "@": "provider:test",
66 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
67 "rdfs:label": [{"type": "String", "data": "Provider Test User"}],
68 "foaf:name": [{"type": "String", "data": "Test"}],
69 "veda:createdBy": [{"type": "Uri", "data": "provider:factory"}],
70 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T17:00:00Z"}]
71 }"#;
72
73 let _ = vstorage_memory.put_value(StorageId::Individuals, "provider:test", provider_individual);
74 if let StorageResult::Ok(value) = vstorage_memory.get_value(StorageId::Individuals, "provider:test") {
75 println!(" Test: stored Individual ({} bytes) through Provider", value.len());
76 }
77
78 // === 3. Config Pattern ===
79 println!("\n⚙️ 3. Config Pattern - creation from configuration");
80 println!(" • Creating storages from configuration structures");
81
82 // Create from different configurations
83 let configs = vec![
84 ("Memory", StorageConfig::Memory),
85 ("LMDB", StorageConfig::Lmdb {
86 path: "/tmp/config_lmdb".to_string(),
87 mode: StorageMode::ReadWrite,
88 max_read_counter_reopen: Some(500)
89 }),
90 ("Remote", StorageConfig::Remote {
91 address: "127.0.0.1:8080".to_string()
92 }),
93 ];
94
95 for (name, config) in configs {
96 match VStorage::from_config(config) {
97 Ok(mut storage) => {
98 println!(" • {} configuration: created successfully", name);
99
100 // Test the created storage with semantic Individual
101 let test_key = format!("config:{}:key", name.to_lowercase());
102 let test_value = format!(r#"{{
103 "@": "{}",
104 "rdf:type": [{{"type": "Uri", "data": "veda:ConfigTest"}}],
105 "rdfs:label": [{{"type": "String", "data": "Config Test for {}"}}],
106 "veda:configType": [{{"type": "String", "data": "{}"}}],
107 "dcterms:created": [{{"type": "Datetime", "data": "2024-01-15T17:30:00Z"}}]
108 }}"#, test_key, name, name);
109
110 let _ = storage.put_value(StorageId::Individuals, &test_key, &test_value);
111 if let StorageResult::Ok(retrieved) = storage.get_value(StorageId::Individuals, &test_key) {
112 println!(" Test: {} Individual ({} bytes)", name, retrieved.len());
113 }
114 },
115 Err(e) => println!(" • {} configuration: error - {}", name, e),
116 }
117 }
118
119 // === 4. Generic Builders ===
120 println!("\n🔧 4. Generic Builders - compile-time optimization");
121 println!(" • Typed builders without runtime overhead");
122
123 // Generic memory builder
124 let generic_memory = StorageBuilder::new()
125 .memory()
126 .build_memory_generic()?;
127 println!(" • build_memory_generic() - created VMemoryStorage");
128
129 // Generic LMDB builder
130 let generic_lmdb = StorageBuilder::new()
131 .lmdb("/tmp/generic_lmdb", StorageMode::ReadWrite, None)
132 .build_lmdb_generic();
133
134 match generic_lmdb {
135 Ok(_storage) => println!(" • build_lmdb_generic() - created VLMDBStorage"),
136 Err(e) => println!(" • build_lmdb_generic() - error: {}", e),
137 }
138
139 // Generic remote builder
140 let generic_remote = StorageBuilder::new()
141 .remote("127.0.0.1:8080")
142 .build_remote_generic();
143
144 match generic_remote {
145 Ok(_storage) => println!(" • build_remote_generic() - created VRemoteStorage"),
146 Err(e) => println!(" • build_remote_generic() - error: {}", e),
147 }
148
149 // === 5. Provider Generic Methods ===
150 println!("\n🎯 5. Provider Generic Methods - static types");
151 println!(" • Direct creation of typed storages");
152
153 let mut provider_generic_memory = StorageProvider::memory_generic();
154 println!(" • StorageProvider::memory_generic() - VMemoryStorage");
155
156 let provider_generic_lmdb = StorageProvider::lmdb_generic("/tmp/generic_provider", StorageMode::ReadOnly, None);
157 println!(" • StorageProvider::lmdb_generic() - VLMDBStorage");
158
159 let provider_generic_remote = StorageProvider::remote_generic("127.0.0.1:8080");
160 println!(" • StorageProvider::remote_generic() - VRemoteStorage");
161
162 // Demonstrate work with typed storage using semantic Individual
163 let generic_individual = r#"{
164 "@": "generic:test",
165 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
166 "rdfs:label": [{"type": "String", "data": "Generic Test User"}],
167 "foaf:name": [{"type": "String", "data": "Generic"}],
168 "veda:storageType": [{"type": "String", "data": "memory_generic"}],
169 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T18:00:00Z"}]
170 }"#;
171
172 let _ = provider_generic_memory.put_value(StorageId::Individuals, "generic:test", generic_individual);
173 if let StorageResult::Ok(value) = provider_generic_memory.get_value(StorageId::Individuals, "generic:test") {
174 println!(" Generic test: Individual ({} bytes)", value.len());
175 }
176
177 // === 6. Approach comparison ===
178 println!("\n📊 6. Storage creation approach comparison");
179
180 println!(" Builder Pattern:");
181 println!(" ✅ Readable and flexible API");
182 println!(" ✅ Validation at build() stage");
183 println!(" ✅ Can create both dynamic and generic types");
184 println!(" ❌ More code for simple cases");
185
186 println!(" Provider Pattern:");
187 println!(" ✅ Concise code for standard cases");
188 println!(" ✅ Ready optimal configurations");
189 println!(" ❌ Less flexible for customization");
190
191 println!(" Config Pattern:");
192 println!(" ✅ Excellent for loading from files/ENV");
193 println!(" ✅ Unified interface for all types");
194 println!(" ❌ Only dynamic dispatch");
195
196 println!(" Generic Methods:");
197 println!(" ✅ Static dispatch");
198 println!(" ✅ Compile-time typing");
199 println!(" ❌ Less flexible at runtime");
200
201 // === 7. Usage recommendations ===
202 println!("\n💡 7. Pattern selection recommendations");
203
204 println!(" Use Builder when:");
205 println!(" • Parameter customization is needed");
206 println!(" • Complex creation logic");
207 println!(" • Code readability is needed");
208
209 println!(" Use Provider when:");
210 println!(" • Need to quickly create standard storage");
211 println!(" • Default parameters are suitable");
212 println!(" • Minimal boilerplate code");
213
214 println!(" Use Config when:");
215 println!(" • Configuration is loaded from external sources");
216 println!(" • Storage type is determined at runtime");
217 println!(" • Uniform handling of different types is needed");
218
219 println!(" Use Generic methods when:");
220 println!(" • Static dispatch is preferred");
221 println!(" • Storage type is known at compile time");
222 println!(" • Access to type-specific methods is needed");
223
224 println!("\n✨ Factory patterns demonstration completed!");
225 Ok(())
226}Sourcepub fn put_raw_value(
&mut self,
storage: StorageId,
key: &str,
val: Vec<u8>,
) -> StorageResult<()>
pub fn put_raw_value( &mut self, storage: StorageId, key: &str, val: Vec<u8>, ) -> StorageResult<()>
Examples found in repository?
examples/basic_usage.rs (line 80)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}Sourcepub fn remove_value(
&mut self,
storage: StorageId,
key: &str,
) -> StorageResult<()>
pub fn remove_value( &mut self, storage: StorageId, key: &str, ) -> StorageResult<()>
Examples found in repository?
examples/basic_usage.rs (line 105)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}Sourcepub fn count(&mut self, storage: StorageId) -> StorageResult<usize>
pub fn count(&mut self, storage: StorageId) -> StorageResult<usize>
Examples found in repository?
examples/basic_usage.rs (line 90)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}More examples
examples/individual_operations.rs (line 152)
16fn main() {
17 println!("=== Демонстрация работы с Individual в v-storage ===\n");
18
19 // Создаем хранилище в памяти
20 let mut storage = VStorage::new(Box::new(MemoryStorage::new()));
21
22 // Создаем Individual
23 let mut individual = Individual::default();
24
25 println!("1. Загрузка несуществующего Individual:");
26 match storage.get_individual("test:nonexistent", &mut individual) {
27 StorageResult::Ok(_) => {
28 println!(" ✓ Individual найден!");
29 println!(" • ID: {}", individual.get_id());
30 },
31 StorageResult::UnprocessableEntity => {
32 println!(" ✗ Individual найден, но не может быть обработан");
33 println!(" • Возможно, данные повреждены или имеют неверный формат");
34 },
35 StorageResult::NotFound => {
36 println!(" ✗ Individual не найден");
37 println!(" • Ключ 'test:nonexistent' не существует в хранилище");
38 },
39 StorageResult::NotReady => {
40 println!(" ✗ Хранилище не готово");
41 },
42 StorageResult::Error(msg) => {
43 println!(" ✗ Ошибка: {}", msg);
44 }
45 }
46
47 println!("\n2. Сохранение Individual данных:");
48
49 // Сохраняем корректные данные Individual
50 let individual_data = r#"{"@":"individual","@id":"test:person","rdfs:label":[{"data":"Тестовый пользователь","lang":"ru","type":"_string"}]}"#;
51
52 match storage.put_value(StorageId::Individuals, "test:person", individual_data) {
53 StorageResult::Ok(_) => {
54 println!(" ✓ Individual успешно сохранен");
55 },
56 StorageResult::Error(msg) => {
57 println!(" ✗ Ошибка при сохранении: {}", msg);
58 },
59 _ => {
60 println!(" ✗ Неожиданная ошибка при сохранении");
61 }
62 }
63
64 println!("\n3. Загрузка существующего Individual:");
65 match storage.get_individual("test:person", &mut individual) {
66 StorageResult::Ok(_) => {
67 println!(" ✓ Individual успешно загружен!");
68 println!(" • ID: {}", individual.get_id());
69 println!(" • Сырые данные: {} байт", individual.get_raw_len());
70 },
71 StorageResult::UnprocessableEntity => {
72 println!(" ✗ Individual найден, но не может быть обработан");
73 println!(" • Проверьте формат данных");
74 },
75 StorageResult::NotFound => {
76 println!(" ✗ Individual не найден");
77 },
78 StorageResult::NotReady => {
79 println!(" ✗ Хранилище не готово");
80 },
81 StorageResult::Error(msg) => {
82 println!(" ✗ Ошибка: {}", msg);
83 }
84 }
85
86 println!("\n4. Тестирование с невалидными данными:");
87
88 // Сохраняем невалидные данные
89 let invalid_data = "это не JSON и не Individual";
90 match storage.put_value(StorageId::Individuals, "test:invalid", invalid_data) {
91 StorageResult::Ok(_) => {
92 println!(" ✓ Невалидные данные сохранены (для тестирования)");
93 },
94 StorageResult::Error(msg) => {
95 println!(" ✗ Ошибка при сохранении: {}", msg);
96 },
97 _ => {
98 println!(" ✗ Неожиданная ошибка при сохранении");
99 }
100 }
101
102 // Пытаемся загрузить невалидные данные
103 match storage.get_individual("test:invalid", &mut individual) {
104 StorageResult::Ok(_) => {
105 println!(" ✓ Данные загружены (неожиданно)");
106 },
107 StorageResult::UnprocessableEntity => {
108 println!(" ✓ Корректно обработаны невалидные данные");
109 println!(" • Система правильно определила, что данные не являются Individual");
110 },
111 StorageResult::NotFound => {
112 println!(" ✗ Данные не найдены (неожиданно)");
113 },
114 StorageResult::NotReady => {
115 println!(" ✗ Хранилище не готово");
116 },
117 StorageResult::Error(msg) => {
118 println!(" ✗ Ошибка: {}", msg);
119 }
120 }
121
122 println!("\n5. Работа с различными типами хранилищ:");
123
124 // Демонстрация работы с разными типами хранилищ
125 let mut memory_storage = VStorageEnum::memory();
126
127 println!(" • Память: сохранение данных...");
128 match memory_storage.put_value(StorageId::Individuals, "test:memory", individual_data) {
129 StorageResult::Ok(_) => {
130 println!(" ✓ Данные сохранены в памяти");
131
132 // Проверяем загрузку
133 match memory_storage.get_individual(StorageId::Individuals, "test:memory", &mut individual) {
134 StorageResult::Ok(_) => {
135 println!(" ✓ Данные успешно загружены из памяти");
136 println!(" • ID: {}", individual.get_id());
137 },
138 result => {
139 println!(" ✗ Не удалось загрузить данные: {:?}", result);
140 }
141 }
142 },
143 StorageResult::Error(msg) => {
144 println!(" ✗ Ошибка при сохранении: {}", msg);
145 },
146 _ => {
147 println!(" ✗ Неожиданная ошибка при сохранении");
148 }
149 }
150
151 println!("\n6. Подсчет количества Individual:");
152 match storage.count(StorageId::Individuals) {
153 StorageResult::Ok(count) => {
154 println!(" ✓ В хранилище {} Individual(s)", count);
155 },
156 StorageResult::Error(msg) => {
157 println!(" ✗ Ошибка при подсчете: {}", msg);
158 },
159 _ => {
160 println!(" ✗ Подсчет недоступен");
161 }
162 }
163
164 println!("\n7. Лучшие практики:");
165 println!(" • Всегда проверяйте StorageResult при загрузке Individual");
166 println!(" • StorageResult::UnprocessableEntity означает, что данные есть, но не валидны");
167 println!(" • StorageResult::NotFound означает, что данных нет");
168 println!(" • StorageResult::NotReady означает, что хранилище не готово к работе");
169 println!(" • Используйте соответствующие методы для разных типов данных");
170
171 println!("\n=== Демонстрация завершена ===");
172}pub fn get_individual_from_db( &mut self, storage: StorageId, id: &str, iraw: &mut Individual, ) -> StorageResult<()>
👎Deprecated since 0.1.0:
Use get_individual_from_storage instead
Sourcepub fn get_v(&mut self, storage: StorageId, id: &str) -> Option<String>
👎Deprecated since 0.1.0: Use get_value instead
pub fn get_v(&mut self, storage: StorageId, id: &str) -> Option<String>
Use get_value instead
Examples found in repository?
examples/basic_usage.rs (line 133)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}pub fn get_raw(&mut self, storage: StorageId, id: &str) -> Vec<u8> ⓘ
👎Deprecated since 0.1.0:
Use get_raw_value instead
Sourcepub fn put_kv(&mut self, storage: StorageId, key: &str, val: &str) -> bool
👎Deprecated since 0.1.0: Use put_value instead
pub fn put_kv(&mut self, storage: StorageId, key: &str, val: &str) -> bool
Use put_value instead
Examples found in repository?
examples/basic_usage.rs (line 130)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("=== Basic v-storage Usage Example ===\n");
14
15 // Create memory storage using Builder pattern
16 let storage = VStorage::builder()
17 .memory()
18 .build()?;
19 let mut storage = VStorage::new(storage);
20
21 println!("✅ Storage created successfully");
22
23 // === Basic data operations ===
24
25 // 1. Storing data
26 println!("\n📝 Storing data:");
27
28 let _ = storage.put_value(StorageId::Individuals, "user:1", r#"{
29 "@": "user:1",
30 "rdf:type": [{"type": "Uri", "data": "foaf:Person"}],
31 "rdfs:label": [{"type": "String", "data": "Ivan Petrov"}],
32 "foaf:name": [{"type": "String", "data": "Ivan"}],
33 "foaf:familyName": [{"type": "String", "data": "Petrov"}],
34 "foaf:age": [{"type": "Integer", "data": 30}],
35 "foaf:mbox": [{"type": "String", "data": "ivan.petrov@example.com"}],
36 "veda:created": [{"type": "Datetime", "data": "2024-01-15T10:30:00Z"}]
37 }"#);
38 let _ = storage.put_value(StorageId::Tickets, "ticket:123", r#"{
39 "@": "ticket:123",
40 "rdf:type": [{"type": "Uri", "data": "veda:Ticket"}],
41 "rdfs:label": [{"type": "String", "data": "Support Request"}],
42 "dcterms:title": [{"type": "String", "data": "Email server issue"}],
43 "veda:status": [{"type": "String", "data": "pending"}],
44 "veda:priority": [{"type": "String", "data": "medium"}],
45 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T09:15:00Z"}]
46 }"#);
47 let _ = storage.put_value(StorageId::Az, "permission:read", r#"{
48 "@": "permission:read",
49 "rdf:type": [{"type": "Uri", "data": "veda:Permission"}],
50 "rdfs:label": [{"type": "String", "data": "Read Access"}],
51 "veda:permissionSubject": [{"type": "Uri", "data": "user:1"}],
52 "veda:permissionObject": [{"type": "Uri", "data": "resource:documents"}],
53 "veda:canRead": [{"type": "Boolean", "data": true}],
54 "dcterms:created": [{"type": "Datetime", "data": "2024-01-15T08:00:00Z"}]
55 }"#);
56
57 println!(" • Stored user: user:1");
58 println!(" • Stored ticket: ticket:123");
59 println!(" • Stored permission: permission:read");
60
61 // 2. Reading data
62 println!("\n📖 Reading data:");
63
64 if let StorageResult::Ok(user_data) = storage.get_value(StorageId::Individuals, "user:1") {
65 println!(" • User Individual ({}): Ivan Petrov", user_data.len());
66 }
67
68 if let StorageResult::Ok(ticket_data) = storage.get_value(StorageId::Tickets, "ticket:123") {
69 println!(" • Ticket Individual ({}): Support Request", ticket_data.len());
70 }
71
72 if let StorageResult::Ok(permission_data) = storage.get_value(StorageId::Az, "permission:read") {
73 println!(" • Permission Individual ({}): Read Access", permission_data.len());
74 }
75
76 // 3. Working with binary data
77 println!("\n🔢 Working with binary data:");
78
79 let binary_data = vec![0xFF, 0xFE, 0xFD, 0x00, 0x01, 0x02];
80 let _ = storage.put_raw_value(StorageId::Individuals, "binary:data", binary_data.clone());
81
82 if let StorageResult::Ok(retrieved_binary) = storage.get_raw_value(StorageId::Individuals, "binary:data") {
83 println!(" • Stored {} bytes of binary data", retrieved_binary.len());
84 println!(" • Data matches: {}", retrieved_binary == binary_data);
85 }
86
87 // 4. Counting records
88 println!("\n📊 Statistics:");
89
90 if let StorageResult::Ok(individuals_count) = storage.count(StorageId::Individuals) {
91 println!(" • Individuals count: {}", individuals_count);
92 }
93
94 if let StorageResult::Ok(tickets_count) = storage.count(StorageId::Tickets) {
95 println!(" • Tickets count: {}", tickets_count);
96 }
97
98 if let StorageResult::Ok(az_count) = storage.count(StorageId::Az) {
99 println!(" • Permissions count: {}", az_count);
100 }
101
102 // 5. Removing data
103 println!("\n🗑️ Removing data:");
104
105 let _ = storage.remove_value(StorageId::Tickets, "ticket:123");
106 println!(" • Ticket ticket:123 removed");
107
108 // Check that data is actually removed
109 match storage.get_value(StorageId::Tickets, "ticket:123") {
110 StorageResult::NotFound => println!(" • Confirmed: ticket not found"),
111 _ => println!(" • Error: ticket still exists"),
112 }
113
114 // 6. Error handling
115 println!("\n⚠️ Error handling:");
116
117 match storage.get_value(StorageId::Individuals, "nonexistent") {
118 StorageResult::NotFound => println!(" • Correctly handled missing key case"),
119 StorageResult::Ok(_) => println!(" • Unexpected: found data"),
120 StorageResult::Error(e) => println!(" • Error: {}", e),
121 _ => println!(" • Other result"),
122 }
123
124 // === Backward compatibility demonstration ===
125 println!("\n🔄 Backward compatibility:");
126
127 #[allow(deprecated)]
128 {
129 // Using old methods
130 let success = storage.put_kv(StorageId::Individuals, "old:key", "old:value");
131 println!(" • Old put_kv: {}", if success { "success" } else { "error" });
132
133 if let Some(value) = storage.get_v(StorageId::Individuals, "old:key") {
134 println!(" • Old get_v: {}", value);
135 }
136 }
137
138 println!("\n✨ Example completed successfully!");
139 Ok(())
140}pub fn put_kv_raw( &mut self, storage: StorageId, key: &str, val: Vec<u8>, ) -> bool
👎Deprecated since 0.1.0:
Use put_raw_value instead
pub fn remove(&mut self, storage: StorageId, key: &str) -> bool
👎Deprecated since 0.1.0:
Use remove_value instead
Trait Implementations§
Source§impl StorageDispatcher for VStorage
impl StorageDispatcher for VStorage
type Storage = Box<dyn Storage>
fn with_storage<T, F>(&mut self, default_value: T, operation: F) -> T
fn with_storage_result<F>(&mut self, operation: F) -> StorageResult<()>
fn with_storage_value<T, F>(&mut self, operation: F) -> StorageResult<T>
Auto Trait Implementations§
impl Freeze for VStorage
impl !RefUnwindSafe for VStorage
impl !Send for VStorage
impl !Sync for VStorage
impl Unpin for VStorage
impl UnsafeUnpin for VStorage
impl !UnwindSafe for VStorage
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more