[odb-users] Polymorphism through shared library

Arnaud Kapp arnaud.kapp at islog.com
Thu Nov 3 12:01:19 EDT 2016


Hello, I have questions about extending ODB models through shared 
library. I'm not sure what I'd like to achieve is possible.

I've read the following thread 
http://odb-users.codesynthesis.narkive.com/OSipU4kJ/odb-persistence-in-a-library

A quick intro: My project is module (as in dynamically loaded shared 
library) oriented. The core binary does a few things, provides some 
facilities, but mostly
it loads modules. Modules provides most of the functionality of the 
software. Third-party user can write modules for their own use.

In the project, we can describes 3 "components" that would need to use 
the database:
     + The core binary
     + The "officially supported by the project" modules
     + Third party modules.

Database versioning must be enabled, otherwise update will too much of a 
pain for everyone.

The "core binary" would have its own schema, and each modules could 
define an additional schema with its own versioning. This would allows
for updating the core and modules separately, ie a module update
could introduces new fields into its schema w/o needing a "core binary" 
DB version bump.

Up until this point I believe everything is possible if done carefully.
However, in addition to all of that, I'd like to be able to extend some 
classes from the "core binary" from modules code. And this is where I 
think I'd be stuck.

Consider this:

The following classes would come from "core binary".

// Keep tracks of what happened in the application.
#pragma db object polymorphic
class AuditEntry
{
#pragma db id
int id_;


// Where User is an other class mapped in the database.
std::shared_ptr<User> author_;
std::string what_happened_;
};

// Also from "core binary"
// Store information about an user-related event.
#pragma db object
class UserAuditEntry : public AuditEntry
{

std::shared_ptr<User> target_;
};

This 2 classes, along with the User class lives in the "core binary" 
schema and have their own model version.


Now from a third party modules.
#pragma db object
class Lama
{
#pragma db id
int id_;

std::string name_;
};

#pragma db object
class LamaAuditEntry : public AuditEntry
{
std::shared_ptr<Lama> target_;
};

Now I have a problem: I am mixing schemas together. The classes that are 
part of "third_party_schema" and "core_binary_schema" are referencing 
each other. I believe I can't have separate version for them now.

Sorry, this mail is getting a bit long, and is kinda messy. "Simply" 
stated: Is there a good way to extends core classes from a shared 
library and have them not share the same version? My guess is no based 
on my understanding of the linked thread. If its not supported / 
supportable, could you recommend an alternative in how to architect this?

-- 
Best regards / Cordialement,

Arnaud KAPP
31, Avenue du Général de Gaulle
67000 Strasbourg
FRANCE
http://www.islog.com



More information about the odb-users mailing list