Dbobject

  !   Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам)

Эти объекты это вариант http://en.wikipedia.org/wiki/Active_record_pattern

Декларация

CDb классы декларируют таблицы (см. там требования к их декларации) и унаследованы от dbobject.

Создание

Экземпляры создаются как обычные ref<CDbXxxx>.

Рабочий экземпляр такого объекта может быть получен либо от итератора запроса к Udb, либо от dbref::QueryRef(), либо инициализирован dblist::AddNewRow().

Обновление

После изменения пропертей сразу же всегда нужно вызвать метод CommitRef() для сохранения изменений в БД.

Глобальная синхронизация

Если в приложении существует несколько rDb ссылок на одну и ту же запись в БД, то при изменении в одной из них остальные могут обновится автоматически. А могут и не обновится.

Такое обновление может произойти в момент присваивания проперти, или при вызове CommitRef() или позже при выполнении других операций в Udb, по Idle или в неопределенный момент в будущем. Или такое обновление может не происходить вообще и каждый экземлпяр хранить свою версию пропертей. Конкретное поведение зависит от драйвера бакенда и версии Udb.

Инкапсуляция

Использование таких объектов должно быть исключительно приватным в пакете, инкапсулирующим реляционное хранилище.

При использовании хранилища извне обычно необходимо декларировать отдельную пару Iface/Impl классов, скрывающих в себе CDb рекорды:

// For the frontend
class CThingIface : public object
{
public:
    // visible to the client
    int x_nProperty_Get()
    void x_nProperty_Set(...)
}
 
// In DB encap package
class CThingImpl : public CThingIface
{
    // db record is hidden from the client
    ref<CDbThing> x_rDbThing
 
    int Onx_nProperty_Get()
    void Onx_nProperty_Set(...)
}
 
int CThingImpl::Onx_nProperty_Get()
{
    return x_rDbThing->x_nThingProperty;
}
 
void CThingImpl::Onx_nProperty_Set(...)
{
    x_rDbThing->x_nThingProperty = ...;
 
    // save to db immediatelly!
    x_rDbThing->Commit();
}

Эта категория в данный момент пуста.