Files @ a4bfaabaeabb
Branch filter:

Location: Morevna/src/netnode.py

Laman
refactored data file optimizations from client and server to datafile
import os
import socket
import logging as log

import config as conf
from networkers import NetworkReader,NetworkWriter
from hashtree import HashTree


lockFile=os.path.join(conf.directory,"dirty.lock")


class FailedConnection(Exception): pass
class LockedException(Exception): pass
class IncompatibleException(Exception): pass


class BaseConnection: # abstract
	def __init__(self):
		self._socket=None
		self.incoming=None
		self.outcoming=None

	def createNetworkers(self):
		fr=self._socket.makefile(mode="rb")
		fw=self._socket.makefile(mode="wb")

		self.incoming=NetworkReader(fr)
		self.outcoming=NetworkWriter(fw)

	def __enter__(self):
		return self.incoming,self.outcoming

	def __exit__(self, exc_type, exc_val, exc_tb):
		try:
			self._socket.shutdown(socket.SHUT_RDWR)
			self._socket.close()
		except OSError:
			log.warning("broken connection")


class NetNode:
	def __init__(self,filename,treeFile=""):
		self._incoming=None
		self._outcoming=None

		self._filename=filename
		self._treeFile=treeFile

		if treeFile:
			self._tree=HashTree.load(treeFile)
		else:
			self._tree=HashTree.fromFile(filename)

		self._newLeaves=dict()

	def isLocked(self):
		return os.path.isfile(lockFile)

	def _lock(self):
		try:
			f=open(lockFile,"x")
			f.close()
		except FileExistsError:
			raise LockedException()

	def _unlock(self):
		os.remove(lockFile)

	def _updateTree(self):
		log.info("updating hash tree...")
		self._tree.batchUpdate(self._newLeaves.items())
		self._tree.save(self._treeFile)
		log.info("tree updated")