public void _001_Create_Open_Stat_Close() { var path = _temp.GetPath("001.mkd"); var createData = CreateDataFactory.CreateDefault(); _operator.Create(path, createData, true); try { _operator.Create(path, createData, false); } catch (OperationException e) { Assert.Equal(59, e.StatusCode); } _operator.Create(path, createData, true); var positionBlock = _operator.Open(path); var statData = _operator.Stat(positionBlock); _operator.Close(positionBlock); Assert.Equal(createData.FileSpec.Flag & (FileFlag)0xedff, statData.FileSpec.Flag & (FileFlag)0xedff); Assert.Equal(createData.FileSpec.RecordLength, statData.FileSpec.RecordLength); Assert.Equal(createData.FileSpec.PageSize, statData.FileSpec.PageSize); var createKeySpecs = createData.KeySpecs.GetEnumerator(); var statKeySpecs = statData.KeySpecs.GetEnumerator(); while (createKeySpecs.MoveNext()) { statKeySpecs.MoveNext(); Assert.Equal(createKeySpecs.Current.Position, statKeySpecs.Current.Position); Assert.Equal(createKeySpecs.Current.Length, statKeySpecs.Current.Length); Assert.Equal(createKeySpecs.Current.KeyType, statKeySpecs.Current.KeyType); Assert.Equal(createKeySpecs.Current.Flag, statKeySpecs.Current.Flag); } }
public void Create(Path path = null, bool overwrite = false) { var recordInfo = this.RecordInfo; var fileSpec = recordInfo.GetCreateFileSpec(); var keySpecs = recordInfo.Keys.SelectMany(k => k.Segments.Select(s => s.GetCreateKeySpec())); var createData = new CreateData(fileSpec, keySpecs); var filePath = Path.Merge(path, this.Path).GetFilePath(); _nativeOperator.Create(filePath, createData, overwrite); if (recordInfo.OwnerName != null) { var positionBlock = _nativeOperator.Open(filePath); try { _nativeOperator.SetOwner(positionBlock, recordInfo.OwnerName, recordInfo.OwnerNameOption); } finally { _nativeOperator.Close(positionBlock); } } }
public static Record FromBtrieveFile(Path path, string dllPath = null, IEnumerable <string> dependencyPaths = null, byte defaultByte = 0x00, string ownerName = null) { StatData stat; var nativeOperator = new NativeOperator(dllPath: dllPath, dependencyPaths: dependencyPaths); var positionBlock = nativeOperator.Open(path.GetFilePath(), ownerName); try { stat = nativeOperator.Stat(positionBlock); } finally { nativeOperator.Close(positionBlock); } var statKeySpecs = new List <StatKeySpec>(); var keys = new List <Key>(); var fields = new List <Field>(); foreach (var keySpec in stat.KeySpecs) { statKeySpecs.Add(keySpec); if (!keySpec.IsSegmentKey) { var statKey = statKeySpecs .Select(s => new { DuplicateKeyOption = s.DuplicateKeyOption, IsModifiable = s.IsModifiable, NullKeyOption = s.NullKeyOption, KeyNumber = s.Number }) .Distinct() .Single(); var keySegments = new List <KeySegment>(); ushort i = 0; foreach (var statKeySpec in statKeySpecs) { var field = fields.SingleOrDefault(f => f.KeyType == statKeySpec.KeyType && f.Position == statKeySpec.Position && f.Length == statKeySpec.Length); if (field == null) { field = new Field() { Position = statKeySpec.Position, Length = statKeySpec.Length, KeyType = statKeySpec.KeyType, ConverterTypeName = Config.GetConverterTypeName(statKeySpec.KeyType, statKeySpec.Length), Parameter = Config.GetConverterParameter(statKeySpec.KeyType, statKeySpec.Length), NullType = NullType.None }; fields.Add(field); } keySegments.Add( new KeySegment() { Index = i, KeyType = statKeySpec.KeyType, NullValue = statKeySpec.NullValue, IsDescending = statKeySpec.IsDescending, IsIgnoreCase = statKeySpec.IsIgnoreCase, Field = field }); i++; } var key = new Key(); key.Name = String.Format(Config.KeyName, statKey.KeyNumber); key.DuplicateKeyOption = statKey.DuplicateKeyOption; key.IsModifiable = statKey.IsModifiable; key.NullKeyOption = statKey.NullKeyOption; key.KeyNumber = statKey.KeyNumber; key.Segments = keySegments.ToArray(); keys.Add(key); statKeySpecs.Clear(); } } if (statKeySpecs.Count != 0) { throw new InvalidModelException(); } var result = new Record(); if (path.PathType == PathType.Uri) { result.Name = path.UriTable ?? new System.IO.FileInfo(path.UriDbFile ?? path.UriFile ?? "Record").Name; } else { var fileInfo = new System.IO.FileInfo(path.GetFilePath()); result.Name = fileInfo.Name.Substring(0, fileInfo.Name.Length - fileInfo.Extension.Length).TrimEnd('.'); } result.FixedLength = stat.FileSpec.RecordLength; result.PageSize = stat.FileSpec.PageSize; result.DuplicatedPointerCount = 0; result.Allocation = 0; result.VariableOption = stat.FileSpec.VariableOption; result.UsesIndexBalancing = stat.FileSpec.UsesIndexBalancing; result.IsCompressed = stat.FileSpec.IsCompressed; result.FreeSpaceThreshold = stat.FileSpec.FreeSpaceThreshold; result.IsManualKeyNumber = stat.FileSpec.IsManualKeyNumber; result.SystemDataOption = stat.FileSpec.SystemDataOption; result.DefaultByte = defaultByte; result.OwnerName = ownerName; result.UriTable = path.UriTable; result.UriDbFile = path.UriDbFile; result.UriFile = path.UriFile; result.AbsolutePath = path.AbsolutePath; result.RelativePath = path.RelativePath; result.VariableFieldCapacity = 0; result.Keys = keys.ToArray(); result.Fields = fields.OrderBy(f => f.Position).ToArray(); Record.Initialize(result, true); return(result); }