Exemplo n.º 1
0
    def update_game(self, idx, game_tree):
        old_length = self.delete_game_for_update_at(idx)

        dos_newlines = False
        if "\r\n".encode() in open(self.filename,"rb").read():
            dos_newlines = True

        if(dos_newlines):
            game_str = (str(game_tree.root())).replace('\n','\r\n')
            game_str = (game_str + '\r\n\r\n').encode('utf-8')
        else:
            game_str = (str(game_tree.root())+"\n\n").encode('utf-8')
        length = len(game_str)

        offset = self.entries[idx].pgn_offset

        # we can't mmap an empty file
        # the file is however empty, if the current
        # game was the only one in the database
        # just append it
        current_filesize = os.stat(self.filename).st_size
        print("current fs: "+str(current_filesize))
        if current_filesize == 0:
            print("file is empty")
            self.entries = []
            self.append_game(game_tree)
        else:
            pgn = open(self.filename, 'r+')
            m=mm.mmap(pgn.fileno(),0)
            size = len(m)
            new_size = size + length
            m.flush()
            m.close()
            pgn.seek(size)
            pgn.write('A'*length)
            pgn.flush()
            m=mm.mmap(pgn.fileno(),0)
            m.move(offset+length,offset,size-offset)
            m.seek(offset)
            m.write(game_str)
            m.flush()
            m.close()
            pgn.close()

            for i in range(idx+1, len(self.entries)):
                self.entries[i].pgn_offset += (length-old_length)

        self.checksum = crc32_from_file(self.filename)
        self.entries[idx] = Entry(offset, game_tree.root().headers)
Exemplo n.º 2
0
    def delete_game_for_update_at(self,idx):
        start_offset = self.entries[idx].pgn_offset

        # if the last game is to be deleted, first get
        # the offset at the very end of the file
        stop_offset = None
        if(idx == len(self.entries) -1):
            stop_offset = self.get_end_offset()
            print("stop offset: "+str(stop_offset))
        else: # just take the start of the next game as end
            stop_offset = self.entries[idx+1].pgn_offset

        length = stop_offset - start_offset

        pgn = open(self.filename, 'r+')
        m=mm.mmap(pgn.fileno(),0)
        size = len(m)
        new_size = size - length
        m.move(start_offset,stop_offset,size-stop_offset)
        m.flush()
        m.close()
        pgn.truncate(new_size)
        pgn.close()

        return length
Exemplo n.º 3
0
    def update_game(self, idx, game_tree):
        old_length = self.delete_game_for_update_at(idx)

        dos_newlines = False
        if "\r\n".encode() in open(self.filename, "rb").read():
            dos_newlines = True

        if (dos_newlines):
            game_str = (str(game_tree.root())).replace('\n', '\r\n')
            game_str = (game_str + '\r\n\r\n').encode('utf-8')
        else:
            game_str = (str(game_tree.root()) + "\n\n").encode('utf-8')
        length = len(game_str)

        offset = self.entries[idx].pgn_offset

        # we can't mmap an empty file
        # the file is however empty, if the current
        # game was the only one in the database
        # just append it
        current_filesize = os.stat(self.filename).st_size
        if current_filesize == 0:
            self.entries = []
            self.append_game(game_tree)
        else:
            pgn = open(self.filename, 'r+')
            m = mm.mmap(pgn.fileno(), 0)
            size = len(m)
            new_size = size + length
            m.flush()
            m.close()
            pgn.seek(size)
            pgn.write('A' * length)
            pgn.flush()
            m = mm.mmap(pgn.fileno(), 0)
            m.move(offset + length, offset, size - offset)
            m.seek(offset)
            m.write(game_str)
            m.flush()
            m.close()
            pgn.close()

            for i in range(idx + 1, len(self.entries)):
                self.entries[i].pgn_offset += (length - old_length)

        self.checksum = crc32_from_file(self.filename)
        self.entries[idx] = Entry(offset, game_tree.root().headers)
Exemplo n.º 4
0
def read_games(pgn_file, n_matches):

	pgn = open(pgn_file)
	g_count = 0
	games = []
	while pgn.tell() != os.fstat(pgn.fileno()).st_size:
		game = chess.pgn.read_game(pgn)
		games.append(game)
		g_count += 1
		if g_count == n_matches:
			break
	print >> sys.stderr, "Total ",g_count,"games has been read"
	return games
Exemplo n.º 5
0
    def delete_game_at(self,idx):
        start_offset = self.entries[idx].pgn_offset

        # if the last game is to be deleted, first get
        # the offset at the very end of the file
        stop_offset = None
        if(idx == len(self.entries) -1):
            stop_offset = self.get_end_offset()
        else: # just take the start of the next game as end
            stop_offset = self.entries[idx+1].pgn_offset

        length = stop_offset - start_offset

        # we can't mmap an empty file
        # the file is however empty, the
        # game to be deleted was the only one in the database
        # just delete it
        current_filesize = os.stat(self.filename).st_size
        print("current fs: "+str(current_filesize))
        if current_filesize == 0:
            print("file is empty")
            pgn = open(self.filename, 'r+')
            pgn.close()
        else:
            pgn = open(self.filename, 'r+')
            m=mm.mmap(pgn.fileno(),0)
            size = len(m)
            new_size = size - length
            m.move(start_offset,stop_offset,size-stop_offset)
            m.flush()
            m.close()
            pgn.truncate(new_size)
            pgn.close()
            self.checksum = crc32_from_file(self.filename)

        for i in range(idx, len(self.entries)):
            self.entries[i].pgn_offset -= length
        del(self.entries[idx])
        # if idx was the current open game, set current_idx to None
        if(idx == self.index_current_game):
            self.index_current_game = None
Exemplo n.º 6
0
    def delete_game_at(self, idx):
        start_offset = self.entries[idx].pgn_offset

        # if the last game is to be deleted, first get
        # the offset at the very end of the file
        stop_offset = None
        if (idx == len(self.entries) - 1):
            stop_offset = self.get_end_offset()
        else:  # just take the start of the next game as end
            stop_offset = self.entries[idx + 1].pgn_offset

        length = stop_offset - start_offset

        # we can't mmap an empty file
        # the file is however empty, the
        # game to be deleted was the only one in the database
        # just delete it
        current_filesize = os.stat(self.filename).st_size
        if current_filesize == 0:
            pgn = open(self.filename, 'r+')
            pgn.close()
        else:
            pgn = open(self.filename, 'r+')
            m = mm.mmap(pgn.fileno(), 0)
            size = len(m)
            new_size = size - length
            m.move(start_offset, stop_offset, size - stop_offset)
            m.flush()
            m.close()
            pgn.truncate(new_size)
            pgn.close()
            self.checksum = crc32_from_file(self.filename)

        for i in range(idx, len(self.entries)):
            self.entries[i].pgn_offset -= length
        del (self.entries[idx])
        # if idx was the current open game, set current_idx to None
        if (idx == self.index_current_game):
            self.index_current_game = None
Exemplo n.º 7
0
    def delete_game_for_update_at(self, idx):
        start_offset = self.entries[idx].pgn_offset

        # if the last game is to be deleted, first get
        # the offset at the very end of the file
        stop_offset = None
        if (idx == len(self.entries) - 1):
            stop_offset = self.get_end_offset()
        else:  # just take the start of the next game as end
            stop_offset = self.entries[idx + 1].pgn_offset

        length = stop_offset - start_offset

        pgn = open(self.filename, 'r+')
        m = mm.mmap(pgn.fileno(), 0)
        size = len(m)
        new_size = size - length
        m.move(start_offset, stop_offset, size - stop_offset)
        m.flush()
        m.close()
        pgn.truncate(new_size)
        pgn.close()

        return length