1:- module(dynvector_persistence,
2 [
3 dynvector_clone/2,
4 dynvector_erase/2,
5 dynvector_persist/2,
6 dynvector_restore/2,
7 dynvector_serialize/2
8 ]).
23
24:- use_module(library(lists),
25 [
26 nth0/3
27 ]). 28
29:- use_module('bdb_wrapper',
30 [
31 bdb_erase/2,
32 bdb_retrieve/3,
33 bdb_store/3
34 ]). 35
36:- use_module('dynvector_core',
37 [
38 dynvector_create/1,
39 dynvector_destroy/1,
40 dynvector_label/3,
41 dynvector_value/3,
42 is_dynvector/1
43 ]). 44
54dynvector_clone(IdSource, IdTarget) :-
55
56 57 is_dynvector(IdSource),
58 \+ is_dynvector(IdTarget),
59
60 61 dynvector_serialize(IdSource, Data),
62
63 64 dynvector_serialize(IdTarget, Data).
65
89dynvector_serialize(Id, Serialized) :-
90
91 92 (var(Serialized) ->
93 is_dynvector(Id),
94 dynvector_to_serialized(Id, Serialized)
95 ;
96 (Serialized = [] ->
97 dynvector_destroy(Id),
98 dynvector_create(Id)
99 ;
100 serialized_to_dynvector(Id, Serialized)
101 )
102 ).
103
113dynvector_to_serialized(Id, Serialized) :-
114
115 116 findall([Label,Value],
117 dynvector_core:dynvect_labels(Id, Label, Value), Labels),
118
119 120 findall([Index,Value],
121 dynvector_core:dynvect_values(Index, Id, Value), Values),
122
123 124 append(Labels, Values, DynData),
125
126 127 length(Labels, NumLabels),
128 append([NumLabels], DynData, Serialized).
129
139serialized_to_dynvector(Id, Serialized) :-
140
141 142 [NumLabels|_] = Serialized,
143 dynvector_destroy(Id), 144 dynvector_create(Id),
145
146 147 LabelsFinal is NumLabels + 2,
148 serialized_to_labels_(Id, Serialized, 2, LabelsFinal),
149
150 151 length(Serialized, ValuesFinal),
152 serialized_to_values_(Id, Serialized, LabelsFinal, ValuesFinal).
162serialized_to_labels_(_Id, _Labels, PosFinal, PosFinal) :- !.
163
165serialized_to_labels_(Id, Labels, PosCurr, PosFinal) :-
166
167 168 nth0(PosCurr, Labels, [Key,Value]),
169 (dynvector_label(Id, Key, Value) ; true),
170 !,
171
172 173 PosNext is PosCurr + 1,
174 serialized_to_labels_(Id, Labels, PosNext, PosFinal).
182serialized_to_values_(_Id, _Values, IndexFinal, IndexFinal) :- !.
183
185serialized_to_values_(Id, Values, IndexCurr, IndexFinal) :-
186
187 188 nth0(IndexCurr, Values, [Index,Value]),
189 dynvector_value(Id, Index, Value),
190
191 192 IndexNext is IndexCurr + 1,
193 serialized_to_values_(Id, Values, IndexNext, IndexFinal).
194
204dynvector_persist(Id, DataSet) :-
205
206 207 is_dynvector(Id),
208
209 210 bdb_erase(Id, DataSet),
211
212 213 dynvector_serialize(Id, Data),
214
215 !,
216 217 bdb_store(Id, DataSet, Data).
218
228dynvector_restore(Id, DataSet) :-
229
230 231 bdb_retrieve(Id, DataSet, Data),
232
233 234 dynvector_serialize(Id, Data).
235
245dynvector_erase(Id, DataSet) :-
246
247 248 bdb_erase(Id, DataSet)
Persistence for dynvector objects, using Berkeley DB
This module provides persistence for dynvector objects, using the Berkeley DB utility package. For details on the SWI-Prolog interface to Berkeley DB, please refer to the documentation for
bdb_rapper.pl
.