view Main/jungle-network/transaction/NetworkDefaultJungleTree.cs @ 35:f2ea780b3e80

fix
author Kazuma Takeda
date Wed, 22 Feb 2017 16:30:19 +0900
parents 1f99e150f336
children
line wrap: on
line source

using System.Collections;

namespace JungleDB {
	public class NetworkDefaultJungleTree : JungleTree {

		private readonly AtomicReference<TreeContext> Repository;
		private readonly string Uuid;
		private readonly string TreeName;
		private readonly ChangeListWriter Writer;
		private readonly TreeEditor Editor;

		public NetworkDefaultJungleTree(string name, TreeContext tc, string uid, ChangeListWriter writer, TreeEditor edit) {
			this.TreeName   = name;
			this.Repository = new AtomicReference<TreeContext>(tc);
			this.Uuid       = uid;
			this.Writer     = writer;
			this.Editor     = edit;
		}

		public JungleTreeEditor getTreeEditor() {
			TreeContext tc = Repository.Get();
			NetworkTransactionManager txManager = new NetworkTransactionManager(this.TreeName, this.Writer, tc, this.Repository, this.Uuid);
			TreeNode root = tc.getRoot();
			return new NetworkDefaultJungleTreeEditor(this.TreeName, root, txManager, this.Editor);
		}

		public JungleTreeEditor getLocalTreeEditor () {
			TreeContext tc = this.Repository.Get();
			NetworkTransactionManager txManager = new NetworkTransactionManager(this.TreeName, this.Writer, tc, this.Repository, this.Uuid);
			TreeNode root = tc.getRoot();
			return NetworkDefaultJungleTreeEditor.NewLocalTreeEditor(this.TreeName, root, txManager, this.Editor);
		}

		public TreeNode getRootNode () {
			TreeContext tc = this.Repository.Get();
			return tc.getRoot();
		}

		public long revision () {
			return 0;
		}

		public Either<Error, JungleTree> getOldTree (long rev) {
			TreeContext tc = this.Repository.Get();
			while(tc.getRevision() != rev) { // If I mistake this code, change this code.
				tc = tc.prev();
				if (tc == null) {
					return DefaultEither<Error, JungleTree>.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
				}
			}
			string oldTreeUuid = this.Uuid + revision().ToString();
			JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, this.Writer, this.Editor);
			return DefaultEither<Error, JungleTree>.newB(oldTree);
		}

		public TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex () {
			TreeContext tc = this.Repository.Get();
			return tc.getIndex();
		}

		public Either<Error, TreeNode> getNodeOfPath (NodePath path) {
			TreeNode node = this.Repository.Get().getRoot();
			foreach(var num in path) {
				if (num == -1) {
					continue;
				}
				Either<Error, TreeNode> either = node.getChildren().at(num);
				if (either.isA()){
					return either;
				}
				node = either.b();
			}
			return DefaultEither<Error, TreeNode>.newB(node);
		}

		public void setBufferSize (int num) {

		}
	}
}