private AddTree ( string name, Voron.Trees.Tree tree ) : void | ||
name | string | |
tree | Voron.Trees.Tree | |
return | void |
public unsafe Tree CreateTree(Transaction tx, string name, bool keysPrefixing = false) { if (tx.Flags == (TransactionFlags.ReadWrite) == false) throw new ArgumentException("Cannot create a new tree with a read only transaction"); Tree tree = tx.ReadTree(name); if (tree != null) return tree; if (name.Equals(Constants.RootTreeName, StringComparison.InvariantCultureIgnoreCase) || name.Equals(Constants.FreeSpaceTreeName, StringComparison.InvariantCultureIgnoreCase)) throw new InvalidOperationException("Cannot create a tree with reserved name: " + name); Slice key = (Slice)name; // we are in a write transaction, no need to handle locks var header = (TreeRootHeader*)tx.State.Root.DirectRead(key); if (header != null) { tree = Tree.Open(tx, header); tree.Name = name; tx.AddTree(name, tree); return tree; } tree = Tree.Create(tx, keysPrefixing); tree.Name = name; var space = tx.State.Root.DirectAdd(key, sizeof(TreeRootHeader)); tree.State.CopyTo((TreeRootHeader*)space); tree.State.IsModified = true; tx.AddTree(name, tree); if(IsDebugRecording) DebugJournal.RecordWriteAction(DebugActionType.CreateTree, tx, Slice.Empty,name,Stream.Null); return tree; }
public unsafe Tree CreateTree(Transaction tx, string name, bool keysPrefixing = false) { Tree tree = tx.ReadTree(name); if (tree != null) return tree; if (name.Equals(Constants.RootTreeName, StringComparison.InvariantCultureIgnoreCase)) return tx.Root; if (name.Equals(Constants.FreeSpaceTreeName, StringComparison.InvariantCultureIgnoreCase)) return tx.FreeSpaceRoot; if (tx.Flags == (TransactionFlags.ReadWrite) == false) throw new InvalidOperationException("No such tree: " + name + " and cannot create trees in read transactions"); Slice key = name; tree = Tree.Create(tx, keysPrefixing); tree.Name = name; var space = tx.Root.DirectAdd(key, sizeof(TreeRootHeader)); tree.State.CopyTo((TreeRootHeader*)space); tree.State.IsModified = true; tx.AddTree(name, tree); if(IsDebugRecording) DebugJournal.RecordWriteAction(DebugActionType.CreateTree, tx, Slice.Empty,name,Stream.Null); return tree; }
public unsafe void RenameTree(Transaction tx, string fromName, string toName) { if (tx.Flags == (TransactionFlags.ReadWrite) == false) throw new ArgumentException("Cannot rename a new tree with a read only transaction"); if (toName.Equals(Constants.RootTreeName, StringComparison.InvariantCultureIgnoreCase) || toName.Equals(Constants.FreeSpaceTreeName, StringComparison.InvariantCultureIgnoreCase)) throw new InvalidOperationException("Cannot create a tree with reserved name: " + toName); if (tx.ReadTree(toName) != null) throw new ArgumentException("Cannot rename a tree with the name of an existing tree: " + toName); Tree fromTree = tx.ReadTree(fromName); if (fromTree == null) throw new ArgumentException("Tree " + fromName + " does not exists"); Slice key = (Slice)toName; tx.State.Root.Delete((Slice)fromName); var ptr = tx.State.Root.DirectAdd(key, sizeof(TreeRootHeader)); fromTree.State.CopyTo((TreeRootHeader*) ptr); fromTree.Name = toName; fromTree.State.IsModified = true; tx.RemoveTree(fromName); tx.RemoveTree(toName); tx.AddTree(toName, fromTree); if (IsDebugRecording) DebugJournal.RecordWriteAction(DebugActionType.RenameTree, tx, (Slice)toName, fromName, Stream.Null); }
public unsafe Tree CreateTree(Transaction tx, string name) { if (tx.Flags == (TransactionFlags.ReadWrite) == false) throw new ArgumentException("Cannot create a new tree with a read only transaction"); Tree tree = tx.ReadTree(name); if (tree != null) return tree; Slice key = name; // we are in a write transaction, no need to handle locks var header = (TreeRootHeader*)tx.State.Root.DirectRead(key); if (header != null) { tree = Tree.Open(tx, _sliceComparer, header); tree.Name = name; tx.AddTree(name, tree); return tree; } tree = Tree.Create(tx, _sliceComparer); tree.Name = name; var space = tx.State.Root.DirectAdd(key, sizeof(TreeRootHeader)); tree.State.CopyTo((TreeRootHeader*)space); tree.State.IsModified = true; tx.AddTree(name, tree); if(IsDebugRecording) DebugJournal.RecordAction(DebugActionType.CreateTree, Slice.Empty,name,Stream.Null); return tree; }