Hello,

I confirm that a search&replace of "r+b" to "rb" in the code makes
python3-dbf able to open read only .dbf files.

Patch attached.


Enrico

-- 
GPG key: 4096R/634F4BD1E7AD5568 2009-05-08 Enrico Zini <[email protected]>
From cd400e93630b4271d91ec0e4e5da0a7c3e3686ba Mon Sep 17 00:00:00 2001
From: Enrico Zini <[email protected]>
Date: Tue, 14 Feb 2017 15:26:59 +0100
Subject: [PATCH] Fixed readonly file opening modes

---
 dbf/_index.py | 4 ++--
 dbf/ver_2.py  | 8 ++++----
 dbf/ver_32.py | 8 ++++----
 dbf/ver_33.py | 8 ++++----
 4 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/dbf/_index.py b/dbf/_index.py
index 6894106..7047996 100644
--- a/dbf/_index.py
+++ b/dbf/_index.py
@@ -8,12 +8,12 @@ class IndexFile(object):
         filename = os.path.splitext(dbf.filename)[0]
         filename += '.pdx'
         if not os.path.exists(filename):
-            self.index_file = open(filename, 'r+b')
+            self.index_file = open(filename, 'rb')
             self.index_file.write('\xea\xaf\x37\xbf'    # signature
                 '\x00'*8                                # two non-existant lists
                 '\x00'*500)                             # and no indices
             return
-        index_file = self.index_file = open(filename, 'r+b')
+        index_file = self.index_file = open(filename, 'rb')
         header = index_file.read(512)
         if header[:4] != '\xea\xaf\x37\xbf':
             raise IndexFileError("Wrong signature -- unable to use index file %r" % filename)
diff --git a/dbf/ver_2.py b/dbf/ver_2.py
index 9b03c64..667080e 100644
--- a/dbf/ver_2.py
+++ b/dbf/ver_2.py
@@ -3219,7 +3219,7 @@ class _Db3Memo(_DbfMemo):
                 self.meta.mfd.write(pack_long_int(1) + '\x00' * 508)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     next = self.meta.mfd.read(4)
                     self.nextmemo = unpack_long_int(next)
@@ -3296,7 +3296,7 @@ class _VfpMemo(_DbfMemo):
                         pack_short_int(self.meta.memo_size, bigendian=True) + '\x00' * 504)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     header = self.meta.mfd.read(512)
                     self.nextmemo = unpack_long_int(header[:4], bigendian=True)
@@ -4785,7 +4785,7 @@ class Table(_Navigation):
             self.add_fields(field_specs)
         else:
             try:
-                dfd = meta.dfd = open(meta.filename, 'r+b')
+                dfd = meta.dfd = open(meta.filename, 'rb')
             except IOError:
                 e= sys.exc_info()[1]
                 raise DbfError(str(e))
@@ -5425,7 +5425,7 @@ class Table(_Navigation):
             return self
         if '_table' in dir(self):
             del self._table
-        dfd = meta.dfd = open(meta.filename, 'r+b')
+        dfd = meta.dfd = open(meta.filename, 'rb')
         dfd.seek(0)
         header = meta.header = self._TableHeader(dfd.read(32), self._pack_date, self._unpack_date)
         if not header.version in self._supported_tables:
diff --git a/dbf/ver_32.py b/dbf/ver_32.py
index c5fc698..b71c570 100644
--- a/dbf/ver_32.py
+++ b/dbf/ver_32.py
@@ -3170,7 +3170,7 @@ class _Db3Memo(_DbfMemo):
                 self.meta.mfd.write(pack_long_int(1) + b'\x00' * 508)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     next = self.meta.mfd.read(4)
                     self.nextmemo = unpack_long_int(next)
@@ -3247,7 +3247,7 @@ class _VfpMemo(_DbfMemo):
                         pack_short_int(self.meta.memo_size, bigendian=True) + b'\x00' * 504)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     header = self.meta.mfd.read(512)
                     self.nextmemo = unpack_long_int(header[:4], bigendian=True)
@@ -4760,7 +4760,7 @@ class Table(_Navigation):
             self.add_fields(field_specs)
         else:
             try:
-                dfd = meta.dfd = open(meta.filename, 'r+b')
+                dfd = meta.dfd = open(meta.filename, 'rb')
             except IOError:
                 e= sys.exc_info()[1]
                 raise DbfError(str(e))
@@ -5400,7 +5400,7 @@ class Table(_Navigation):
             return self
         if '_table' in dir(self):
             del self._table
-        dfd = meta.dfd = open(meta.filename, 'r+b')
+        dfd = meta.dfd = open(meta.filename, 'rb')
         dfd.seek(0)
         header = meta.header = self._TableHeader(dfd.read(32), self._pack_date, self._unpack_date)
         if not header.version in self._supported_tables:
diff --git a/dbf/ver_33.py b/dbf/ver_33.py
index f687c03..bd93b10 100644
--- a/dbf/ver_33.py
+++ b/dbf/ver_33.py
@@ -3170,7 +3170,7 @@ class _Db3Memo(_DbfMemo):
                 self.meta.mfd.write(pack_long_int(1) + b'\x00' * 508)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     next = self.meta.mfd.read(4)
                     self.nextmemo = unpack_long_int(next)
@@ -3247,7 +3247,7 @@ class _VfpMemo(_DbfMemo):
                         pack_short_int(self.meta.memo_size, bigendian=True) + b'\x00' * 504)
             else:
                 try:
-                    self.meta.mfd = open(self.meta.memoname, 'r+b')
+                    self.meta.mfd = open(self.meta.memoname, 'rb')
                     self.meta.mfd.seek(0)
                     header = self.meta.mfd.read(512)
                     self.nextmemo = unpack_long_int(header[:4], bigendian=True)
@@ -4760,7 +4760,7 @@ class Table(_Navigation):
             self.add_fields(field_specs)
         else:
             try:
-                dfd = meta.dfd = open(meta.filename, 'r+b')
+                dfd = meta.dfd = open(meta.filename, 'rb')
             except IOError:
                 e= sys.exc_info()[1]
                 raise DbfError(str(e)) from None
@@ -5400,7 +5400,7 @@ class Table(_Navigation):
             return self
         if '_table' in dir(self):
             del self._table
-        dfd = meta.dfd = open(meta.filename, 'r+b')
+        dfd = meta.dfd = open(meta.filename, 'rb')
         dfd.seek(0)
         header = meta.header = self._TableHeader(dfd.read(32), self._pack_date, self._unpack_date)
         if not header.version in self._supported_tables:
-- 
2.11.0

Attachment: signature.asc
Description: PGP signature

Reply via email to