1 #include "unitransactiongen.h"
2 #include "uniconftree.h"
3 #include "unilistiter.h"
58 bool was_null_or_empty;
89 bool next() {
return i.next(); }
108 : root(_root), section(_section), base(_base),
109 doing_i1(
true), i1(*root), i2(base->
iterator(section))
134 if (i1->mode == NEWVALUE ||
135 i1->mode == NEWNODE ||
136 (i1->mode == NEWTREE && i1->newtree))
152 if (!node || node->mode == BLANK)
176 if (i1->mode == NEWVALUE)
178 else if (i1->mode == NEWTREE)
179 return i1->newtree->value();
203 : root(NULL), base(_base)
225 return base->
get(key);
226 else if (node->mode == NEWTREE)
236 return subnode->
value();
238 return WvString::null;
245 if (node->mode == NEWVALUE)
246 return node->newvalue;
248 return (node->mode == NEWNODE && !value) ? WvString::empty : value;
256 root = set_change(root, key, 0, value);
263 UniConfPairList::Iter i(pairs);
264 for (i.rewind(); i.next(); )
265 root = set_change(root, i->
key(), 0, i->value());
320 else if (node->mode == NEWTREE)
356 base->
set(section, newcontents->
value());
374 for (i.rewind(); i.next();)
381 if (node->mode == NEWTREE)
385 if (node->newtree == NULL)
386 base->
set(section, WvString::null);
392 else if (node->mode == NEWVALUE)
395 base->
set(section, node->newvalue);
397 else if (node->mode == NEWNODE)
400 if (!base->
exists(section))
403 base->
set(section, WvString::empty);
411 for (i.rewind(); i.next();)
434 if (!newcontents || newcontents->
value() != value)
435 delta(section, value);
440 for (i.rewind(); i.next();)
443 if (!base->
exists(subkey))
448 (
void*)&data,
false,
true);
469 if (node->mode == NEWTREE)
471 if (!base->
exists(section))
473 if (node->newtree != NULL)
476 node->newtree->
visit(
479 (
void *)&data,
false,
true);
488 if (node->mode != BLANK)
489 value = base->
get(section);
491 if (node->mode == NEWVALUE &&
493 value != node->newvalue)
494 delta(section, value);
497 for (i.rewind(); i.next();)
500 if (node->mode != BLANK && value.
isnull())
501 delta(section, WvString::null);
515 else if (node->mode == NEWTREE)
525 if (node->mode == NEWVALUE)
529 else if (node->mode == NEWNODE)
534 if (node->was_null_or_empty && !value)
536 node->was_null_or_empty = !value;
539 delta(key, WvString::empty);
596 delta(key, WvString::null);
617 parent->mode = BLANK;
621 parent->mode = NEWNODE;
624 parent->was_null_or_empty = !curr;
626 delta(nodekey, WvString::empty);
635 parent->mode = NEWTREE;
638 deletion_simulator(key);
642 parent->mode = NEWVALUE;
644 if (base->
get(key) != value)
675 (
void *)&data,
false,
true);
679 return subnode == node ? NULL : node;
708 if (value != subnode->
value())
726 delta(key, WvString::null);
741 return create_change(NULL, key, seg, value);
742 else if (node->mode == NEWTREE)
744 node->newtree = set_value(node->newtree, key, seg, value);
751 if (subnode->mode == BLANK && !value.
isnull())
755 subnode->mode = NEWNODE;
758 subnode->was_null_or_empty = !curr;
760 delta(nodekey, WvString::empty);
769 create_change(subnode, key, seg, value);
772 else if (next->mode == NEWTREE)
774 next->newtree = set_value(next->newtree,
785 if (subnode->mode != BLANK || base->
exists(key))
788 subnode->mode = NEWTREE;
789 subnode->newtree = 0;
791 else if (subnode->mode == NEWVALUE)
793 if (subnode->newvalue != value)
795 subnode->newvalue = value;
799 else if (subnode->mode == BLANK)
801 if (base->
get(key) != value)
803 subnode->mode = NEWVALUE;
804 subnode->newvalue =
WvString(value);
809 if ((!currval != !value) && (currval != value))
811 subnode->mode = NEWVALUE;
812 subnode->newvalue =
WvString(value);