Version handling
Work in progress
As an application evolves, there will inevitably be changes to it’s data structures. When classes changes they don’t always map trivially to their old versions. Some classes may be completely removed and some may not.
Types of cases to handle:
Rename member in class
Rename class
Remove a member
Add a member
Change the type of a member
Add or remove a base class
Rename member in class
Cases:
Rename member in class
Rename member in base class
Rename member in an embedded class
Rename member in class
- Example
Original version |
New version |
---|---|
class MyClass {
int my_field;
};
|
class MyClass {
int my_renamed_field;
};
|
- Design
Easiest to handle in srl_bin_node::reconnect(). Check if there is a name mapping in version_handler and use the new name to find the field in runtime class. The field name will be simple name: my_field / my_renamed_field.
Rename member in base class
- Example
Original version |
New version |
---|---|
class MyBase {
int my_field;
};
class MyClass
: public MyBase
{
...
};
|
class MyBase {
int my_renamed_field;
};
class MyClass
: public MyBase
{
...
};
|
Rename member in an embedded class
- Example
Original version |
New version |
---|---|
class MyOtherClass {
int my_field;
};
class MyClass
{
MyOtherClass field;
};
|
class MyOtherClass {
int my_renamed_field;
};
class MyClass
{
MyOtherClass field;
};
|
Rename class
- Cases:
Rename class
Rename a class that is a member in another class
Rename a class that is a base of another class
Rename class
- Example
Original version |
New version |
---|---|
class MyClass {
int my_field;
};
|
class MyNewClass {
int my_field;
};
|
Rename a class that is a member in another class
- Example
Original version |
New version |
---|---|
class MyOtherClass {
int my_field;
};
class MyClass
{
MyOtherClass field;
};
|
class MyNewClass {
int my_field;
};
class MyClass
{
MyNewClass field;
};
|
Rename a class that is a base of another class
- Example
Original version |
New version |
---|---|
class MyBase {
int my_field;
};
class MyClass
: public MyBase
{
...
};
|
class MyNewBase {
int my_field;
};
class MyClass
: public MyNewBase
{
...
};
|
Remove a member
Add a member
Change the type of a member
Add or remove a base class
Summary table of version handling cases
Binary serializers:
srl_bin_*
Change type |
Cases |
Implemented in |
Test case |
---|---|---|---|
Rename member in class |
Rename member in class |
srl_bin_node.cpp in reconnect() |
|
Member in base class |
srl_bin_node.cpp in reconnect() |
||
Member in embedded class |
srl_bin_node.cpp in reconnect() |
||
Rename class |
Rename class |
srl_bin_priv.cpp when calling _srl_reg.get_srl() |
|
Member in another class |
srl_bin_node.cpp in reconnect()? |
||
Base of another class |
srl_bin_node.cpp in reconnect() |
||
Remove a member |
Use old value (use converter) |
test_remove_member_converter.cpp |
|
Ignore old value (loose old value) |
srl_bin_node.cpp in reconnect() |
test_remove_member.cpp |
|
Remove a member in embedded class |
Use old value (use converter) |
||
Ignore old value (loose old value) |
|||
Add a member |
Initiation depending on other fields. |
||
Use default values for new field. |
|||
Change the type of a member |
Change type of member primitive to primitive |
auto? |
test_member_primitive_type.cpp test_change_member_type.cpp |
Change type of member class to other |
|||
Change type of member of embedded class |
test_member_class_field.cpp |
||
Raw pointer to unique_ptr |
|||
unique_ptr to raw pointer |
|||
Raw pointer to shared_ptr |
|||
shared_ptr to raw pointer |
|||
Raw pointer to dboo::ref |
|||
dboo::ref to raw pointer |
|||
unique_ptr to dboo::ref |
|||
dboo::ref to unique_ptr |
|||
Add or remove a base class |