示例#1
0
		public BTreeNode(Transaction trans, Db4objects.Db4o.Internal.Btree.BTreeNode firstChild
			, Db4objects.Db4o.Internal.Btree.BTreeNode secondChild) : this(firstChild._btree
			, 2, false, 0, 0, 0)
		{
			_keys[0] = firstChild._keys[0];
			_children[0] = firstChild;
			_keys[1] = secondChild._keys[0];
			_children[1] = secondChild;
			Write(trans.SystemTransaction());
			firstChild.SetParentID(trans, GetID());
			secondChild.SetParentID(trans, GetID());
		}
示例#2
0
文件: BTree.cs 项目: erdincay/db4o
		public BTree(Transaction trans, BTreeConfiguration config, int id, IIndexable4 keyHandler
			, int treeNodeSize) : base(config._idSystem)
		{
			_config = config;
			if (null == keyHandler)
			{
				throw new ArgumentNullException();
			}
			_nodeSize = treeNodeSize;
			_nodeCache = CacheFactory.NewLRUIntCache(config._cacheSize);
			_halfNodeSize = _nodeSize / 2;
			_nodeSize = _halfNodeSize * 2;
			_keyHandler = keyHandler;
			SetID(id);
			if (IsNew())
			{
				SetStateDirty();
				_root = new BTreeNode(this, 0, true, 0, 0, 0);
				_root.Write(trans.SystemTransaction());
				AddNode(_root);
				Write(trans.SystemTransaction());
			}
			else
			{
				SetStateDeactivated();
			}
		}
示例#3
0
文件: BTree.cs 项目: erdincay/db4o
		private void EnsureActive(Transaction trans)
		{
			if (!IsActive())
			{
				Read(trans.SystemTransaction());
			}
		}
示例#4
0
文件: BTree.cs 项目: erdincay/db4o
		private void FinishTransaction(Transaction trans)
		{
			Transaction systemTransaction = trans.SystemTransaction();
			WriteAllNodes(systemTransaction);
			Write(systemTransaction);
			Purge();
		}
示例#5
0
文件: BTree.cs 项目: erdincay/db4o
		public virtual void Add(Transaction trans, IPreparedComparison preparedComparison
			, object key)
		{
			EnsureActive(trans);
			Enlist(trans);
			BTreeNode rootOrSplit = _root.Add(trans, preparedComparison, key);
			if (rootOrSplit != null && rootOrSplit != _root)
			{
				EnsureDirty(trans);
				_root = new BTreeNode(trans, _root, rootOrSplit);
				_root.Write(trans.SystemTransaction());
				AddNode(_root);
			}
			ConvertCacheEvictedNodesToReadMode();
		}
示例#6
0
		internal void PrepareWrite(Transaction trans)
		{
			if (_dead)
			{
				return;
			}
			BTreeNodeCacheEntry cacheEntry = Btree().CacheEntry(this);
			if (CanWrite())
			{
				return;
			}
			ByteArrayBuffer buffer = cacheEntry.Buffer();
			if (buffer != null)
			{
				buffer.Seek(0);
				Read(trans.SystemTransaction(), buffer);
				cacheEntry.Buffer(null);
			}
			else
			{
				Read(trans.SystemTransaction());
			}
			_btree.AddToProcessing(this);
		}
示例#7
0
		internal ByteArrayBuffer PrepareRead(Transaction trans)
		{
			BTreeNodeCacheEntry cacheEntry = Btree().CacheEntry(this);
			if (CanWrite())
			{
				return null;
			}
			if (IsNew())
			{
				return null;
			}
			Transaction systemTransaction = trans.SystemTransaction();
			ByteArrayBuffer buffer = cacheEntry.Buffer();
			if (buffer != null)
			{
				// Cache hit, still unread
				buffer.Seek(0);
				Read(systemTransaction, buffer);
				cacheEntry.Buffer(null);
				_btree.AddToProcessing(this);
				return null;
			}
			buffer = ProduceReadBuffer(systemTransaction);
			ReadNodeHeader(buffer);
			cacheEntry.Buffer(buffer);
			return buffer;
		}
示例#8
0
		private Db4objects.Db4o.Internal.Btree.BTreeNode Split(Transaction trans)
		{
			Db4objects.Db4o.Internal.Btree.BTreeNode res = new Db4objects.Db4o.Internal.Btree.BTreeNode
				(_btree, _btree._halfNodeSize, _isLeaf, _parentID, GetID(), _nextID);
			System.Array.Copy(_keys, _btree._halfNodeSize, res._keys, 0, _btree._halfNodeSize
				);
			for (int i = _btree._halfNodeSize; i < _keys.Length; i++)
			{
				_keys[i] = null;
			}
			if (_children != null)
			{
				res._children = new object[_btree.NodeSize()];
				System.Array.Copy(_children, _btree._halfNodeSize, res._children, 0, _btree._halfNodeSize
					);
				for (int i = _btree._halfNodeSize; i < _children.Length; i++)
				{
					_children[i] = null;
				}
			}
			_count = _btree._halfNodeSize;
			res.Write(trans.SystemTransaction());
			_btree.AddNode(res);
			int splitID = res.GetID();
			PointNextTo(trans, splitID);
			SetNextID(trans, splitID);
			if (_children != null)
			{
				for (int i = 0; i < _btree._halfNodeSize; i++)
				{
					if (res._children[i] == null)
					{
						break;
					}
					res.Child(i).SetParentID(trans, splitID);
				}
			}
			_btree.NotifySplit(trans, this, res);
			return res;
		}
 // do nothing.
 public override BTree GetIndex(Transaction trans)
 {
     return(((LocalTransaction)trans.SystemTransaction()).CommitTimestampSupport().TimestampToId
                ());
 }
		// do nothing.
		public override BTree GetIndex(Transaction trans)
		{
			return ((LocalTransaction)trans.SystemTransaction()).CommitTimestampSupport().TimestampToId
				();
		}