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:

  1. Rename member in class

  2. Rename member in base class

  3. 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:
  1. Rename class

  2. Rename a class that is a member in another class

  3. 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