file_file.py 2.34 KB
Newer Older
1 2
# -*- coding: utf-8 -*-
# Wendelin.bigfile | BigFile file backend
Kirill Smelkov's avatar
Kirill Smelkov committed
3
# Copyright (C) 2014-2019  Nexedi SA and Contributors.
4 5 6 7 8 9 10
#                          Kirill Smelkov <kirr@nexedi.com>
#
# This program is free software: you can Use, Study, Modify and Redistribute
# it under the terms of the GNU General Public License version 3, or (at your
# option) any later version, as published by the Free Software Foundation.
#
# You can also Link and Combine this program with other software covered by
11 12 13 14
# the terms of any of the Free Software licenses or any of the Open Source
# Initiative approved licenses and Convey the resulting work. Corresponding
# source of such a combination shall include the source code for all other
# software used.
15 16 17 18 19
#
# This program is distributed WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See COPYING file for full licensing terms.
20
# See https://www.nexedi.com/licensing for rationale and options.
21 22 23 24 25 26 27
""" BigFile backed by OS file """

from wendelin.bigfile import BigFile
from io import FileIO, SEEK_SET

# XXX naming
class BigFile_File(BigFile):
Kirill Smelkov's avatar
Kirill Smelkov committed
28
    # .f        - io.FileIO to file
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

    def __new__(cls, path_or_fd, blksize):
        # XXX pass flags/mode as args to ctor ?
        f = FileIO(path_or_fd, 'r+')
        obj = BigFile.__new__(cls, blksize)
        obj.f = f
        return obj


    def loadblk(self, blk, buf):
        blksize = self.blksize
        f = self.f
        f.seek(blk * blksize, SEEK_SET)

        # XXX unfortunately buffer(buf, pos) creates readonly buffer, so we
Kirill Smelkov's avatar
Kirill Smelkov committed
44
        # have to use memoryview
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
        # XXX not needed after BIGFILE_USE_OLD_BUFFER support is dropped
        bufmem = memoryview(buf)

        size = blksize
        while size > 0:
            n = f.readinto(bufmem[blksize-size:])
            # XXX n==0 -- EOF ?
            assert n != 0
            size -= n

        # ok
        return


    def storeblk(self, blk, buf):
        blksize = self.blksize
        f = self.f
        f.seek(blk * blksize, SEEK_SET)

        # NOTE unfortunately buffer[:] creates _data_ copy
        # XXX not needed after BIGFILE_USE_OLD_BUFFER support is dropped
        bufmem = memoryview(buf)

        size = blksize
        while size > 0:
            n = f.write(bufmem[blksize-size:])
            assert n != 0
            size -= n

        # ok
        return