00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <cPersistentObject.h>
00031
00032
00033 #include <tProto.h>
00034 #include <cRefBase.h>
00035
00036 PROTOTYPE(PersistentObject);
00037
00038
00040
00041
00042 PersistentObject::PersistentObject()
00043 {
00044 #ifdef C_PERSISTENTOBJECT_TRACE
00045 logmsg("PersistentObject::PersistentObject() invoked");
00046 #endif
00047
00048 _SerialNumber = 0;
00049 _OID = -1;
00050
00051
00052
00053
00054
00055
00056
00057
00058 #ifdef C_PERSISTENTOBJECT_TRACE
00059 logmsg("PersistentObject::PersistentObject() finished");
00060 #endif
00061 }
00062
00064
00065
00066 PersistentObject::~PersistentObject()
00067 {
00068 #ifdef C_PERSISTENTOBJECT_TRACE
00069 logmsg("PersistentObject::~PersistentObject() invoked");
00070 #endif
00071
00072 _Free();
00073
00074 #ifdef C_PERSISTENTOBJECT_TRACE
00075 logmsg("PersistentObject::~PersistentObject() finished");
00076 #endif
00077 }
00078
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 class RefBase PersistentObject::BePersistent(
00090 class Connection *DbCon
00091 )
00092 {
00093 RefBase retval;
00094
00095 #ifdef C_PERSISTENTOBJECT_TRACE
00096 logmsg("int PersistentObject::BePersistent() invoked");
00097 #endif
00098
00099 if (IsPersistent())
00100 retval = Address();
00101 else {
00102 if (DbCon == NULL)
00103 throw ObjLibException_ConnectionError();
00104
00105 DbCon->_NextOID(_OID,_SerialNumber);
00106 retval = DatabaseObject::BePersistent(DbCon);
00107 };
00108
00109 #ifdef C_PERSISTENTOBJECT_TRACE
00110 logmsg("int PersistentObject::BePersistent() finished");
00111 #endif
00112
00113 return retval;
00114 };
00115
00116
00117 bool PersistentObject::Update()
00118 {
00119 bool retval = true;
00120 class Connection *DbCon;
00121
00122 #ifdef C_PERSISTENTOBJECT_TRACE
00123 logmsg("bool PersistentObject::Update() invoked");
00124 #endif
00125
00126 if (IsPersistent() && IsDirty())
00127 {
00128 #ifdef C_PERSISTENTOBJECT_TRACE
00129 logmsg("PersistentObject is dirty");
00130 #endif
00131 if ((DbCon = Connection()) == NULL)
00132 throw ObjLibException_ConnectionError();
00133
00134 DbCon->_NextSN(_OID,_SerialNumber);
00135 retval = DatabaseObject::Update();
00136 };
00137
00138 #ifdef C_PERSISTENTOBJECT_TRACE
00139 logmsg("bool PersistentObject::Update() finished");
00140 #endif
00141
00142 return retval;
00143 };
00144
00146
00147
00148 bool PersistentObject::_VersionsMatch()
00149 {
00150 if (IsTransient())
00151 return true;
00152
00153 long dbVersion;
00154 bool okay;
00155 char *oidStr = LongToStr(_OID);
00156 char *sqlcmd = NULL;
00157 StrCat(sqlcmd,2,"SELECT VERSION FROM " PERSISTENT_OBJECT_TABLE " WHERE OID = ",oidStr);
00158 StrFree(oidStr);
00159 okay = _Connection->_Open()
00160 && _Connection->_Prepare(sqlcmd)
00161 && _Connection->_Execute()
00162 && _Connection->_PreFetchBind(
00163 1,
00164 (void *)&dbVersion,
00165 4,
00166 TYPE_INT
00167 )
00168 && _Connection->_FetchNext()
00169 && _Connection->_Close();
00170 return okay && (dbVersion==_SerialNumber);
00171 };
00172