Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }