clickhouse-driver 0.2.8__cp312-cp312-musllinux_1_1_s390x.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. clickhouse_driver/__init__.py +9 -0
  2. clickhouse_driver/block.py +227 -0
  3. clickhouse_driver/blockstreamprofileinfo.py +22 -0
  4. clickhouse_driver/bufferedreader.cpython-312-s390x-linux-musl.so +0 -0
  5. clickhouse_driver/bufferedwriter.cpython-312-s390x-linux-musl.so +0 -0
  6. clickhouse_driver/client.py +896 -0
  7. clickhouse_driver/clientinfo.py +119 -0
  8. clickhouse_driver/columns/__init__.py +0 -0
  9. clickhouse_driver/columns/arraycolumn.py +161 -0
  10. clickhouse_driver/columns/base.py +221 -0
  11. clickhouse_driver/columns/boolcolumn.py +7 -0
  12. clickhouse_driver/columns/datecolumn.py +108 -0
  13. clickhouse_driver/columns/datetimecolumn.py +202 -0
  14. clickhouse_driver/columns/decimalcolumn.py +116 -0
  15. clickhouse_driver/columns/enumcolumn.py +119 -0
  16. clickhouse_driver/columns/exceptions.py +12 -0
  17. clickhouse_driver/columns/floatcolumn.py +34 -0
  18. clickhouse_driver/columns/intcolumn.py +157 -0
  19. clickhouse_driver/columns/intervalcolumn.py +33 -0
  20. clickhouse_driver/columns/ipcolumn.py +118 -0
  21. clickhouse_driver/columns/jsoncolumn.py +37 -0
  22. clickhouse_driver/columns/largeint.cpython-312-s390x-linux-musl.so +0 -0
  23. clickhouse_driver/columns/lowcardinalitycolumn.py +142 -0
  24. clickhouse_driver/columns/mapcolumn.py +73 -0
  25. clickhouse_driver/columns/nestedcolumn.py +10 -0
  26. clickhouse_driver/columns/nothingcolumn.py +13 -0
  27. clickhouse_driver/columns/nullablecolumn.py +7 -0
  28. clickhouse_driver/columns/nullcolumn.py +15 -0
  29. clickhouse_driver/columns/numpy/__init__.py +0 -0
  30. clickhouse_driver/columns/numpy/base.py +47 -0
  31. clickhouse_driver/columns/numpy/boolcolumn.py +8 -0
  32. clickhouse_driver/columns/numpy/datecolumn.py +19 -0
  33. clickhouse_driver/columns/numpy/datetimecolumn.py +143 -0
  34. clickhouse_driver/columns/numpy/floatcolumn.py +24 -0
  35. clickhouse_driver/columns/numpy/intcolumn.py +43 -0
  36. clickhouse_driver/columns/numpy/lowcardinalitycolumn.py +96 -0
  37. clickhouse_driver/columns/numpy/service.py +58 -0
  38. clickhouse_driver/columns/numpy/stringcolumn.py +78 -0
  39. clickhouse_driver/columns/numpy/tuplecolumn.py +37 -0
  40. clickhouse_driver/columns/service.py +185 -0
  41. clickhouse_driver/columns/simpleaggregatefunctioncolumn.py +7 -0
  42. clickhouse_driver/columns/stringcolumn.py +73 -0
  43. clickhouse_driver/columns/tuplecolumn.py +63 -0
  44. clickhouse_driver/columns/util.py +60 -0
  45. clickhouse_driver/columns/uuidcolumn.py +64 -0
  46. clickhouse_driver/compression/__init__.py +28 -0
  47. clickhouse_driver/compression/base.py +87 -0
  48. clickhouse_driver/compression/lz4.py +21 -0
  49. clickhouse_driver/compression/lz4hc.py +9 -0
  50. clickhouse_driver/compression/zstd.py +20 -0
  51. clickhouse_driver/connection.py +784 -0
  52. clickhouse_driver/context.py +36 -0
  53. clickhouse_driver/dbapi/__init__.py +62 -0
  54. clickhouse_driver/dbapi/connection.py +99 -0
  55. clickhouse_driver/dbapi/cursor.py +370 -0
  56. clickhouse_driver/dbapi/errors.py +40 -0
  57. clickhouse_driver/dbapi/extras.py +73 -0
  58. clickhouse_driver/defines.py +55 -0
  59. clickhouse_driver/errors.py +453 -0
  60. clickhouse_driver/log.py +48 -0
  61. clickhouse_driver/numpy/__init__.py +0 -0
  62. clickhouse_driver/numpy/block.py +8 -0
  63. clickhouse_driver/numpy/helpers.py +25 -0
  64. clickhouse_driver/numpy/result.py +123 -0
  65. clickhouse_driver/opentelemetry.py +43 -0
  66. clickhouse_driver/progress.py +38 -0
  67. clickhouse_driver/protocol.py +114 -0
  68. clickhouse_driver/queryprocessingstage.py +8 -0
  69. clickhouse_driver/reader.py +69 -0
  70. clickhouse_driver/readhelpers.py +26 -0
  71. clickhouse_driver/result.py +144 -0
  72. clickhouse_driver/settings/__init__.py +0 -0
  73. clickhouse_driver/settings/available.py +405 -0
  74. clickhouse_driver/settings/types.py +50 -0
  75. clickhouse_driver/settings/writer.py +34 -0
  76. clickhouse_driver/streams/__init__.py +0 -0
  77. clickhouse_driver/streams/compressed.py +88 -0
  78. clickhouse_driver/streams/native.py +102 -0
  79. clickhouse_driver/util/__init__.py +0 -0
  80. clickhouse_driver/util/compat.py +39 -0
  81. clickhouse_driver/util/escape.py +94 -0
  82. clickhouse_driver/util/helpers.py +57 -0
  83. clickhouse_driver/varint.cpython-312-s390x-linux-musl.so +0 -0
  84. clickhouse_driver/writer.py +67 -0
  85. clickhouse_driver-0.2.8.dist-info/LICENSE +21 -0
  86. clickhouse_driver-0.2.8.dist-info/METADATA +201 -0
  87. clickhouse_driver-0.2.8.dist-info/RECORD +89 -0
  88. clickhouse_driver-0.2.8.dist-info/WHEEL +5 -0
  89. clickhouse_driver-0.2.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,202 @@
1
+ from datetime import datetime
2
+
3
+ from pytz import timezone as get_timezone, utc
4
+ from ..util.compat import get_localzone_name_compat
5
+ from .base import FormatColumn
6
+
7
+ EPOCH = datetime(1970, 1, 1, tzinfo=utc)
8
+
9
+
10
+ class DateTimeColumn(FormatColumn):
11
+ ch_type = 'DateTime'
12
+ py_types = (datetime, int)
13
+ format = 'I'
14
+
15
+ def __init__(self, timezone=None, offset_naive=True, **kwargs):
16
+ self.timezone = timezone
17
+ self.offset_naive = offset_naive
18
+ super(DateTimeColumn, self).__init__(**kwargs)
19
+
20
+ def after_read_items(self, items, nulls_map=None):
21
+ tz = self.timezone
22
+ fromts = datetime.fromtimestamp
23
+
24
+ # A bit ugly copy-paste. But it helps save time on items
25
+ # processing by avoiding lambda calls or if in loop.
26
+ if self.offset_naive:
27
+ if tz:
28
+ if nulls_map is None:
29
+ return tuple(
30
+ fromts(item, tz).replace(tzinfo=None)
31
+ for item in items
32
+ )
33
+ else:
34
+ return tuple(
35
+ (None if is_null else
36
+ fromts(items[i], tz).replace(tzinfo=None))
37
+ for i, is_null in enumerate(nulls_map)
38
+ )
39
+ else:
40
+ if nulls_map is None:
41
+ return tuple(fromts(item) for item in items)
42
+ else:
43
+ return tuple(
44
+ (None if is_null else fromts(items[i]))
45
+ for i, is_null in enumerate(nulls_map)
46
+ )
47
+
48
+ else:
49
+ if nulls_map is None:
50
+ return tuple(fromts(item, tz) for item in items)
51
+ else:
52
+ return tuple(
53
+ (None if is_null else fromts(items[i], tz))
54
+ for i, is_null in enumerate(nulls_map)
55
+ )
56
+
57
+ def before_write_items(self, items, nulls_map=None):
58
+ timezone = self.timezone
59
+ null_value = self.null_value
60
+ to_timestamp = datetime.timestamp
61
+
62
+ for i, item in enumerate(items):
63
+ if nulls_map and nulls_map[i]:
64
+ items[i] = null_value
65
+ continue
66
+
67
+ if isinstance(item, int):
68
+ # support supplying raw integers to avoid
69
+ # costly timezone conversions when using datetime
70
+ continue
71
+
72
+ if timezone:
73
+ # Set server's timezone for offset-naive datetime.
74
+ if item.tzinfo is None:
75
+ item = timezone.localize(item)
76
+
77
+ item = item.astimezone(utc)
78
+
79
+ else:
80
+ # If datetime is offset-aware use it's timezone.
81
+ if item.tzinfo is not None:
82
+ item = item.astimezone(utc)
83
+
84
+ items[i] = int(to_timestamp(item))
85
+
86
+
87
+ class DateTime64Column(DateTimeColumn):
88
+ ch_type = 'DateTime64'
89
+ format = 'q'
90
+
91
+ max_scale = 6
92
+
93
+ def __init__(self, scale=0, **kwargs):
94
+ self.scale = scale
95
+ super(DateTime64Column, self).__init__(**kwargs)
96
+
97
+ def after_read_items(self, items, nulls_map=None):
98
+ scale = float(10 ** self.scale)
99
+
100
+ tz = self.timezone
101
+ fromts = datetime.fromtimestamp
102
+
103
+ # A bit ugly copy-paste. But it helps save time on items
104
+ # processing by avoiding lambda calls or if in loop.
105
+ if self.offset_naive:
106
+ if tz:
107
+ if nulls_map is None:
108
+ return tuple(
109
+ fromts(item / scale, tz).replace(tzinfo=None)
110
+ for item in items
111
+ )
112
+ else:
113
+ return tuple(
114
+ (None if is_null else
115
+ fromts(items[i] / scale, tz).replace(tzinfo=None))
116
+ for i, is_null in enumerate(nulls_map)
117
+ )
118
+ else:
119
+ if nulls_map is None:
120
+ return tuple(fromts(item / scale) for item in items)
121
+ else:
122
+ return tuple(
123
+ (None if is_null else fromts(items[i] / scale))
124
+ for i, is_null in enumerate(nulls_map)
125
+ )
126
+
127
+ else:
128
+ if nulls_map is None:
129
+ return tuple(fromts(item / scale, tz) for item in items)
130
+ else:
131
+ return tuple(
132
+ (None if is_null else fromts(items[i] / scale, tz))
133
+ for i, is_null in enumerate(nulls_map)
134
+ )
135
+
136
+ def before_write_items(self, items, nulls_map=None):
137
+ scale = 10 ** self.scale
138
+ frac_scale = 10 ** (self.max_scale - self.scale)
139
+
140
+ timezone = self.timezone
141
+ null_value = self.null_value
142
+ to_timestamp = datetime.timestamp
143
+
144
+ for i, item in enumerate(items):
145
+ if nulls_map and nulls_map[i]:
146
+ items[i] = null_value
147
+ continue
148
+
149
+ if isinstance(item, int):
150
+ # support supplying raw integers to avoid
151
+ # costly timezone conversions when using datetime
152
+ continue
153
+
154
+ if timezone:
155
+ # Set server's timezone for offset-naive datetime.
156
+ if item.tzinfo is None:
157
+ item = timezone.localize(item)
158
+
159
+ item = item.astimezone(utc)
160
+
161
+ else:
162
+ # If datetime is offset-aware use it's timezone.
163
+ if item.tzinfo is not None:
164
+ item = item.astimezone(utc)
165
+
166
+ items[i] = (
167
+ int(to_timestamp(item)) * scale +
168
+ int(item.microsecond / frac_scale)
169
+ )
170
+
171
+
172
+ def create_datetime_column(spec, column_options):
173
+ if spec.startswith('DateTime64'):
174
+ cls = DateTime64Column
175
+ spec = spec[11:-1]
176
+ params = spec.split(',', 1)
177
+ column_options['scale'] = int(params[0])
178
+ if len(params) > 1:
179
+ spec = params[1].strip() + ')'
180
+ else:
181
+ cls = DateTimeColumn
182
+ spec = spec[9:]
183
+
184
+ context = column_options['context']
185
+
186
+ tz_name = timezone = None
187
+ offset_naive = True
188
+
189
+ # Use column's timezone if it's specified.
190
+ if spec and spec[-1] == ')':
191
+ tz_name = spec[1:-2]
192
+ offset_naive = False
193
+ else:
194
+ if not context.settings.get('use_client_time_zone', False):
195
+ local_timezone = get_localzone_name_compat()
196
+ if local_timezone != context.server_info.timezone:
197
+ tz_name = context.server_info.timezone
198
+
199
+ if tz_name:
200
+ timezone = get_timezone(tz_name)
201
+
202
+ return cls(timezone=timezone, offset_naive=offset_naive, **column_options)
@@ -0,0 +1,116 @@
1
+ from decimal import Decimal, localcontext
2
+
3
+ from .base import FormatColumn
4
+ from .exceptions import ColumnTypeMismatchException
5
+ from .intcolumn import Int128Column, Int256Column
6
+
7
+
8
+ class DecimalColumn(FormatColumn):
9
+ py_types = (Decimal, float, int)
10
+ max_precision = None
11
+
12
+ def __init__(self, precision, scale, types_check=False, **kwargs):
13
+ self.precision = precision
14
+ self.scale = scale
15
+ super(DecimalColumn, self).__init__(**kwargs)
16
+
17
+ if types_check:
18
+ def check_item(value):
19
+ parts = str(value).split('.')
20
+ int_part = parts[0]
21
+
22
+ if len(int_part) > precision:
23
+ raise ColumnTypeMismatchException(value)
24
+
25
+ self.check_item = check_item
26
+
27
+ def after_read_items(self, items, nulls_map=None):
28
+ if self.scale >= 1:
29
+ scale = 10 ** self.scale
30
+
31
+ if nulls_map is None:
32
+ return tuple(Decimal(item) / scale for item in items)
33
+ else:
34
+ return tuple(
35
+ (None if is_null else Decimal(items[i]) / scale)
36
+ for i, is_null in enumerate(nulls_map)
37
+ )
38
+ else:
39
+ if nulls_map is None:
40
+ return tuple(Decimal(item) for item in items)
41
+ else:
42
+ return tuple(
43
+ (None if is_null else Decimal(items[i]))
44
+ for i, is_null in enumerate(nulls_map)
45
+ )
46
+
47
+ def before_write_items(self, items, nulls_map=None):
48
+ null_value = self.null_value
49
+
50
+ if self.scale >= 1:
51
+ scale = 10 ** self.scale
52
+
53
+ for i, item in enumerate(items):
54
+ if nulls_map and nulls_map[i]:
55
+ items[i] = null_value
56
+ else:
57
+ items[i] = int(Decimal(str(item)) * scale)
58
+
59
+ else:
60
+ for i, item in enumerate(items):
61
+ if nulls_map and nulls_map[i]:
62
+ items[i] = null_value
63
+ else:
64
+ items[i] = int(Decimal(str(item)))
65
+
66
+ # Override default precision to the maximum supported by underlying type.
67
+ def _write_data(self, items, buf):
68
+ with localcontext() as ctx:
69
+ ctx.prec = self.max_precision
70
+ super(DecimalColumn, self)._write_data(items, buf)
71
+
72
+ def _read_data(self, n_items, buf, nulls_map=None):
73
+ with localcontext() as ctx:
74
+ ctx.prec = self.max_precision
75
+ return super(DecimalColumn, self)._read_data(
76
+ n_items, buf, nulls_map=nulls_map
77
+ )
78
+
79
+
80
+ class Decimal32Column(DecimalColumn):
81
+ format = 'i'
82
+ max_precision = 9
83
+
84
+
85
+ class Decimal64Column(DecimalColumn):
86
+ format = 'q'
87
+ max_precision = 18
88
+
89
+
90
+ class Decimal128Column(DecimalColumn, Int128Column):
91
+ max_precision = 38
92
+
93
+
94
+ class Decimal256Column(DecimalColumn, Int256Column):
95
+ max_precision = 76
96
+
97
+
98
+ def create_decimal_column(spec, column_options):
99
+ precision, scale = spec[8:-1].split(',')
100
+ precision, scale = int(precision), int(scale)
101
+
102
+ # Maximum precisions for underlying types are:
103
+ # Int32 10**9
104
+ # Int64 10**18
105
+ # Int128 10**38
106
+ # Int256 10**76
107
+ if precision <= 9:
108
+ cls = Decimal32Column
109
+ elif precision <= 18:
110
+ cls = Decimal64Column
111
+ elif precision <= 38:
112
+ cls = Decimal128Column
113
+ else:
114
+ cls = Decimal256Column
115
+
116
+ return cls(precision, scale, **column_options)
@@ -0,0 +1,119 @@
1
+ from enum import Enum
2
+
3
+ from .. import errors
4
+ from .intcolumn import IntColumn
5
+
6
+
7
+ class EnumColumn(IntColumn):
8
+ py_types = (Enum, int, str)
9
+
10
+ def __init__(self, enum_cls, **kwargs):
11
+ self.enum_cls = enum_cls
12
+ super(EnumColumn, self).__init__(**kwargs)
13
+
14
+ def before_write_items(self, items, nulls_map=None):
15
+ null_value = self.null_value
16
+
17
+ enum_cls = self.enum_cls
18
+
19
+ for i, item in enumerate(items):
20
+ if nulls_map and nulls_map[i]:
21
+ items[i] = null_value
22
+ continue
23
+
24
+ source_value = item.name if isinstance(item, Enum) else item
25
+
26
+ # Check real enum value
27
+ try:
28
+ if isinstance(source_value, str):
29
+ items[i] = enum_cls[source_value].value
30
+ else:
31
+ items[i] = enum_cls(source_value).value
32
+ except (ValueError, KeyError):
33
+ choices = ', '.join(
34
+ "'{}' = {}".format(x.name.replace("'", r"\'"), x.value)
35
+ for x in enum_cls
36
+ )
37
+ enum_str = '{}({})'.format(enum_cls.__name__, choices)
38
+
39
+ raise errors.LogicalError(
40
+ "Unknown element '{}' for type {}"
41
+ .format(source_value, enum_str)
42
+ )
43
+
44
+ def after_read_items(self, items, nulls_map=None):
45
+ enum_cls = self.enum_cls
46
+
47
+ if nulls_map is None:
48
+ return tuple(enum_cls(item).name for item in items)
49
+ else:
50
+ return tuple(
51
+ (None if is_null else enum_cls(items[i]).name)
52
+ for i, is_null in enumerate(nulls_map)
53
+ )
54
+
55
+
56
+ class Enum8Column(EnumColumn):
57
+ ch_type = 'Enum8'
58
+ format = 'b'
59
+ int_size = 1
60
+
61
+
62
+ class Enum16Column(EnumColumn):
63
+ ch_type = 'Enum16'
64
+ format = 'h'
65
+ int_size = 2
66
+
67
+
68
+ def create_enum_column(spec, column_options):
69
+ if spec.startswith('Enum8'):
70
+ params = spec[6:-1]
71
+ cls = Enum8Column
72
+ else:
73
+ params = spec[7:-1]
74
+ cls = Enum16Column
75
+
76
+ return cls(Enum(cls.ch_type, _parse_options(params)), **column_options)
77
+
78
+
79
+ def _parse_options(option_string):
80
+ options = dict()
81
+ after_name = False
82
+ escaped = False
83
+ quote_character = None
84
+ name = ''
85
+ value = ''
86
+
87
+ for ch in option_string:
88
+ if escaped:
89
+ name += ch
90
+ escaped = False # accepting escaped character
91
+
92
+ elif after_name:
93
+ if ch in (' ', '='):
94
+ pass
95
+ elif ch == ',':
96
+ options[name] = int(value)
97
+ after_name = False
98
+ name = ''
99
+ value = '' # reset before collecting new option
100
+ else:
101
+ value += ch
102
+
103
+ elif quote_character:
104
+ if ch == '\\':
105
+ escaped = True
106
+ elif ch == quote_character:
107
+ quote_character = None
108
+ after_name = True # start collecting option value
109
+ else:
110
+ name += ch
111
+
112
+ else:
113
+ if ch == "'":
114
+ quote_character = ch
115
+
116
+ if after_name:
117
+ options.setdefault(name, int(value)) # append word after last comma
118
+
119
+ return options
@@ -0,0 +1,12 @@
1
+
2
+
3
+ class ColumnException(Exception):
4
+ pass
5
+
6
+
7
+ class ColumnTypeMismatchException(ColumnException):
8
+ pass
9
+
10
+
11
+ class StructPackException(ColumnException):
12
+ pass
@@ -0,0 +1,34 @@
1
+ from ctypes import c_float
2
+
3
+ from .base import FormatColumn
4
+
5
+
6
+ class FloatColumn(FormatColumn):
7
+ py_types = (float, int)
8
+
9
+
10
+ class Float32Column(FloatColumn):
11
+ ch_type = 'Float32'
12
+ format = 'f'
13
+
14
+ def __init__(self, types_check=False, **kwargs):
15
+ super(Float32Column, self).__init__(types_check=types_check, **kwargs)
16
+
17
+ if types_check:
18
+ # Chop only bytes that fit current type.
19
+ # Cast to -nan or nan if overflows.
20
+ def before_write_items(items, nulls_map=None):
21
+ null_value = self.null_value
22
+
23
+ for i, item in enumerate(items):
24
+ if nulls_map and nulls_map[i]:
25
+ items[i] = null_value
26
+ else:
27
+ items[i] = c_float(item).value
28
+
29
+ self.before_write_items = before_write_items
30
+
31
+
32
+ class Float64Column(FloatColumn):
33
+ ch_type = 'Float64'
34
+ format = 'd'
@@ -0,0 +1,157 @@
1
+
2
+ from .exceptions import ColumnTypeMismatchException
3
+ from .base import FormatColumn
4
+ from .largeint import (
5
+ int128_from_quads, int128_to_quads, uint128_from_quads, uint128_to_quads,
6
+ int256_from_quads, int256_to_quads, uint256_from_quads, uint256_to_quads
7
+ )
8
+
9
+
10
+ class IntColumn(FormatColumn):
11
+ py_types = (int, )
12
+ int_size = None
13
+
14
+ def __init__(self, types_check=False, **kwargs):
15
+ super(IntColumn, self).__init__(types_check=types_check, **kwargs)
16
+
17
+ if types_check:
18
+ self.mask = (1 << 8 * self.int_size) - 1
19
+
20
+ # Chop only bytes that fit current type.
21
+ # ctypes.c_intXX is slower.
22
+ def before_write_items(items, nulls_map=None):
23
+ # TODO: cythonize
24
+ null_value = self.null_value
25
+
26
+ for i, item in enumerate(items):
27
+ if nulls_map and nulls_map[i]:
28
+ items[i] = null_value
29
+ continue
30
+
31
+ if item >= 0:
32
+ sign = 1
33
+ else:
34
+ sign = -1
35
+ item = -item
36
+
37
+ items[i] = sign * (item & self.mask)
38
+
39
+ self.before_write_items = before_write_items
40
+
41
+
42
+ class UIntColumn(IntColumn):
43
+ def __init__(self, types_check=False, **kwargs):
44
+ super(UIntColumn, self).__init__(types_check=types_check, **kwargs)
45
+
46
+ if types_check:
47
+ def check_item(value):
48
+ if value < 0:
49
+ raise ColumnTypeMismatchException(value)
50
+
51
+ self.check_item = check_item
52
+
53
+
54
+ class Int8Column(IntColumn):
55
+ ch_type = 'Int8'
56
+ format = 'b'
57
+ int_size = 1
58
+
59
+
60
+ class Int16Column(IntColumn):
61
+ ch_type = 'Int16'
62
+ format = 'h'
63
+ int_size = 2
64
+
65
+
66
+ class Int32Column(IntColumn):
67
+ ch_type = 'Int32'
68
+ format = 'i'
69
+ int_size = 4
70
+
71
+
72
+ class Int64Column(IntColumn):
73
+ ch_type = 'Int64'
74
+ format = 'q'
75
+ int_size = 8
76
+
77
+
78
+ class UInt8Column(UIntColumn):
79
+ ch_type = 'UInt8'
80
+ format = 'B'
81
+ int_size = 1
82
+
83
+
84
+ class UInt16Column(UIntColumn):
85
+ ch_type = 'UInt16'
86
+ format = 'H'
87
+ int_size = 2
88
+
89
+
90
+ class UInt32Column(UIntColumn):
91
+ ch_type = 'UInt32'
92
+ format = 'I'
93
+ int_size = 4
94
+
95
+
96
+ class UInt64Column(UIntColumn):
97
+ ch_type = 'UInt64'
98
+ format = 'Q'
99
+ int_size = 8
100
+
101
+
102
+ class LargeIntColumn(IntColumn):
103
+ format = 'Q' # We manually deal with sign in read/write.
104
+ factor = None
105
+
106
+ to_quads = None
107
+ from_quads = None
108
+
109
+ def write_items(self, items, buf):
110
+ n_items = len(items)
111
+
112
+ s = self.make_struct(self.factor * n_items)
113
+ uint_64_pairs = self.to_quads(items, n_items)
114
+
115
+ buf.write(s.pack(*uint_64_pairs))
116
+
117
+ def read_items(self, n_items, buf):
118
+ s = self.make_struct(self.factor * n_items)
119
+ items = s.unpack(buf.read(s.size))
120
+
121
+ return self.from_quads(items, n_items)
122
+
123
+
124
+ class Int128Column(LargeIntColumn):
125
+ ch_type = 'Int128'
126
+ int_size = 16
127
+ factor = 2
128
+
129
+ to_quads = int128_to_quads
130
+ from_quads = int128_from_quads
131
+
132
+
133
+ class UInt128Column(LargeIntColumn):
134
+ ch_type = 'UInt128'
135
+ int_size = 16
136
+ factor = 2
137
+
138
+ to_quads = uint128_to_quads
139
+ from_quads = uint128_from_quads
140
+
141
+
142
+ class Int256Column(LargeIntColumn):
143
+ ch_type = 'Int256'
144
+ int_size = 32
145
+ factor = 4
146
+
147
+ to_quads = int256_to_quads
148
+ from_quads = int256_from_quads
149
+
150
+
151
+ class UInt256Column(LargeIntColumn):
152
+ ch_type = 'UInt256'
153
+ int_size = 32
154
+ factor = 4
155
+
156
+ to_quads = uint256_to_quads
157
+ from_quads = uint256_from_quads
@@ -0,0 +1,33 @@
1
+ from .intcolumn import Int64Column
2
+
3
+
4
+ class IntervalColumn(Int64Column):
5
+ pass
6
+
7
+
8
+ class IntervalDayColumn(IntervalColumn):
9
+ ch_type = 'IntervalDay'
10
+
11
+
12
+ class IntervalWeekColumn(IntervalColumn):
13
+ ch_type = 'IntervalWeek'
14
+
15
+
16
+ class IntervalMonthColumn(IntervalColumn):
17
+ ch_type = 'IntervalMonth'
18
+
19
+
20
+ class IntervalYearColumn(IntervalColumn):
21
+ ch_type = 'IntervalYear'
22
+
23
+
24
+ class IntervalHourColumn(IntervalColumn):
25
+ ch_type = 'IntervalHour'
26
+
27
+
28
+ class IntervalMinuteColumn(IntervalColumn):
29
+ ch_type = 'IntervalMinute'
30
+
31
+
32
+ class IntervalSecondColumn(IntervalColumn):
33
+ ch_type = 'IntervalSecond'