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>
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
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 !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