Exemple #1
0
        internal void EnsureClientTypeVersion()
        {
            if (ClientTypeVersion != 0)
            {
                return;
            }
            EnsureKnownLastPersistedVersion();
            var props  = _clientType.GetProperties();
            var fields = new List <TableFieldInfo>(props.Length);

            foreach (var pi in props)
            {
                fields.Add(TableFieldInfo.Build(Name, pi, _tableInfoResolver.FieldHandlerFactory, ClientType));
            }
            var tvi = new TableVersionInfo(fields.ToArray());

            if (LastPersistedVersion == 0)
            {
                _tableVersions.TryAdd(1, tvi);
                ClientTypeVersion = 1;
            }
            else
            {
                var last = _tableVersions.GetOrAdd(LastPersistedVersion, v => _tableInfoResolver.LoadTableVersionInfo(_id, v, Name));
                if (TableVersionInfo.Equal(last, tvi))
                {
                    ClientTypeVersion = LastPersistedVersion;
                }
                else
                {
                    _tableVersions.TryAdd(LastPersistedVersion + 1, tvi);
                    ClientTypeVersion = LastPersistedVersion + 1;
                }
            }
        }
Exemple #2
0
 internal static bool Equal(TableVersionInfo a, TableVersionInfo b)
 {
     if (a.FieldCount != b.FieldCount) return false;
     for (int i = 0; i < a.FieldCount; i++)
     {
         if (!TableFieldInfo.Equal(a[i], b[i])) return false;
     }
     return true;
 }
Exemple #3
0
 TableVersionInfo ITableInfoResolver.LoadTableVersionInfo(uint id, uint version, string tableName)
 {
     using (var tr = _keyValueDB.StartTransaction())
     {
         tr.SetKeyPrefix(TableVersionsPrefix);
         var key = TableInfo.BuildKeyForTableVersions(id, version);
         if (!tr.FindExactKey(key))
         {
             throw new BTDBException($"Missing TableVersionInfo Id:{id} Version:{version}");
         }
         return(TableVersionInfo.Load(new KeyValueDBValueReader(tr), _objectDB.FieldHandlerFactory, tableName));
     }
 }
Exemple #4
0
 internal static bool Equal(TableVersionInfo a, TableVersionInfo b)
 {
     if (a.FieldCount != b.FieldCount)
     {
         return(false);
     }
     for (int i = 0; i < a.FieldCount; i++)
     {
         if (!TableFieldInfo.Equal(a[i], b[i]))
         {
             return(false);
         }
     }
     return(true);
 }
Exemple #5
0
 TableVersionInfo ITableInfoResolver.LoadTableVersionInfo(uint id, uint version, string tableName)
 {
     using (var tr = _keyValueDB.StartTransaction())
     {
         tr.SetKeyPrefix(TableVersionsPrefix);
         var key = new byte[PackUnpack.LengthVUInt(id) + PackUnpack.LengthVUInt(version)];
         var ofs = 0;
         PackUnpack.PackVUInt(key, ref ofs, id);
         PackUnpack.PackVUInt(key, ref ofs, version);
         if (!tr.FindExactKey(key))
         {
             throw new BTDBException(string.Format("Missing TableVersionInfo Id:{0} Version:{1}", id, version));
         }
         return(TableVersionInfo.Load(new KeyValueDBValueReader(tr), _objectDB.FieldHandlerFactory, tableName));
     }
 }
Exemple #6
0
        internal void EnsureClientTypeVersion()
        {
            if (ClientTypeVersion != 0)
            {
                return;
            }
            EnsureKnownLastPersistedVersion();
            var props  = _clientType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            var fields = new StructList <TableFieldInfo>();

            fields.Reserve((uint)props.Length);
            foreach (var pi in props)
            {
                if (pi.GetCustomAttributes(typeof(NotStoredAttribute), true).Length != 0)
                {
                    continue;
                }
                if (pi.GetIndexParameters().Length != 0)
                {
                    continue;
                }
                fields.Add(TableFieldInfo.Build(Name, pi, _tableInfoResolver.FieldHandlerFactory, FieldHandlerOptions.None));
            }
            var tvi = new TableVersionInfo(fields.ToArray());

            if (LastPersistedVersion == 0)
            {
                _tableVersions.TryAdd(1, tvi);
                ClientTypeVersion = 1;
            }
            else
            {
                var last = _tableVersions.GetOrAdd(LastPersistedVersion, (ver, tableInfo) => tableInfo._tableInfoResolver.LoadTableVersionInfo(tableInfo._id, ver, tableInfo.Name), this);
                if (TableVersionInfo.Equal(last, tvi))
                {
                    _tableVersions[LastPersistedVersion] = tvi; // tvi was build from real types and not loaded so it is more exact
                    ClientTypeVersion = LastPersistedVersion;
                }
                else
                {
                    _tableVersions.TryAdd(LastPersistedVersion + 1, tvi);
                    ClientTypeVersion = LastPersistedVersion + 1;
                }
            }
        }
Exemple #7
0
        TableVersionInfo GetTableVersionInfo(uint tableId, uint version)
        {
            TableVersionInfo res;

            if (_tableVersionInfos.TryGetValue(new TableIdVersion(tableId, version), out res))
            {
                return(res);
            }
            _trkv.SetKeyPrefixUnsafe(ObjectDB.TableVersionsPrefix);
            if (_trkv.Find(TwiceVuint2ByteBuffer(tableId, version)) == FindResult.Exact)
            {
                var reader = new KeyValueDBValueReader(_trkv);
                res = TableVersionInfo.Load(reader, _tr.Owner.FieldHandlerFactory, _tableId2Name[tableId]);
                _tableVersionInfos.Add(new TableIdVersion(tableId, version), res);
                return(res);
            }
            throw new ArgumentException($"TableVersionInfo not found {tableId}-{version}");
        }
Exemple #8
0
 internal void EnsureClientTypeVersion()
 {
     if (ClientTypeVersion != 0) return;
     EnsureKnownLastPersistedVersion();
     var props = _clientType.GetProperties();
     var fields = new List<TableFieldInfo>(props.Length);
     foreach (var pi in props)
     {
         fields.Add(TableFieldInfo.Build(Name, pi, _tableInfoResolver.FieldHandlerFactory, ClientType));
     }
     var tvi = new TableVersionInfo(fields.ToArray());
     if (LastPersistedVersion == 0)
     {
         _tableVersions.TryAdd(1, tvi);
         ClientTypeVersion = 1;
     }
     else
     {
         var last = _tableVersions.GetOrAdd(LastPersistedVersion, v => _tableInfoResolver.LoadTableVersionInfo(_id, v, Name));
         if (TableVersionInfo.Equal(last, tvi))
         {
             ClientTypeVersion = LastPersistedVersion;
         }
         else
         {
             _tableVersions.TryAdd(LastPersistedVersion + 1, tvi);
             ClientTypeVersion = LastPersistedVersion + 1;
         }
     }
 }
Exemple #9
0
 internal void EnsureClientTypeVersion()
 {
     if (ClientTypeVersion != 0) return;
     EnsureKnownLastPersistedVersion();
     var props = _clientType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
     var fields = new List<TableFieldInfo>(props.Length);
     foreach (var pi in props)
     {
         if (pi.GetCustomAttributes(typeof(NotStoredAttribute), true).Length != 0) continue;
         if (pi.GetIndexParameters().Length != 0) continue;
         fields.Add(TableFieldInfo.Build(Name, pi, _tableInfoResolver.FieldHandlerFactory));
     }
     var tvi = new TableVersionInfo(fields.ToArray());
     if (LastPersistedVersion == 0)
     {
         _tableVersions.TryAdd(1, tvi);
         ClientTypeVersion = 1;
     }
     else
     {
         var last = _tableVersions.GetOrAdd(LastPersistedVersion, v => _tableInfoResolver.LoadTableVersionInfo(_id, v, Name));
         if (TableVersionInfo.Equal(last, tvi))
         {
             _tableVersions[LastPersistedVersion] = tvi; // tvi was build from real types and not loaded so it is more exact
             ClientTypeVersion = LastPersistedVersion;
         }
         else
         {
             _tableVersions.TryAdd(LastPersistedVersion + 1, tvi);
             ClientTypeVersion = LastPersistedVersion + 1;
         }
     }
 }