Files
zeekay eb74c996a6 rename: this fork is ours — datastore_driver
Imports read `datastore_driver`, distribution `datastore-driver`, so nothing has to
import another product's name to talk to Hanzo Datastore.

Cut from upstream 0.2.9 — the version this stack already ran — rather than from
upstream HEAD, so it is a PURE RENAME with no behaviour change. Forking from
HEAD would have dragged versions along with the name (connect alone jumped
0.8.17 -> 1.6.0, a major), which is a different and much riskier change wearing
a rename's clothes.

X-ClickHouse-* headers are untouched: they are wire protocol the server sends
and expects, and a different token shape from the module name.
2026-07-26 11:01:28 -07:00

38 lines
1.1 KiB
Python

from .base import Column
from .stringcolumn import String
from ..reader import read_binary_uint8, read_binary_str
from ..util.compat import json
from ..writer import write_binary_uint8
class JsonColumn(Column):
py_types = (dict, )
# No NULL value actually
null_value = {}
def __init__(self, column_by_spec_getter, **kwargs):
self.column_by_spec_getter = column_by_spec_getter
self.string_column = String(**kwargs)
super(JsonColumn, self).__init__(**kwargs)
def write_state_prefix(self, buf):
# Read in binary format.
# Write in text format.
write_binary_uint8(1, buf)
def read_items(self, n_items, buf):
read_binary_uint8(buf)
spec = read_binary_str(buf)
col = self.column_by_spec_getter(spec)
col.read_state_prefix(buf)
return col.read_data(n_items, buf)
def write_items(self, items, buf):
items = [x if isinstance(x, str) else json.dumps(x) for x in items]
self.string_column.write_items(items, buf)
def create_json_column(spec, column_by_spec_getter, column_options):
return JsonColumn(column_by_spec_getter, **column_options)