public override void Decode(byte[] data) { var reader = new BinaryReader(new MemoryStream(data)); var tableCount = reader.ReadByte(); for (var tableId = 0; tableId < tableCount; tableId++) { var index = (Index)tableId; var table = new ReferenceTableInfo(index) { CRC = reader.ReadInt32BigEndian(), Version = reader.ReadInt32BigEndian(), FileCount = reader.ReadInt32BigEndian(), Length = reader.ReadInt32BigEndian(), WhirlpoolDigest = reader.ReadBytes(64) }; this.ReferenceTables.Add(index, table); } this.RsaEncryptedWhirlpoolDigest = reader.ReadBytes(512); if (reader.BaseStream.Position < reader.BaseStream.Length) { throw new DecodeException($"Not all bytes read while decoding master reference table. {reader.BaseStream.Length - reader.BaseStream.Position} bytes remain."); } }
public void TestUpdateSchemaInfo() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); ShardMapManager shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy); SchemaInfoCollection siCollection = shardMapManager.GetSchemaInfoCollection(); SchemaInfo si = new SchemaInfo(); ShardedTableInfo sti = new ShardedTableInfo("dbo", "ShardedTableName1", "ColumnName"); si.Add(sti); ReferenceTableInfo rtmd = new ReferenceTableInfo("ReferenceTableName1"); si.Add(rtmd); string mdName = String.Format("TestSI_{0}", Guid.NewGuid()); // Try updating schema info without adding it first. SchemaInfoException siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => siCollection.Replace(mdName, si)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); siCollection.Add(mdName, si); SchemaInfo sdmdNew = new SchemaInfo(); sdmdNew.Add(new ShardedTableInfo("dbo", "NewShardedTableName1", "NewColumnName")); sdmdNew.Add(new ReferenceTableInfo("NewReferenceTableName1")); siCollection.Replace(mdName, sdmdNew); SchemaInfo sdmdRead = siCollection.Get(mdName); Assert.IsTrue(AreEqual <ShardedTableInfo>(sdmdNew.ShardedTables, sdmdRead.ShardedTables)); Assert.IsTrue(AreEqual <ReferenceTableInfo>(sdmdNew.ReferenceTables, sdmdRead.ReferenceTables)); }
public static MasterReferenceTableFile Decode(byte[] data) { var reader = new BinaryReader(new MemoryStream(data)); var referenceTableInfos = new Dictionary <CacheIndex, ReferenceTableInfo>(); var tableCount = reader.ReadByte(); for (var tableId = 0; tableId < tableCount; tableId++) { var index = (CacheIndex)tableId; var table = new ReferenceTableInfo { Crc = reader.ReadInt32BigEndian(), Version = reader.ReadInt32BigEndian(), FileCount = reader.ReadInt32BigEndian(), Length = reader.ReadInt32BigEndian(), WhirlpoolDigest = reader.ReadBytesExactly(64) }; referenceTableInfos.Add(index, table); } var rsaEncryptedWhirlpoolDigest = reader.ReadBytesExactly(512); // var unknownByte = reader.ReadByte(); // 0xA3/163 on build 921 (maybe because of minor version). if (reader.BaseStream.Position < reader.BaseStream.Length) { throw new DecodeException($"Not all bytes read while decoding master reference table. {reader.BaseStream.Length - reader.BaseStream.Position} bytes remain."); } return(new MasterReferenceTableFile { ReferenceTableInfos = referenceTableInfos, RsaEncryptedWhirlpoolDigest = rsaEncryptedWhirlpoolDigest, }); }
public void TestAddAndLookupAndDeleteSchemaInfo() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); ShardMapManager shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy); #region TestAddAndLookup SchemaInfoCollection siCollection = shardMapManager.GetSchemaInfoCollection(); SchemaInfo si = new SchemaInfo(); ShardedTableInfo stmd1 = new ShardedTableInfo("ShardedTableName1", "ColumnName"); ShardedTableInfo stmd2 = new ShardedTableInfo("dbo", "ShardedTableName2", "ColumnName"); si.Add(stmd1); si.Add(stmd2); Assert.AreEqual(2, si.ShardedTables.Count); ReferenceTableInfo rtmd1 = new ReferenceTableInfo("ReferenceTableName1"); ReferenceTableInfo rtmd2 = new ReferenceTableInfo("dbo", "ReferenceTableName2"); si.Add(rtmd1); si.Add(rtmd2); Assert.AreEqual(2, si.ReferenceTables.Count); // Add an existing sharded table again. Make sure it doesn't create duplicate entries. SchemaInfoException siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ShardedTableInfo("ShardedTableName1", "ColumnName"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); // Add an existing sharded table with a different key column name. This should fail too. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ShardedTableInfo("ShardedTableName1", "ColumnName_Different"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ShardedTableInfo("dbo", "ShardedTableName2", "ColumnName_Different"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ShardedTables.Count); // Add an existing reference tables again. Make sure it doesn't create duplicate entries. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ReferenceTableInfo("dbo", "ReferenceTableName2"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ReferenceTables.Count); // Now trying adding a reference table as a sharded table and vice versa. Both operations should fail. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ShardedTableInfo("ReferenceTableName1", "ColumnName"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ShardedTables.Count); siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => si.Add(new ReferenceTableInfo("dbo", "ShardedTableName2"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ReferenceTables.Count); // Try removing an existing table info and adding it back. si.Remove(stmd1); si.Add(stmd1); Assert.AreEqual(2, si.ShardedTables.Count); si.Remove(rtmd2); si.Add(rtmd2); Assert.AreEqual(2, si.ReferenceTables.Count); // Test with NULL inputs. ArgumentException arex = AssertExtensions.AssertThrows <ArgumentException>( () => si.Add((ShardedTableInfo)null)); arex = AssertExtensions.AssertThrows <ArgumentException>( () => si.Add((ReferenceTableInfo)null)); string mdName = String.Format("TestSI_{0}", Guid.NewGuid()); siCollection.Add(mdName, si); SchemaInfo sdmdRead = siCollection.Get(mdName); AssertEqual(si, sdmdRead); // Trying to add schema info with the same name again will result in a 'name conflict' exception. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => siCollection.Add(mdName, si)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameConflict, siex.ErrorCode); #endregion #region TestLookup // Try looking up schema info with a non-existent name. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => siCollection.Get(mdName + "Fail")); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); #endregion #region TestDelete // Try removing any of the recently created schema info. siCollection.Remove(mdName); // Lookup should fail on removed data. siex = AssertExtensions.AssertThrows <SchemaInfoException>( () => siCollection.Get(mdName)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); #endregion }
protected bool Equals(ReferenceTableInfo other) => string.Equals(Schema, other.Schema) && string.Equals(Table, other.Table) && string.Equals(Column, other.Column);
public void TestAddAndLookupAndDeleteSchemaInfo() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); ShardMapManager shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy); #region TestAddAndLookup SchemaInfoCollection siCollection = shardMapManager.GetSchemaInfoCollection(); SchemaInfo si = new SchemaInfo(); ShardedTableInfo stmd1 = new ShardedTableInfo("ShardedTableName1", "ColumnName"); ShardedTableInfo stmd2 = new ShardedTableInfo("dbo", "ShardedTableName2", "ColumnName"); si.Add(stmd1); si.Add(stmd2); Assert.AreEqual(2, si.ShardedTables.Count); ReferenceTableInfo rtmd1 = new ReferenceTableInfo("ReferenceTableName1"); ReferenceTableInfo rtmd2 = new ReferenceTableInfo("dbo", "ReferenceTableName2"); si.Add(rtmd1); si.Add(rtmd2); Assert.AreEqual(2, si.ReferenceTables.Count); // Add an existing sharded table again. Make sure it doesn't create duplicate entries. SchemaInfoException siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ShardedTableInfo("ShardedTableName1", "ColumnName"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); // Add an existing sharded table with a different key column name. This should fail too. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ShardedTableInfo("ShardedTableName1", "ColumnName_Different"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ShardedTableInfo("dbo", "ShardedTableName2", "ColumnName_Different"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ShardedTables.Count); // Add an existing reference tables again. Make sure it doesn't create duplicate entries. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ReferenceTableInfo("dbo", "ReferenceTableName2"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ReferenceTables.Count); // Now trying adding a reference table as a sharded table and vice versa. Both operations should fail. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ShardedTableInfo("ReferenceTableName1", "ColumnName"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ShardedTables.Count); siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => si.Add(new ReferenceTableInfo("dbo", "ShardedTableName2"))); Assert.AreEqual(SchemaInfoErrorCode.TableInfoAlreadyPresent, siex.ErrorCode); Assert.AreEqual(2, si.ReferenceTables.Count); // Try removing an existing table info and adding it back. si.Remove(stmd1); si.Add(stmd1); Assert.AreEqual(2, si.ShardedTables.Count); si.Remove(rtmd2); si.Add(rtmd2); Assert.AreEqual(2, si.ReferenceTables.Count); // Test with NULL inputs. ArgumentException arex = AssertExtensions.AssertThrows<ArgumentException>( () => si.Add((ShardedTableInfo)null)); arex = AssertExtensions.AssertThrows<ArgumentException>( () => si.Add((ReferenceTableInfo)null)); string mdName = String.Format("TestSI_{0}", Guid.NewGuid()); siCollection.Add(mdName, si); SchemaInfo sdmdRead = siCollection.Get(mdName); AssertEqual(si, sdmdRead); // Trying to add schema info with the same name again will result in a 'name conflict' exception. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => siCollection.Add(mdName, si)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameConflict, siex.ErrorCode); #endregion #region TestLookup // Try looking up schema info with a non-existent name. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => siCollection.Get(mdName + "Fail")); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); #endregion #region TestDelete // Try removing any of the recently created schema info. siCollection.Remove(mdName); // Lookup should fail on removed data. siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => siCollection.Get(mdName)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); #endregion }
public void TestUpdateSchemaInfo() { ShardMapManagerFactory.CreateSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerCreateMode.ReplaceExisting); ShardMapManager shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager( Globals.ShardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy); SchemaInfoCollection siCollection = shardMapManager.GetSchemaInfoCollection(); SchemaInfo si = new SchemaInfo(); ShardedTableInfo sti = new ShardedTableInfo("dbo", "ShardedTableName1", "ColumnName"); si.Add(sti); ReferenceTableInfo rtmd = new ReferenceTableInfo("ReferenceTableName1"); si.Add(rtmd); string mdName = String.Format("TestSI_{0}", Guid.NewGuid()); // Try updating schema info without adding it first. SchemaInfoException siex = AssertExtensions.AssertThrows<SchemaInfoException>( () => siCollection.Replace(mdName, si)); Assert.AreEqual(SchemaInfoErrorCode.SchemaInfoNameDoesNotExist, siex.ErrorCode); siCollection.Add(mdName, si); SchemaInfo sdmdNew = new SchemaInfo(); sdmdNew.Add(new ShardedTableInfo("dbo", "NewShardedTableName1", "NewColumnName")); sdmdNew.Add(new ReferenceTableInfo("NewReferenceTableName1")); siCollection.Replace(mdName, sdmdNew); SchemaInfo sdmdRead = siCollection.Get(mdName); AssertEqual(sdmdNew, sdmdRead); }
/// <summary> /// Removes information about a reference table. /// </summary> /// <param name="referenceTableInfo">Reference table info.</param> public bool Remove(ReferenceTableInfo referenceTableInfo) { return _referenceTables.Remove(referenceTableInfo); }
public void Add(ReferenceTableInfo referenceTableInfo) { ExceptionUtils.DisallowNullArgument<ReferenceTableInfo>(referenceTableInfo, "referenceTableInfo"); string existingTableType; lock (_syncObject) { if (CheckIfTableExists(referenceTableInfo, out existingTableType)) { throw new SchemaInfoException( SchemaInfoErrorCode.TableInfoAlreadyPresent, Errors._SchemaInfo_TableInfoAlreadyExists, existingTableType, referenceTableInfo.SchemaName, referenceTableInfo.TableName); } bool result = _referenceTables.Add(referenceTableInfo); // Adding to the reference table set shouldn't fail since we have done all necessary // verification apriori. Debug.Assert(result, "Addition of new sharded table info failed."); } }