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)
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
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)
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
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
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
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