Esempio n. 1
0
        public IReadOnlyList <int> GetBacklinks(int columnIndex, int rowIndex)
        {
            // LinkList と同じように、さらに下に B+ 木がある構造

            this.CheckColumn(columnIndex, ColumnType.BackLink, false);

            // Integer カラムとして読み出す
            var(leaf, indexInLeaf) = this.GetFromBpTree(columnIndex, rowIndex);
            var bpTreeRef = (ulong)new RealmArray(leaf)[indexInLeaf];

            // 0 ならば、リストが作成されていない、つまり 0 件
            if (bpTreeRef == 0)
            {
                return(Array.Empty <int>());
            }

            // 参照でないならば、バックリンクが 1 件だけ
            if ((bpTreeRef & 1) != 0)
            {
                // タグ付けされているので解除
                return(new[] { checked ((int)(bpTreeRef >> 1)) });
            }

            var backlinkListBpTree = new BpTree(this.Ref.NewRef(bpTreeRef));

            // すべて読み出す
            return(backlinkListBpTree.EnumerateElements(leafRef => new RealmArray(leafRef))
                   .Select(linkRowIndex => checked ((int)linkRowIndex))
                   .ToArray());
        }
Esempio n. 2
0
        public DateTimeOffset?GetTimestamp(int columnIndex, int rowIndex)
        {
            this.CheckColumn(columnIndex, ColumnType.Timestamp, null);

            // Timestamp カラムは、まず配列がある
            var topArray = new RealmArray(this.Ref.NewRef((ulong)this.Columns[this.GetColumnBpTreeIndex(columnIndex)]));

            // 配列の要素は、秒とナノ秒
            var secondsBpTree     = new BpTree(this.Ref.NewRef((ulong)topArray[0]));
            var nanosecondsBpTree = new BpTree(this.Ref.NewRef((ulong)topArray[1]));

            // 秒を取得
            var(leaf, indexInLeaf) = secondsBpTree.Get(rowIndex);
            var seconds = new RealmArrayIntNull(leaf)[indexInLeaf];

            // seconds が null ならば、返すべき値は null
            if (!seconds.HasValue)
            {
                return(null);
            }

            // ナノ秒を取得
            (leaf, indexInLeaf) = nanosecondsBpTree.Get(rowIndex);
            var nanoseconds = new RealmArray(leaf)[indexInLeaf];

            // 参考: 秒とナノ秒で正負混ぜることはできない
            // https://github.com/realm/realm-core/blob/v5.12.7/src/realm/timestamp.hpp#L43-L63

            // DateTimeOffset が表せるのは 100ns
            return(DateTimeOffset.UnixEpoch
                   .AddTicks(seconds.Value * TimeSpan.TicksPerSecond + nanoseconds / 100));
        }
Esempio n. 3
0
        public IReadOnlyList <int> GetLinkList(int columnIndex, int rowIndex)
        {
            this.CheckColumn(columnIndex, ColumnType.LinkList, false);

            // Integer カラムとして読み出す
            var(leaf, indexInLeaf) = this.GetFromBpTree(columnIndex, rowIndex);
            var linkListRef = (ulong)new RealmArray(leaf)[indexInLeaf];

            // 0 ならば、リストが作成されていない、つまり 0 件
            if (linkListRef == 0)
            {
                return(Array.Empty <int>());
            }

            // Integer カラムと同じ構造がさらにある
            var linkListBpTree = new BpTree(this.Ref.NewRef(linkListRef));

            // すべて読み出す
            return(linkListBpTree.EnumerateElements(leafRef => new RealmArray(leafRef))
                   .Select(linkRowIndex => checked ((int)linkRowIndex))
                   .ToArray());
        }