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()); }
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)); }
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()); }