|
1 | 1 | import pyarrow as pa
|
2 | 2 | import structlog
|
3 | 3 |
|
| 4 | +from typing import Generator |
4 | 5 | from cloudquery.plugin_v3 import plugin_pb2, plugin_pb2_grpc, arrow
|
5 |
| -from cloudquery.sdk.message import SyncInsertMessage, SyncMigrateTableMessage |
| 6 | +from cloudquery.sdk.message import ( |
| 7 | + SyncInsertMessage, |
| 8 | + SyncMigrateTableMessage, |
| 9 | + WriteInsertMessage, |
| 10 | + WriteMigrateTableMessage, |
| 11 | + WriteMessage, |
| 12 | + WriteDeleteStale, |
| 13 | +) |
6 | 14 | from cloudquery.sdk.plugin.plugin import Plugin, SyncOptions, TableOptions
|
7 |
| -from cloudquery.sdk.schema import tables_to_arrow_schemas |
| 15 | +from cloudquery.sdk.schema import tables_to_arrow_schemas, Table |
8 | 16 |
|
9 | 17 |
|
10 | 18 | class PluginServicer(plugin_pb2_grpc.PluginServicer):
|
@@ -64,8 +72,34 @@ def Sync(self, request, context):
|
64 | 72 | def Read(self, request, context):
|
65 | 73 | raise NotImplementedError()
|
66 | 74 |
|
67 |
| - def Write(self, request_iterator, context): |
68 |
| - raise NotImplementedError() |
| 75 | + def Write( |
| 76 | + self, request_iterator: Generator[plugin_pb2.Write.Request, None, None], context |
| 77 | + ): |
| 78 | + def msg_iterator() -> Generator[WriteMessage, None, None]: |
| 79 | + for msg in request_iterator: |
| 80 | + field = msg.WhichOneof("message") |
| 81 | + if field == "migrate_table": |
| 82 | + sc = arrow.new_schema_from_bytes(msg.migrate_table.table) |
| 83 | + table = Table.from_arrow_schema(sc) |
| 84 | + yield WriteMigrateTableMessage(table=table) |
| 85 | + elif field == "insert": |
| 86 | + yield WriteInsertMessage( |
| 87 | + record=arrow.new_record_from_bytes(msg.insert.record) |
| 88 | + ) |
| 89 | + elif field == "delete": |
| 90 | + yield WriteDeleteStale( |
| 91 | + table_name=msg.delete.table_name, |
| 92 | + source_name=msg.delete.source_name, |
| 93 | + sync_time=msg.delete.sync_time.ToDatetime(), |
| 94 | + ) |
| 95 | + elif field is None: |
| 96 | + continue |
| 97 | + else: |
| 98 | + raise NotImplementedError(f"unknown write message type {field}") |
| 99 | + |
| 100 | + self._plugin.write(msg_iterator()) |
| 101 | + return plugin_pb2.Write.Response() |
69 | 102 |
|
70 | 103 | def Close(self, request, context):
|
| 104 | + self._plugin.close() |
71 | 105 | return plugin_pb2.Close.Response()
|
0 commit comments