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; } } }
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; }
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)); } }
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); }
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)); } }
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; } } }
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}"); }
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; } } }
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; } } }