+@dataclass()
+class RevDataBase():
+    revid: int 
+    date_time: datetime
+    articleid: int
+    editorid: int
+    title: str
+    namespace: int
+    deleted: bool
+    text_chars: int = None
+    revert: bool = None
+    reverteds: list[int] = None
+    sha1: str = None
+    minor: bool = None
+    editor: str = None
+    anon: bool = None
+
+    urlencode = False
+    pa_schema_fields = [
+        pa.field("revid", pa.int64()),
+        pa.field("date_time",pa.timestamp('ms')),
+        pa.field("articleid",pa.int64()),
+        pa.field("editorid",pa.int64()),
+        pa.field("title",pa.string()),
+        pa.field("namespace",pa.int32()),
+        pa.field("deleted",pa.bool_()),
+        pa.field("test_chars",pa.int32()),
+        pa.field("revert",pa.bool_()),
+        pa.field("reverteds",pa.list_(pa.int64())),
+        pa.field("sha1",pa.string()),
+        pa.field("minor",pa.bool_()),
+        pa.field("editor",pa.string()),
+        pa.field("anon",pa.bool_())
+    ]
+
+    def to_pyarrow(self):
+        return dc.astuple(self)
+
+    def to_tsv_row(self):
+        
+        row = []
+        for f in dc.fields(self):
+            val = getattr(self, f.name)
+            if getattr(self, f.name) is None:
+                row.append("")
+            elif f.type == bool:
+                row.append("TRUE" if val else "FALSE")
+
+            elif f.type == datetime:
+                row.append(val.strftime('%Y-%m-%d %H:%M:%S'))
+
+            elif f.name in {'editor','title'}:
+                s = '"' + val + '"'
+                if self.urlencode and f.name in TO_ENCODE:
+                    row.append(quote(str(s)))
+                else:
+                    row.append(s)
+
+            elif f.type == list[int]:
+                row.append('"' + ",".join([str(x) for x in val]) + '"')