public void CreateCRCFile(string fileName, CarsonBackend database, List <string> dataFields, FileStream readStream, BinaryReader reader, TableInstance tableInstance, bool headerOnly) { List <Definition> fieldDefinitions = new List <Definition>(); for (int x = 0; x < dataFields.Count; x++) { Definition definition = database.FindFieldDefinition(dataFields[x]); if (definition == null) { throw new Exception("Invalid Field Name: " + dataFields[x]); } fieldDefinitions.Add(definition); } if (File.Exists(fileName)) { File.Delete(fileName); } using (FileStream writeStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) using (BinaryWriter writer = new BinaryWriter(writeStream)) { writeStream.Seek(0, SeekOrigin.Begin); writer.Write(StringToByte("CARSONDB" + CarsonBackend.DatabaseVersion)); List <int> fieldOffsets = new List <int>(); string fieldDefinitionString = database.DatabaseName + "\0"; for (int x = 0; x < fieldDefinitions.Count; x++) { fieldDefinitionString += fieldDefinitions[x].FieldName + (x < fieldDefinitions.Count - 1 ? "\0" : ""); fieldOffsets.Add(Convert.ToInt32(fieldDefinitions[x].FieldOrdinal)); fieldOffsets.Add(ComputeFieldSize(fieldDefinitions[x].FieldType)); fieldOffsets.Add(fieldDefinitions[x].FieldType == AVImarkDataType.AVImarkDynamicString ? 1 : 0); } writer.Write(fieldDefinitionString); int[] fieldData = fieldOffsets.ToArray(); if (!headerOnly) { using (CarsonLibDll carsonLib = new CarsonLibDll()) { carsonLib.ComputerCompareCrc(readStream.SafeFileHandle, writeStream.SafeFileHandle, (int)tableInstance, ref fieldData[0], fieldDefinitions.Count, CrcFunction.Create, (int)writeStream.Position, database.IsClassic()); } } } }
public List <int> FindChangedRecords(string fileName, CarsonBackend database, FileStream readStream, out int recordsFound, TableInstance tableInstance) { using (FileStream diffStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) using (BinaryReader diffReader = new BinaryReader(diffStream)) { IntPtr recordPtr; List <Definition> fieldDefinitions = new List <Definition>(); ValidateFileHeader(diffStream, diffReader); string fieldDefinitionString = diffReader.ReadString(); string[] fields = fieldDefinitionString.Split('\0'); for (int x = 1; x < fields.Length; x++) { fieldDefinitions.Add(database.FindFieldDefinition(fields[x])); } List <int> fieldOffsets = new List <int>(); for (int x = 0; x < fieldDefinitions.Count; x++) { fieldOffsets.Add(Convert.ToInt32(fieldDefinitions[x].FieldOrdinal)); fieldOffsets.Add(ComputeFieldSize(fieldDefinitions[x].FieldType)); fieldOffsets.Add(fieldDefinitions[x].FieldType == AVImarkDataType.AVImarkDynamicString ? 1 : 0); } int[] fieldData = fieldOffsets.ToArray(); using (CarsonLibDll carsonLib = new CarsonLibDll()) { recordPtr = carsonLib.ComputerCompareCrc(readStream.SafeFileHandle, diffStream.SafeFileHandle, (int)tableInstance, ref fieldData[0], fieldDefinitions.Count, CrcFunction.Compare, (int)diffStream.Position, database.IsClassic()); int recordCount = carsonLib.RecordCountFromHandle(recordPtr); int[] result = new int[recordCount]; Marshal.Copy(recordPtr, result, 0, recordCount); //Number of records in differential file is calculated on the file length less 16 (diff file header + version) and the field definitions. recordsFound = ((int)diffStream.Length - 16 - fieldDefinitionString.Length) / 4; return(new List <int>(result)); } } }