Generated by Cython 0.29.28

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: ilp.c

+001: ################################################################################
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 002: ##     ___                  _   ____  ____
 003: ##    / _ \ _   _  ___  ___| |_|  _ \| __ )
 004: ##   | | | | | | |/ _ \/ __| __| | | |  _ \
 005: ##   | |_| | |_| |  __/\__ \ |_| |_| | |_) |
 006: ##    \__\_\\__,_|\___||___/\__|____/|____/
 007: ##
 008: ##  Copyright (c) 2014-2019 Appsicle
 009: ##  Copyright (c) 2019-2022 QuestDB
 010: ##
 011: ##  Licensed under the Apache License, Version 2.0 (the "License");
 012: ##  you may not use this file except in compliance with the License.
 013: ##  You may obtain a copy of the License at
 014: ##
 015: ##  http://www.apache.org/licenses/LICENSE-2.0
 016: ##
 017: ##  Unless required by applicable law or agreed to in writing, software
 018: ##  distributed under the License is distributed on an "AS IS" BASIS,
 019: ##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 020: ##  See the License for the specific language governing permissions and
 021: ##  limitations under the License.
 022: ##
 023: ################################################################################
 024: 
 025: # distutils: language=c
 026: # cython: language_level=3
 027: 
 028: from libc.stdint cimport uint8_t, int64_t
 029: from cpython.datetime cimport datetime
 030: from cpython.bool cimport bool, PyBool_Check
 031: 
 032: from .line_sender cimport *
 033: 
 034: cdef extern from "Python.h":
 035:     ctypedef uint8_t Py_UCS1  # unicodeobject.h
 036: 
 037:     ctypedef unsigned int uint
 038: 
 039:     cdef enum PyUnicode_Kind:
 040:         PyUnicode_1BYTE_KIND
 041:         PyUnicode_2BYTE_KIND
 042:         PyUnicode_4BYTE_KIND
 043: 
 044:     object PyUnicode_FromKindAndData(
 045:         int kind, const void* buffer, Py_ssize_t size)
 046: 
 047:     str PyUnicode_FromStringAndSize(
 048:         const char* u, Py_ssize_t size)
 049: 
 050:     # Must be called before accessing data or is compact check.
 051:     int PyUnicode_READY(object o) except -1
 052: 
 053:     # Is UCS1 and ascii (and therefore valid UTF-8).
 054:     bint PyUnicode_IS_COMPACT_ASCII(object o)
 055: 
 056:     # Get length.
 057:     Py_ssize_t PyUnicode_GET_LENGTH(object o)
 058: 
 059:     # Zero-copy access to buffer.
 060:     Py_UCS1* PyUnicode_1BYTE_DATA(object o)
 061: 
 062:     Py_ssize_t PyBytes_GET_SIZE(object o)
 063: 
 064:     char* PyBytes_AsString(object o)
 065: 
 066: 
+067: from enum import Enum
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Enum);
  __Pyx_GIVEREF(__pyx_n_s_Enum);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Enum);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_enum, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Enum); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Enum, __pyx_t_1) < 0) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+068: from typing import List, Tuple, Dict, Union, Any, Optional, Callable
  __pyx_t_2 = PyList_New(7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_List);
  __Pyx_GIVEREF(__pyx_n_s_List);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_List);
  __Pyx_INCREF(__pyx_n_s_Tuple);
  __Pyx_GIVEREF(__pyx_n_s_Tuple);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_Tuple);
  __Pyx_INCREF(__pyx_n_s_Dict);
  __Pyx_GIVEREF(__pyx_n_s_Dict);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_Dict);
  __Pyx_INCREF(__pyx_n_s_Union);
  __Pyx_GIVEREF(__pyx_n_s_Union);
  PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_Union);
  __Pyx_INCREF(__pyx_n_s_Any);
  __Pyx_GIVEREF(__pyx_n_s_Any);
  PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_Any);
  __Pyx_INCREF(__pyx_n_s_Optional);
  __Pyx_GIVEREF(__pyx_n_s_Optional);
  PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_Optional);
  __Pyx_INCREF(__pyx_n_s_Callable);
  __Pyx_GIVEREF(__pyx_n_s_Callable);
  PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_Callable);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_typing, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_List); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_List, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Tuple); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Tuple, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Dict); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Dict, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Union); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Union, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Any, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Optional); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Optional, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Callable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Callable, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+069: from collections.abc import Iterable
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Iterable);
  __Pyx_GIVEREF(__pyx_n_s_Iterable);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Iterable);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_collections_abc, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Iterable); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Iterable, __pyx_t_1) < 0) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 070: 
+071: import sys
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_sys, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_2) < 0) __PYX_ERR(0, 71, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 072: 
+073: class IlpErrorCode(Enum):
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_Enum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_Py3MetaclassPrepare(__pyx_t_2, __pyx_t_1, __pyx_n_s_IlpErrorCode, __pyx_n_s_IlpErrorCode, (PyObject *) NULL, __pyx_n_s_questdb_ilp, __pyx_kp_s_Category_of_Error); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
/* … */
  __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_2, __pyx_n_s_IlpErrorCode, __pyx_t_1, __pyx_t_3, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_IlpErrorCode, __pyx_t_4) < 0) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 074:     """Category of Error."""
+075:     CouldNotResolveAddr = line_sender_error_could_not_resolve_addr
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_could_not_resolve_addr); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_CouldNotResolveAddr, __pyx_t_4) < 0) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+076:     InvalidApiCall = line_sender_error_invalid_api_call
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_invalid_api_call); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 76, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_InvalidApiCall, __pyx_t_4) < 0) __PYX_ERR(0, 76, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+077:     SocketError = line_sender_error_socket_error
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_socket_error); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 77, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_SocketError, __pyx_t_4) < 0) __PYX_ERR(0, 77, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+078:     InvalidUtf8 = line_sender_error_invalid_utf8
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_invalid_utf8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 78, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_InvalidUtf8, __pyx_t_4) < 0) __PYX_ERR(0, 78, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+079:     InvalidName = line_sender_error_invalid_name
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_invalid_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 79, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_InvalidName, __pyx_t_4) < 0) __PYX_ERR(0, 79, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+080:     InvalidTimestamp = line_sender_error_invalid_timestamp
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_invalid_timestamp); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 80, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_InvalidTimestamp, __pyx_t_4) < 0) __PYX_ERR(0, 80, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+081:     AuthError = line_sender_error_auth_error
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_auth_error); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_AuthError, __pyx_t_4) < 0) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+082:     TlsError = line_sender_error_tls_error
  __pyx_t_4 = __Pyx_PyInt_From_enum__line_sender_error_code(line_sender_error_tls_error); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_TlsError, __pyx_t_4) < 0) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 083: 
+084:     def __str__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_12IlpErrorCode_1__str__(PyObject *__pyx_self, PyObject *__pyx_v_self); /*proto*/
static PyMethodDef __pyx_mdef_7questdb_3ilp_12IlpErrorCode_1__str__ = {"__str__", (PyCFunction)__pyx_pw_7questdb_3ilp_12IlpErrorCode_1__str__, METH_O, 0};
static PyObject *__pyx_pw_7questdb_3ilp_12IlpErrorCode_1__str__(PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_12IlpErrorCode___str__(__pyx_self, ((PyObject *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_12IlpErrorCode___str__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.IlpErrorCode.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 84, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_7questdb_3ilp_12IlpErrorCode_1__str__, 0, __pyx_n_s_IlpErrorCode___str, NULL, __pyx_n_s_questdb_ilp, __pyx_d, ((PyObject *)__pyx_codeobj__17)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 84, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_str_2, __pyx_t_4) < 0) __PYX_ERR(0, 84, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_questdb_ilp_pyx, __pyx_n_s_str_2, 84, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(0, 84, __pyx_L1_error)
+085:         return self.name
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 086: 
 087: 
+088: class IlpError(Exception):
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
  __Pyx_GIVEREF(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
  __pyx_t_2 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_Py3MetaclassPrepare(__pyx_t_2, __pyx_t_1, __pyx_n_s_IlpError, __pyx_n_s_IlpError, (PyObject *) NULL, __pyx_n_s_questdb_ilp, __pyx_kp_s_An_error_whilst_using_the_line); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
/* … */
  __pyx_t_5 = __Pyx_Py3ClassCreate(__pyx_t_2, __pyx_n_s_IlpError, __pyx_t_1, __pyx_t_3, NULL, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__Pyx_CyFunction_InitClassCell(__pyx_t_4, __pyx_t_5) < 0) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_IlpError, __pyx_t_5) < 0) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 089:     """
 090:     An error whilst using the line sender or constructing its buffer.
 091:     """
+092:     def __init__(self, code, msg):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_8IlpError_1__init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_7questdb_3ilp_8IlpError_1__init__ = {"__init__", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7questdb_3ilp_8IlpError_1__init__, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_7questdb_3ilp_8IlpError_1__init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_code = 0;
  PyObject *__pyx_v_msg = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_code,&__pyx_n_s_msg,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_code)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 1); __PYX_ERR(0, 92, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_msg)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 2); __PYX_ERR(0, 92, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 92, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_self = values[0];
    __pyx_v_code = values[1];
    __pyx_v_msg = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 92, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.IlpError.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_8IlpError___init__(__pyx_self, __pyx_v_self, __pyx_v_code, __pyx_v_msg);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_8IlpError___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_msg) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("questdb.ilp.IlpError.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__18 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_code, __pyx_n_s_msg); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 92, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);
/* … */
  __pyx_t_5 = __Pyx_CyFunction_New(&__pyx_mdef_7questdb_3ilp_8IlpError_1__init__, 0, __pyx_n_s_IlpError___init, NULL, __pyx_n_s_questdb_ilp, __pyx_d, ((PyObject *)__pyx_codeobj__19)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 92, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(__pyx_t_5);
  PyList_Append(__pyx_t_4, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_init, __pyx_t_5) < 0) __PYX_ERR(0, 92, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_questdb_ilp_pyx, __pyx_n_s_init, 92, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 92, __pyx_L1_error)
+093:         super().__init__(msg)
  __pyx_t_2 = __Pyx_CyFunction_GetClassObj(__pyx_self);
  if (!__pyx_t_2) { PyErr_SetString(PyExc_SystemError, "super(): empty __class__ cell"); __PYX_ERR(0, 93, __pyx_L1_error) }
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_INCREF(__pyx_v_self);
  __Pyx_GIVEREF(__pyx_v_self);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 93, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_init); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_msg) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_msg);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+094:         self._code = code
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_code_2, __pyx_v_code) < 0) __PYX_ERR(0, 94, __pyx_L1_error)
 095: 
+096:     @property
  __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_property, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 96, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  if (__Pyx_SetNameInClass(__pyx_t_3, __pyx_n_s_code, __pyx_t_5) < 0) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+097:     def code(self) -> IlpErrorCode:
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_8IlpError_3code(PyObject *__pyx_self, PyObject *__pyx_v_self); /*proto*/
static PyMethodDef __pyx_mdef_7questdb_3ilp_8IlpError_3code = {"code", (PyCFunction)__pyx_pw_7questdb_3ilp_8IlpError_3code, METH_O, 0};
static PyObject *__pyx_pw_7questdb_3ilp_8IlpError_3code(PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("code (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_8IlpError_2code(__pyx_self, ((PyObject *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_8IlpError_2code(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("code", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.IlpError.code", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);
/* … */
  __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_return, __pyx_t_6) < 0) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7questdb_3ilp_8IlpError_3code, 0, __pyx_n_s_IlpError_code, NULL, __pyx_n_s_questdb_ilp, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_6, __pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+098:         return self._code
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_code_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 099: 
 100: 
+101: cdef inline object c_err_code_to_py(line_sender_error_code code):
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_c_err_code_to_py(enum line_sender_error_code __pyx_v_code) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("c_err_code_to_py", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.c_err_code_to_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+102:     if code == line_sender_error_could_not_resolve_addr:
  switch (__pyx_v_code) {
    case line_sender_error_could_not_resolve_addr:
/* … */
    break;
    case line_sender_error_invalid_api_call:
+103:         return IlpErrorCode.CouldNotResolveAddr
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CouldNotResolveAddr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 103, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+104:     elif code == line_sender_error_invalid_api_call:
    break;
    case line_sender_error_socket_error:
+105:         return IlpErrorCode.InvalidApiCall
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 105, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_InvalidApiCall); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 105, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
+106:     elif code == line_sender_error_socket_error:
    break;
    case line_sender_error_invalid_utf8:
+107:         return IlpErrorCode.SocketError
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SocketError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+108:     elif code == line_sender_error_invalid_utf8:
    break;
    case line_sender_error_invalid_name:
+109:         return IlpErrorCode.InvalidUtf8
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_InvalidUtf8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 109, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
+110:     elif code == line_sender_error_invalid_name:
    break;
    case line_sender_error_invalid_timestamp:
+111:         return IlpErrorCode.InvalidName
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_InvalidName); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+112:     elif code == line_sender_error_invalid_timestamp:
    break;
    case line_sender_error_auth_error:
+113:         return IlpErrorCode.InvalidTimestamp
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_InvalidTimestamp); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 113, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
+114:     elif code == line_sender_error_auth_error:
    break;
    case line_sender_error_tls_error:
+115:         return IlpErrorCode.AuthError
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AuthError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+116:     elif code == line_sender_error_tls_error:
    break;
    default:
+117:         return IlpErrorCode.TlsError
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_TlsError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 118:     else:
+119:         raise ValueError('Internal error converting error code.')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 119, __pyx_L1_error)
    break;
  }
/* … */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Internal_error_converting_error); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 119, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
 120: 
 121: 
+122: cdef inline object c_err_to_py(line_sender_error* err):
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_c_err_to_py(struct line_sender_error *__pyx_v_err) {
  enum line_sender_error_code __pyx_v_code;
  size_t __pyx_v_c_len;
  char const *__pyx_v_c_msg;
  PyObject *__pyx_v_py_msg = 0;
  PyObject *__pyx_v_py_code = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("c_err_to_py", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("questdb.ilp.c_err_to_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_py_msg);
  __Pyx_XDECREF(__pyx_v_py_code);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 123:     """Construct a ``SenderError`` from a C error, which will also be freed."""
+124:     cdef line_sender_error_code code = line_sender_error_get_code(err)
  __pyx_v_code = line_sender_error_get_code(__pyx_v_err);
+125:     cdef size_t c_len = 0
  __pyx_v_c_len = 0;
+126:     cdef const char* c_msg = line_sender_error_msg(err, &c_len)
  __pyx_v_c_msg = line_sender_error_msg(__pyx_v_err, (&__pyx_v_c_len));
 127:     cdef object py_err
 128:     cdef object py_msg
 129:     cdef object py_code
+130:     try:
  /*try:*/ {
+131:         py_code = c_err_code_to_py(code)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_code_to_py(__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_py_code = __pyx_t_1;
    __pyx_t_1 = 0;
+132:         py_msg = PyUnicode_FromKindAndData(
    __pyx_t_1 = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, __pyx_v_c_msg, ((Py_ssize_t)__pyx_v_c_len)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_py_msg = __pyx_t_1;
    __pyx_t_1 = 0;
 133:             PyUnicode_1BYTE_KIND,
 134:             c_msg,
 135:             <Py_ssize_t>c_len)
+136:         return IlpError(py_code, py_msg)
    __Pyx_XDECREF(__pyx_r);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IlpError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 136, __pyx_L4_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_2)) {
      PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_py_code, __pyx_v_py_msg};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L4_error)
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
      PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_py_code, __pyx_v_py_msg};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L4_error)
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 136, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_5);
      if (__pyx_t_3) {
        __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
      }
      __Pyx_INCREF(__pyx_v_py_code);
      __Pyx_GIVEREF(__pyx_v_py_code);
      PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_py_code);
      __Pyx_INCREF(__pyx_v_py_msg);
      __Pyx_GIVEREF(__pyx_v_py_msg);
      PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_py_msg);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L3_return;
  }
 137:     finally:
+138:         line_sender_error_free(err)
  /*finally:*/ {
    __pyx_L4_error:;
    /*exception exit:*/{
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0;
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13);
      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10) < 0)) __Pyx_ErrFetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_11);
      __Pyx_XGOTREF(__pyx_t_12);
      __Pyx_XGOTREF(__pyx_t_13);
      __pyx_t_4 = __pyx_lineno; __pyx_t_6 = __pyx_clineno; __pyx_t_7 = __pyx_filename;
      {
        line_sender_error_free(__pyx_v_err);
      }
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_11);
        __Pyx_XGIVEREF(__pyx_t_12);
        __Pyx_XGIVEREF(__pyx_t_13);
        __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
      }
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_ErrRestore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
      __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0;
      __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_6; __pyx_filename = __pyx_t_7;
      goto __pyx_L1_error;
    }
    __pyx_L3_return: {
      __pyx_t_13 = __pyx_r;
      __pyx_r = 0;
      line_sender_error_free(__pyx_v_err);
      __pyx_r = __pyx_t_13;
      __pyx_t_13 = 0;
      goto __pyx_L0;
    }
  }
 139: 
 140: 
+141: cdef bytes str_to_utf8(str string, line_sender_utf8* utf8_out):
static PyObject *__pyx_f_7questdb_3ilp_str_to_utf8(PyObject *__pyx_v_string, struct line_sender_utf8 *__pyx_v_utf8_out) {
  PyObject *__pyx_v_owner = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("str_to_utf8", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("questdb.ilp.str_to_utf8", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 142:     """
 143:     Init the `utf8_out` object from the `string`.
 144:     If the string is held as a UCS1 and is purely ascii, then
 145:     the memory is borrowed.
 146:     Otherwise the string is first encoded to UTF-8 into a bytes object
 147:     and such bytes object is returned to transfer ownership and extend
 148:     the lifetime of the buffer pointed to by `utf8_out`.
 149:     """
 150:     # Note that we bypass `line_sender_utf8_init`.
+151:     cdef bytes owner = None
  __Pyx_INCREF(Py_None);
  __pyx_v_owner = ((PyObject*)Py_None);
+152:     PyUnicode_READY(string)
  __pyx_t_1 = PyUnicode_READY(__pyx_v_string); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 152, __pyx_L1_error)
+153:     if PyUnicode_IS_COMPACT_ASCII(string):
  __pyx_t_2 = (PyUnicode_IS_COMPACT_ASCII(__pyx_v_string) != 0);
  if (__pyx_t_2) {
/* … */
  }
+154:         utf8_out.len = <size_t>(PyUnicode_GET_LENGTH(string))
    __pyx_v_utf8_out->len = ((size_t)PyUnicode_GET_LENGTH(__pyx_v_string));
+155:         utf8_out.buf = <const char*>(PyUnicode_1BYTE_DATA(string))
    __pyx_v_utf8_out->buf = ((char const *)PyUnicode_1BYTE_DATA(__pyx_v_string));
+156:         return owner
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_owner);
    __pyx_r = __pyx_v_owner;
    goto __pyx_L0;
 157:     else:
+158:         owner = string.encode('utf-8')
  /*else*/ {
    if (unlikely(__pyx_v_string == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "encode");
      __PYX_ERR(0, 158, __pyx_L1_error)
    }
    __pyx_t_3 = PyUnicode_AsUTF8String(__pyx_v_string); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 158, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF_SET(__pyx_v_owner, ((PyObject*)__pyx_t_3));
    __pyx_t_3 = 0;
+159:         utf8_out.len = <size_t>(PyBytes_GET_SIZE(owner))
    __pyx_v_utf8_out->len = ((size_t)PyBytes_GET_SIZE(__pyx_v_owner));
+160:         utf8_out.buf = <const char*>(PyBytes_AsString(owner))
    __pyx_v_utf8_out->buf = ((char const *)PyBytes_AsString(__pyx_v_owner));
+161:         return owner
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_owner);
    __pyx_r = __pyx_v_owner;
    goto __pyx_L0;
  }
 162: 
 163: 
+164: cdef bytes str_to_table_name(str string, line_sender_table_name* name_out):
static PyObject *__pyx_f_7questdb_3ilp_str_to_table_name(PyObject *__pyx_v_string, struct line_sender_table_name *__pyx_v_name_out) {
  struct line_sender_error *__pyx_v_err;
  struct line_sender_utf8 __pyx_v_utf8;
  PyObject *__pyx_v_owner = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("str_to_table_name", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.str_to_table_name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 165:     """
 166:     Python string to borrowed C table name.
 167:     Also see `str_to_utf8`.
 168:     """
+169:     cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 170:     cdef line_sender_utf8 utf8
+171:     cdef bytes owner = str_to_utf8(string, &utf8)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_string, (&__pyx_v_utf8)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+172:     if not line_sender_table_name_init(name_out, utf8.len, utf8.buf, &err):
  __pyx_t_2 = ((!(line_sender_table_name_init(__pyx_v_name_out, __pyx_v_utf8.len, __pyx_v_utf8.buf, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+173:         raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 173, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 173, __pyx_L1_error)
+174:     return owner
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_owner);
  __pyx_r = __pyx_v_owner;
  goto __pyx_L0;
 175: 
 176: 
+177: cdef bytes str_to_column_name(str string, line_sender_column_name* name_out):
static PyObject *__pyx_f_7questdb_3ilp_str_to_column_name(PyObject *__pyx_v_string, struct line_sender_column_name *__pyx_v_name_out) {
  struct line_sender_error *__pyx_v_err;
  struct line_sender_utf8 __pyx_v_utf8;
  PyObject *__pyx_v_owner = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("str_to_column_name", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.str_to_column_name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 178:     """
 179:     Python string to borrowed C column name.
 180:     Also see `str_to_utf8`.
 181:     """
+182:     cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 183:     cdef line_sender_utf8 utf8
+184:     cdef bytes owner = str_to_utf8(string, &utf8)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_string, (&__pyx_v_utf8)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+185:     if not line_sender_column_name_init(name_out, utf8.len, utf8.buf, &err):
  __pyx_t_2 = ((!(line_sender_column_name_init(__pyx_v_name_out, __pyx_v_utf8.len, __pyx_v_utf8.buf, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+186:         raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 186, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 186, __pyx_L1_error)
+187:     return owner
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_owner);
  __pyx_r = __pyx_v_owner;
  goto __pyx_L0;
 188: 
 189: 
+190: cdef int64_t datetime_to_micros(datetime dt):
static int64_t __pyx_f_7questdb_3ilp_datetime_to_micros(PyDateTime_DateTime *__pyx_v_dt) {
  int64_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("datetime_to_micros", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_WriteUnraisable("questdb.ilp.datetime_to_micros", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 191:     """
 192:     Convert a `datetime.datetime` to microseconds since the epoch.
 193:     """
 194:     return (
+195:         <int64_t>(dt.timestamp()) *
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_dt), __pyx_n_s_timestamp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_int64_t(__pyx_t_1); if (unlikely((__pyx_t_4 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+196:         <int64_t>(1000000) +
  __pyx_r = ((((int64_t)__pyx_t_4) * ((int64_t)0xF4240)) + ((int64_t)__pyx_t_5));
  goto __pyx_L0;
+197:         <int64_t>(dt.microsecond))
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_dt), __pyx_n_s_microsecond); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 197, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyInt_As_int64_t(__pyx_t_1); if (unlikely((__pyx_t_5 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 198: 
 199: 
+200: cdef int64_t datetime_to_nanos(datetime dt):
static int64_t __pyx_f_7questdb_3ilp_datetime_to_nanos(PyDateTime_DateTime *__pyx_v_dt) {
  int64_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("datetime_to_nanos", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_WriteUnraisable("questdb.ilp.datetime_to_nanos", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 201:     """
 202:     Convert a `datetime.datetime` to nanoseconds since the epoch.
 203:     """
 204:     return (
+205:         <int64_t>(dt.timestamp()) *
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_dt), __pyx_n_s_timestamp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_int64_t(__pyx_t_1); if (unlikely((__pyx_t_4 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+206:         <int64_t>(1000000000) +
  __pyx_r = ((((int64_t)__pyx_t_4) * ((int64_t)0x3B9ACA00)) + ((int64_t)__pyx_t_5));
  goto __pyx_L0;
+207:         <int64_t>(dt.microsecond * 1000))
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_dt), __pyx_n_s_microsecond); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 207, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_int_1000); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 207, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = __Pyx_PyInt_As_int64_t(__pyx_t_2); if (unlikely((__pyx_t_5 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 207, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 208: 
 209: 
+210: cdef class TimestampMicros:
struct __pyx_obj_7questdb_3ilp_TimestampMicros {
  PyObject_HEAD
  int64_t _value;
};

 211:     """A timestamp in microseconds since the UNIX epoch."""
 212:     cdef int64_t _value
 213: 
+214:     def __cinit__(self, value: int):
/* Python wrapper */
static int __pyx_pw_7questdb_3ilp_15TimestampMicros_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7questdb_3ilp_15TimestampMicros_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_value = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 214, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_value = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 214, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.TimestampMicros.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_15TimestampMicros___cinit__(((struct __pyx_obj_7questdb_3ilp_TimestampMicros *)__pyx_v_self), __pyx_v_value);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7questdb_3ilp_15TimestampMicros___cinit__(struct __pyx_obj_7questdb_3ilp_TimestampMicros *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.TimestampMicros.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+215:         if value < 0:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_value, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 215, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+216:             raise ValueError('value must positive integer.')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 216, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 216, __pyx_L1_error)
/* … */
  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_value_must_positive_integer); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 216, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);
+217:         self._value = value
  __pyx_t_3 = __Pyx_PyInt_As_int64_t(__pyx_v_value); if (unlikely((__pyx_t_3 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 217, __pyx_L1_error)
  __pyx_v_self->_value = __pyx_t_3;
 218: 
+219:     @classmethod
  __pyx_t_2 = __Pyx_Method_ClassMethod(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 219, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7questdb_3ilp_TimestampMicros->tp_dict, __pyx_n_s_from_datetime, __pyx_t_2) < 0) __PYX_ERR(0, 220, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_7questdb_3ilp_TimestampMicros);
+220:     def from_datetime(cls, dt: datetime):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_15TimestampMicros_3from_datetime(PyObject *__pyx_v_cls, PyObject *__pyx_v_dt); /*proto*/
static char __pyx_doc_7questdb_3ilp_15TimestampMicros_2from_datetime[] = "\n        Construct a `TimestampMicros` from a `datetime` object.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_15TimestampMicros_3from_datetime(PyObject *__pyx_v_cls, PyObject *__pyx_v_dt) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_datetime (wrapper)", 0);
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_7cpython_8datetime_datetime, 1, "dt", 0))) __PYX_ERR(0, 220, __pyx_L1_error)
  __pyx_r = __pyx_pf_7questdb_3ilp_15TimestampMicros_2from_datetime(((PyTypeObject*)__pyx_v_cls), ((PyDateTime_DateTime *)__pyx_v_dt));
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_15TimestampMicros_2from_datetime(PyTypeObject *__pyx_v_cls, PyDateTime_DateTime *__pyx_v_dt) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_datetime", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("questdb.ilp.TimestampMicros.from_datetime", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_1, (PyObject *)__pyx_ptype_7questdb_3ilp_TimestampMicros, __pyx_n_s_from_datetime); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 220, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
 221:         """
 222:         Construct a `TimestampMicros` from a `datetime` object.
 223:         """
+224:         if not isinstance(dt, datetime):
  __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_dt), __pyx_ptype_7cpython_8datetime_datetime); 
  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+225:             raise TypeError('dt must be a datetime object.')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 225, __pyx_L1_error)
/* … */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_dt_must_be_a_datetime_object); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 225, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
+226:         return cls(datetime_to_micros(dt))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_f_7questdb_3ilp_datetime_to_micros(__pyx_v_dt)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 226, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_v_cls), __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 226, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 227: 
 228:     @property
+229:     def value(self) -> int:
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_15TimestampMicros_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_15TimestampMicros_5value_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_15TimestampMicros_5value___get__(((struct __pyx_obj_7questdb_3ilp_TimestampMicros *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_15TimestampMicros_5value___get__(struct __pyx_obj_7questdb_3ilp_TimestampMicros *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.TimestampMicros.value.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 230:         """Number of microseconds."""
+231:         return self._value
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_v_self->_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 231, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 232: 
 233: 
+234: cdef class TimestampNanos:
struct __pyx_obj_7questdb_3ilp_TimestampNanos {
  PyObject_HEAD
  int64_t _value;
};

 235:     """A timestamp in nanoseconds since the UNIX epoch."""
 236:     cdef int64_t _value
 237: 
+238:     def __cinit__(self, value: int):
/* Python wrapper */
static int __pyx_pw_7questdb_3ilp_14TimestampNanos_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7questdb_3ilp_14TimestampNanos_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_value = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 238, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_value = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 238, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.TimestampNanos.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_14TimestampNanos___cinit__(((struct __pyx_obj_7questdb_3ilp_TimestampNanos *)__pyx_v_self), __pyx_v_value);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7questdb_3ilp_14TimestampNanos___cinit__(struct __pyx_obj_7questdb_3ilp_TimestampNanos *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.TimestampNanos.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+239:         if value < 0:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_value, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 239, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 239, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+240:             raise ValueError('value must positive integer.')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 240, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 240, __pyx_L1_error)
+241:         self._value = value
  __pyx_t_3 = __Pyx_PyInt_As_int64_t(__pyx_v_value); if (unlikely((__pyx_t_3 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error)
  __pyx_v_self->_value = __pyx_t_3;
 242: 
+243:     @classmethod
  __pyx_t_1 = __Pyx_Method_ClassMethod(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_7questdb_3ilp_TimestampNanos->tp_dict, __pyx_n_s_from_datetime, __pyx_t_1) < 0) __PYX_ERR(0, 244, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  PyType_Modified(__pyx_ptype_7questdb_3ilp_TimestampNanos);
+244:     def from_datetime(cls, dt: datetime):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_14TimestampNanos_3from_datetime(PyObject *__pyx_v_cls, PyObject *__pyx_v_dt); /*proto*/
static char __pyx_doc_7questdb_3ilp_14TimestampNanos_2from_datetime[] = "\n        Construct a `TimestampNanos` from a `datetime` object.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_14TimestampNanos_3from_datetime(PyObject *__pyx_v_cls, PyObject *__pyx_v_dt) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_datetime (wrapper)", 0);
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_7cpython_8datetime_datetime, 1, "dt", 0))) __PYX_ERR(0, 244, __pyx_L1_error)
  __pyx_r = __pyx_pf_7questdb_3ilp_14TimestampNanos_2from_datetime(((PyTypeObject*)__pyx_v_cls), ((PyDateTime_DateTime *)__pyx_v_dt));
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_14TimestampNanos_2from_datetime(PyTypeObject *__pyx_v_cls, PyDateTime_DateTime *__pyx_v_dt) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_datetime", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("questdb.ilp.TimestampNanos.from_datetime", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __Pyx_GetNameInClass(__pyx_t_2, (PyObject *)__pyx_ptype_7questdb_3ilp_TimestampNanos, __pyx_n_s_from_datetime); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 244, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
 245:         """
 246:         Construct a `TimestampNanos` from a `datetime` object.
 247:         """
+248:         if not isinstance(dt, datetime):
  __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_dt), __pyx_ptype_7cpython_8datetime_datetime); 
  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+249:             raise TypeError('dt must be a datetime object.')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 249, __pyx_L1_error)
+250:         return cls(datetime_to_nanos(dt))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_f_7questdb_3ilp_datetime_to_nanos(__pyx_v_dt)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 250, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_v_cls), __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 250, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 251: 
 252:     @property
+253:     def value(self) -> int:
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_14TimestampNanos_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_14TimestampNanos_5value_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_14TimestampNanos_5value___get__(((struct __pyx_obj_7questdb_3ilp_TimestampNanos *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_14TimestampNanos_5value___get__(struct __pyx_obj_7questdb_3ilp_TimestampNanos *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.TimestampNanos.value.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 254:         """Number of nanoseconds."""
+255:         return self._value
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_v_self->_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 256: 
 257: 
+258: ctypedef bint (*row_complete_cb)(
typedef int (*__pyx_t_7questdb_3ilp_row_complete_cb)(struct line_sender_buffer *, void *, struct line_sender_error **);
 259:     line_sender_buffer*,
 260:     void* ctx,
 261:     line_sender_error**)
 262: 
 263: 
+264: cdef class LineSenderBuffer:
struct __pyx_obj_7questdb_3ilp_LineSenderBuffer {
  PyObject_HEAD
  struct __pyx_vtabstruct_7questdb_3ilp_LineSenderBuffer *__pyx_vtab;
  struct line_sender_buffer *_impl;
  __pyx_t_7questdb_3ilp_row_complete_cb _row_complete_cb;
  void *_row_complete_ctx;
};
/* … */
struct __pyx_vtabstruct_7questdb_3ilp_LineSenderBuffer {
  PyObject *(*_cinit_impl)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, size_t, size_t);
  PyObject *(*_to_str)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  int (*_set_marker)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  int (*_rewind_to_marker)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  PyObject *(*_clear_marker)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  int (*_table)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *);
  int (*_symbol)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *, PyObject *);
  int (*_column_bool)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, int);
  int (*_column_i64)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, int);
  int (*_column_f64)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, float);
  int (*_column_str)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, PyObject *);
  int (*_column_ts)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, struct __pyx_obj_7questdb_3ilp_TimestampMicros *);
  int (*_column_dt)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, PyDateTime_DateTime *);
  int (*_column)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *, PyObject *);
  int (*_may_trigger_row_complete)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  int (*_at_ts)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct __pyx_obj_7questdb_3ilp_TimestampNanos *);
  int (*_at_dt)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyDateTime_DateTime *);
  int (*_at_now)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
  int (*_at)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *);
  int (*_row)(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *, struct __pyx_opt_args_7questdb_3ilp_16LineSenderBuffer__row *__pyx_optional_args);
};
static struct __pyx_vtabstruct_7questdb_3ilp_LineSenderBuffer *__pyx_vtabptr_7questdb_3ilp_LineSenderBuffer;
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__cinit_impl(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, size_t, size_t);
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__to_str(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__set_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__rewind_to_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__clear_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__table(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__symbol(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *, PyObject *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_bool(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, int);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_i64(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, int);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_f64(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, float);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_str(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, PyObject *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_ts(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, struct __pyx_obj_7questdb_3ilp_TimestampMicros *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_dt(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct line_sender_column_name, PyDateTime_DateTime *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *, PyObject *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__may_trigger_row_complete(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_ts(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, struct __pyx_obj_7questdb_3ilp_TimestampNanos *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_dt(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyDateTime_DateTime *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_now(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *);
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *, PyObject *);

 265:     """
 266:     Construct QuestDB-flavored InfluxDB Line Protocol (ILP) messages.
 267: 
 268:     .. code-block:: python
 269: 
 270:         from questdb.ilp import LineSenderBuffer
 271: 
 272:         buf = LineSenderBuffer()
 273:         buf.row(
 274:             'table_name',
 275:             symbols={'s1', 'v1', 's2', 'v2'},
 276:             columns={'c1': True, 'c2': 0.5})
 277: 
 278:         # Append any additional rows then, once ready,
 279:         # call `sender.flush(buffer)` on a `LineSender` instance.
 280: 
 281:     Refer to the
 282:     `QuestDB documentation <https://questdb.io/docs/concept/symbol/>`_ to
 283:     understand the difference between the ``SYMBOL`` and ``STRING`` types
 284:     (TL;DR: symbols are interned strings).
 285: 
 286:     Appending data:
 287:       * The ``row`` method appends one row at a time.
 288:       * The ``tabular`` method appends multiple rows for a single table.
 289: 
 290:     Buffer inspection:
 291:       * For the number of bytes in the buffer, call ``len(buffer)``.
 292:       * To see the contents, call ``str(buffer)``.
 293:     """
 294:     cdef line_sender_buffer* _impl
 295:     cdef row_complete_cb _row_complete_cb
 296:     cdef void* _row_complete_ctx
 297: 
+298:     def __cinit__(self, init_capacity: int = 65536, max_name_len: int = 127):
/* Python wrapper */
static int __pyx_pw_7questdb_3ilp_16LineSenderBuffer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7questdb_3ilp_16LineSenderBuffer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_init_capacity = 0;
  PyObject *__pyx_v_max_name_len = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_init_capacity,&__pyx_n_s_max_name_len,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)__pyx_int_65536);
    values[1] = ((PyObject *)__pyx_int_127);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_init_capacity);
          if (value) { values[0] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_name_len);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 298, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_init_capacity = values[0];
    __pyx_v_max_name_len = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 298, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer___cinit__(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self), __pyx_v_init_capacity, __pyx_v_max_name_len);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7questdb_3ilp_16LineSenderBuffer___cinit__(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_init_capacity, PyObject *__pyx_v_max_name_len) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 299:         """
 300:         Create a new buffer with the an initial capacity and max name length.
 301:         :param int init_capacity: Initial capacity of the buffer in bytes.
 302:         :param int max_name_len: Maximum length of a table or column name.
 303:         """
+304:         self._cinit_impl(init_capacity, max_name_len)
  __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_init_capacity); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 304, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_max_name_len); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 304, __pyx_L1_error)
  __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__cinit_impl(__pyx_v_self, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 305: 
+306:     cdef inline _cinit_impl(self, size_t init_capacity, size_t max_name_len):
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__cinit_impl(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, size_t __pyx_v_init_capacity, size_t __pyx_v_max_name_len) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_cinit_impl", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+307:         self._impl = line_sender_buffer_with_max_name_len(max_name_len)
  __pyx_v_self->_impl = line_sender_buffer_with_max_name_len(__pyx_v_max_name_len);
+308:         line_sender_buffer_reserve(self._impl, init_capacity)
  line_sender_buffer_reserve(__pyx_v_self->_impl, __pyx_v_init_capacity);
+309:         self._row_complete_cb = NULL
  __pyx_v_self->_row_complete_cb = NULL;
+310:         self._row_complete_ctx = NULL
  __pyx_v_self->_row_complete_ctx = NULL;
 311: 
+312:     def __dealloc__(self):
/* Python wrapper */
static void __pyx_pw_7questdb_3ilp_16LineSenderBuffer_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7questdb_3ilp_16LineSenderBuffer_3__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_7questdb_3ilp_16LineSenderBuffer_2__dealloc__(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_7questdb_3ilp_16LineSenderBuffer_2__dealloc__(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
+313:         line_sender_buffer_free(self._impl)
  line_sender_buffer_free(__pyx_v_self->_impl);
 314: 
+315:     def reserve(self, additional: int):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_5reserve(PyObject *__pyx_v_self, PyObject *__pyx_v_additional); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_4reserve[] = "\n        Ensure the buffer has at least `additional` bytes of future capacity.\n\n        :param int additional: Additional bytes to reserve.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_5reserve(PyObject *__pyx_v_self, PyObject *__pyx_v_additional) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("reserve (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_4reserve(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self), ((PyObject *)__pyx_v_additional));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_4reserve(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_additional) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("reserve", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.reserve", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 316:         """
 317:         Ensure the buffer has at least `additional` bytes of future capacity.
 318: 
 319:         :param int additional: Additional bytes to reserve.
 320:         """
+321:         if additional < 0:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_additional, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 321, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+322:             raise ValueError('additional must be non-negative.')
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 322, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 322, __pyx_L1_error)
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_additional_must_be_non_negative); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 322, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
+323:         line_sender_buffer_reserve(self._impl, additional)
  __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_additional); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 323, __pyx_L1_error)
  line_sender_buffer_reserve(__pyx_v_self->_impl, __pyx_t_3);
 324: 
+325:     def capacity(self) -> int:
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_7capacity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_6capacity[] = "The current buffer capacity.";
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_7capacity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("capacity (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_6capacity(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_6capacity(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("capacity", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.capacity", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 326:         """The current buffer capacity."""
+327:         return line_sender_buffer_capacity(self._impl)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_FromSize_t(line_sender_buffer_capacity(__pyx_v_self->_impl)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 327, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 328: 
+329:     def clear(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_9clear(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_8clear[] = "\n        Reset the buffer.\n\n        Note that flushing a buffer will (unless otherwise specified)\n        also automatically clear it.\n\n        This method is designed to be called only in conjunction with\n        ``sender.flush(buffer, clear=False)``.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_9clear(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("clear (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_8clear(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_8clear(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("clear", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 330:         """
 331:         Reset the buffer.
 332: 
 333:         Note that flushing a buffer will (unless otherwise specified)
 334:         also automatically clear it.
 335: 
 336:         This method is designed to be called only in conjunction with
 337:         ``sender.flush(buffer, clear=False)``.
 338:         """
+339:         line_sender_buffer_clear(self._impl)
  line_sender_buffer_clear(__pyx_v_self->_impl);
 340: 
+341:     def __len__(self):
/* Python wrapper */
static Py_ssize_t __pyx_pw_7questdb_3ilp_16LineSenderBuffer_11__len__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_10__len__[] = "\n        The current number of bytes currently in the buffer.\n        ";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_7questdb_3ilp_16LineSenderBuffer_10__len__;
#endif
static Py_ssize_t __pyx_pw_7questdb_3ilp_16LineSenderBuffer_11__len__(PyObject *__pyx_v_self) {
  Py_ssize_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_10__len__(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static Py_ssize_t __pyx_pf_7questdb_3ilp_16LineSenderBuffer_10__len__(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  Py_ssize_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__len__", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 342:         """
 343:         The current number of bytes currently in the buffer.
 344:         """
+345:         return line_sender_buffer_size(self._impl)
  __pyx_r = line_sender_buffer_size(__pyx_v_self->_impl);
  goto __pyx_L0;
 346: 
+347:     def __str__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_13__str__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_13__str__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_12__str__(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_12__str__(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+348:         return self._to_str()
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__to_str(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 349: 
+350:     cdef inline object _to_str(self):
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__to_str(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  size_t __pyx_v_size;
  char const *__pyx_v_utf8;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_to_str", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._to_str", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+351:         cdef size_t size = 0
  __pyx_v_size = 0;
+352:         cdef const char* utf8 = line_sender_buffer_peek(self._impl, &size)
  __pyx_v_utf8 = line_sender_buffer_peek(__pyx_v_self->_impl, (&__pyx_v_size));
+353:         return PyUnicode_FromStringAndSize(utf8, <Py_ssize_t>size)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyUnicode_FromStringAndSize(__pyx_v_utf8, ((Py_ssize_t)__pyx_v_size)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 353, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 354: 
+355:     cdef inline int _set_marker(self) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__set_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_set_marker", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._set_marker", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+356:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+357:         if not line_sender_buffer_set_marker(self._impl, &err):
  __pyx_t_1 = ((!(line_sender_buffer_set_marker(__pyx_v_self->_impl, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+358:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 358, __pyx_L1_error)
 359: 
+360:     cdef inline int _rewind_to_marker(self) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__rewind_to_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_rewind_to_marker", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._rewind_to_marker", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+361:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+362:         if not line_sender_buffer_rewind_to_marker(self._impl, &err):
  __pyx_t_1 = ((!(line_sender_buffer_rewind_to_marker(__pyx_v_self->_impl, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+363:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 363, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 363, __pyx_L1_error)
 364: 
+365:     cdef inline _clear_marker(self):
static CYTHON_INLINE PyObject *__pyx_f_7questdb_3ilp_16LineSenderBuffer__clear_marker(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_clear_marker", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+366:         line_sender_buffer_clear_marker(self._impl)
  line_sender_buffer_clear_marker(__pyx_v_self->_impl);
 367: 
+368:     cdef inline int _table(self, str table_name) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__table(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_table_name) {
  struct line_sender_error *__pyx_v_err;
  struct line_sender_table_name __pyx_v_c_table_name;
  CYTHON_UNUSED PyObject *__pyx_v_owner = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_table", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._table", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+369:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 370:         cdef line_sender_table_name c_table_name
+371:         cdef bytes owner = str_to_table_name(table_name, &c_table_name)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_table_name(__pyx_v_table_name, (&__pyx_v_c_table_name)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 371, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+372:         if not line_sender_buffer_table(self._impl, c_table_name, &err):
  __pyx_t_2 = ((!(line_sender_buffer_table(__pyx_v_self->_impl, __pyx_v_c_table_name, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+373:             raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 373, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 373, __pyx_L1_error)
+374:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 375: 
+376:     cdef inline int _symbol(self, str name, str value) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__symbol(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_value) {
  struct line_sender_error *__pyx_v_err;
  struct line_sender_column_name __pyx_v_c_name;
  struct line_sender_utf8 __pyx_v_c_value;
  CYTHON_UNUSED PyObject *__pyx_v_owner_name = 0;
  CYTHON_UNUSED PyObject *__pyx_v_owner_value = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_symbol", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._symbol", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner_name);
  __Pyx_XDECREF(__pyx_v_owner_value);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+377:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 378:         cdef line_sender_column_name c_name
 379:         cdef line_sender_utf8 c_value
+380:         cdef bytes owner_name = str_to_column_name(name, &c_name)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_column_name(__pyx_v_name, (&__pyx_v_c_name)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner_name = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+381:         cdef bytes owner_value = str_to_utf8(value, &c_value)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_value, (&__pyx_v_c_value)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner_value = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+382:         if not line_sender_buffer_symbol(self._impl, c_name, c_value, &err):
  __pyx_t_2 = ((!(line_sender_buffer_symbol(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_v_c_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+383:             raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 383, __pyx_L1_error)
+384:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 385: 
+386:     cdef inline int _column_bool(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_bool(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, int __pyx_v_value) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_bool", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_bool", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 387:             self, line_sender_column_name c_name, bint value) except -1:
+388:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+389:         if not line_sender_buffer_column_bool(self._impl, c_name, value, &err):
  __pyx_t_1 = ((!(line_sender_buffer_column_bool(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_v_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+390:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 390, __pyx_L1_error)
+391:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 392: 
+393:     cdef inline int _column_i64(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_i64(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, int __pyx_v_value) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_i64", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_i64", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 394:             self, line_sender_column_name c_name, int value) except -1:
 395:         # TODO: Generally audit for int overflows this in the whole codebase.
 396:         # We pretty certainly have one here :-).
+397:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+398:         if not line_sender_buffer_column_i64(self._impl, c_name, value, &err):
  __pyx_t_1 = ((!(line_sender_buffer_column_i64(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_v_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+399:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 399, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 399, __pyx_L1_error)
+400:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 401: 
+402:     cdef inline int _column_f64(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_f64(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, float __pyx_v_value) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_f64", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_f64", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 403:             self, line_sender_column_name c_name, float value) except -1:
+404:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+405:         if not line_sender_buffer_column_f64(self._impl, c_name, value, &err):
  __pyx_t_1 = ((!(line_sender_buffer_column_f64(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_v_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+406:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 406, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 406, __pyx_L1_error)
+407:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 408: 
+409:     cdef inline int _column_str(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_str(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, PyObject *__pyx_v_value) {
  struct line_sender_error *__pyx_v_err;
  struct line_sender_utf8 __pyx_v_c_value;
  CYTHON_UNUSED PyObject *__pyx_v_owner_value = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_str", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_str", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner_value);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 410:             self, line_sender_column_name c_name, str value) except -1:
+411:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 412:         cdef line_sender_utf8 c_value
+413:         cdef bytes owner_value = str_to_utf8(value, &c_value)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_value, (&__pyx_v_c_value)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 413, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner_value = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+414:         if not line_sender_buffer_column_str(self._impl, c_name, c_value, &err):
  __pyx_t_2 = ((!(line_sender_buffer_column_str(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_v_c_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_2)) {
/* … */
  }
+415:             raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 415, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 415, __pyx_L1_error)
+416:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 417: 
+418:     cdef inline int _column_ts(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_ts(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, struct __pyx_obj_7questdb_3ilp_TimestampMicros *__pyx_v_ts) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_ts", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_ts", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 419:             self, line_sender_column_name c_name, TimestampMicros ts) except -1:
+420:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+421:         if not line_sender_buffer_column_ts(self._impl, c_name, ts.value, &err):
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_ts), __pyx_n_s_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 421, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_As_int64_t(__pyx_t_1); if (unlikely((__pyx_t_2 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 421, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = ((!(line_sender_buffer_column_ts(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_t_2, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+422:             raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 422, __pyx_L1_error)
+423:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 424: 
+425:     cdef inline int _column_dt(
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_dt(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct line_sender_column_name __pyx_v_c_name, PyDateTime_DateTime *__pyx_v_dt) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column_dt", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column_dt", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 426:             self, line_sender_column_name c_name, datetime dt) except -1:
+427:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+428:         if not line_sender_buffer_column_ts(
  __pyx_t_1 = ((!(line_sender_buffer_column_ts(__pyx_v_self->_impl, __pyx_v_c_name, __pyx_f_7questdb_3ilp_datetime_to_micros(__pyx_v_dt), (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
 429:                 self._impl, c_name, datetime_to_micros(dt), &err):
+430:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 430, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 430, __pyx_L1_error)
+431:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 432: 
+433:     cdef inline int _column(self, str name, object value) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__column(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_value) {
  struct line_sender_column_name __pyx_v_c_name;
  CYTHON_UNUSED PyObject *__pyx_v_owner_name = 0;
  PyObject *__pyx_v_valid = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_column", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._column", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_owner_name);
  __Pyx_XDECREF(__pyx_v_valid);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 434:         cdef line_sender_column_name c_name
+435:         cdef bytes owner_name = str_to_column_name(name, &c_name)
  __pyx_t_1 = __pyx_f_7questdb_3ilp_str_to_column_name(__pyx_v_name, (&__pyx_v_c_name)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 435, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_owner_name = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+436:         if PyBool_Check(value):
  __pyx_t_2 = (PyBool_Check(__pyx_v_value) != 0);
  if (__pyx_t_2) {
/* … */
  }
+437:             return self._column_bool(c_name, value)
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 437, __pyx_L1_error)
    __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_bool(__pyx_v_self, __pyx_v_c_name, __pyx_t_2); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 437, __pyx_L1_error)
    __pyx_r = __pyx_t_3;
    goto __pyx_L0;
+438:         elif isinstance(value, int):
  __pyx_t_2 = PyInt_Check(__pyx_v_value); 
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
/* … */
  }
+439:             return self._column_i64(c_name, value)
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 439, __pyx_L1_error)
    __pyx_t_5 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_i64(__pyx_v_self, __pyx_v_c_name, __pyx_t_3); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 439, __pyx_L1_error)
    __pyx_r = __pyx_t_5;
    goto __pyx_L0;
+440:         elif isinstance(value, float):
  __pyx_t_4 = PyFloat_Check(__pyx_v_value); 
  __pyx_t_2 = (__pyx_t_4 != 0);
  if (__pyx_t_2) {
/* … */
  }
+441:             return self._column_f64(c_name, value)
    __pyx_t_6 = __pyx_PyFloat_AsFloat(__pyx_v_value); if (unlikely((__pyx_t_6 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 441, __pyx_L1_error)
    __pyx_t_5 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_f64(__pyx_v_self, __pyx_v_c_name, __pyx_t_6); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 441, __pyx_L1_error)
    __pyx_r = __pyx_t_5;
    goto __pyx_L0;
+442:         elif isinstance(value, str):
  __pyx_t_2 = PyUnicode_Check(__pyx_v_value); 
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
/* … */
  }
+443:             return self._column_str(c_name, value)
    if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 443, __pyx_L1_error)
    __pyx_t_5 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_str(__pyx_v_self, __pyx_v_c_name, ((PyObject*)__pyx_v_value)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 443, __pyx_L1_error)
    __pyx_r = __pyx_t_5;
    goto __pyx_L0;
+444:         elif isinstance(value, TimestampMicros):
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_value, __pyx_ptype_7questdb_3ilp_TimestampMicros); 
  __pyx_t_2 = (__pyx_t_4 != 0);
  if (__pyx_t_2) {
/* … */
  }
+445:             return self._column_ts(c_name, value)
    if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_7questdb_3ilp_TimestampMicros))))) __PYX_ERR(0, 445, __pyx_L1_error)
    __pyx_t_5 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_ts(__pyx_v_self, __pyx_v_c_name, ((struct __pyx_obj_7questdb_3ilp_TimestampMicros *)__pyx_v_value)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 445, __pyx_L1_error)
    __pyx_r = __pyx_t_5;
    goto __pyx_L0;
+446:         elif isinstance(value, datetime):
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_value, __pyx_ptype_7cpython_8datetime_datetime); 
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (likely(__pyx_t_4)) {
/* … */
  }
+447:             return self._column_dt(c_name, value)
    if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_7cpython_8datetime_datetime))))) __PYX_ERR(0, 447, __pyx_L1_error)
    __pyx_t_5 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column_dt(__pyx_v_self, __pyx_v_c_name, ((PyDateTime_DateTime *)__pyx_v_value)); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 447, __pyx_L1_error)
    __pyx_r = __pyx_t_5;
    goto __pyx_L0;
 448:         else:
+449:             valid = ', '.join((
  /*else*/ {
/* … */
    __pyx_t_1 = PyUnicode_Join(__pyx_kp_u__9, __pyx_tuple__10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 449, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_valid = ((PyObject*)__pyx_t_1);
    __pyx_t_1 = 0;
+450:                 'bool',
  __pyx_tuple__10 = PyTuple_Pack(6, __pyx_n_u_bool, __pyx_n_u_int, __pyx_n_u_float, __pyx_n_u_str, __pyx_n_u_TimestampMicros, __pyx_kp_u_datetime_datetime); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 450, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
 451:                 'int',
 452:                 'float',
 453:                 'str',
 454:                 'TimestampMicros',
 455:                 'datetime.datetime'))
+456:             raise TypeError(
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 456, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 456, __pyx_L1_error)
  }
+457:                 f'Unsupported type: {type(value)}. Must be one of: {valid}')
    __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_7 = 0;
    __pyx_t_8 = 127;
    __Pyx_INCREF(__pyx_kp_u_Unsupported_type);
    __pyx_t_7 += 18;
    __Pyx_GIVEREF(__pyx_kp_u_Unsupported_type);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_Unsupported_type);
    __pyx_t_9 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_value)), __pyx_empty_unicode); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_8 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_9) > __pyx_t_8) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_9) : __pyx_t_8;
    __pyx_t_7 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_9);
    __Pyx_GIVEREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
    __pyx_t_9 = 0;
    __Pyx_INCREF(__pyx_kp_u_Must_be_one_of);
    __pyx_t_7 += 18;
    __Pyx_GIVEREF(__pyx_kp_u_Must_be_one_of);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_Must_be_one_of);
    __pyx_t_9 = __Pyx_PyUnicode_Unicode(__pyx_v_valid); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_8 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_9) > __pyx_t_8) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_9) : __pyx_t_8;
    __pyx_t_7 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_9);
    __Pyx_GIVEREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_9);
    __pyx_t_9 = 0;
    __pyx_t_9 = __Pyx_PyUnicode_Join(__pyx_t_1, 4, __pyx_t_7, __pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 458: 
+459:     cdef inline int _may_trigger_row_complete(self) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__may_trigger_row_complete(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_may_trigger_row_complete", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._may_trigger_row_complete", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+460:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+461:         if self._row_complete_cb != NULL:
  __pyx_t_1 = ((__pyx_v_self->_row_complete_cb != NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+462:             if not self._row_complete_cb(
    __pyx_t_1 = ((!(__pyx_v_self->_row_complete_cb(__pyx_v_self->_impl, __pyx_v_self->_row_complete_ctx, (&__pyx_v_err)) != 0)) != 0);
    if (unlikely(__pyx_t_1)) {
/* … */
    }
 463:                     self._impl,
 464:                     self._row_complete_ctx,
 465:                     &err):
+466:                 raise c_err_to_py(err)
      __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 466, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_Raise(__pyx_t_2, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __PYX_ERR(0, 466, __pyx_L1_error)
 467: 
+468:     cdef inline int _at_ts(self, TimestampNanos ts) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_ts(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, struct __pyx_obj_7questdb_3ilp_TimestampNanos *__pyx_v_ts) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_at_ts", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._at_ts", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+469:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+470:         if not line_sender_buffer_at(self._impl, ts.value, &err):
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_ts), __pyx_n_s_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_As_int64_t(__pyx_t_1); if (unlikely((__pyx_t_2 == ((int64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = ((!(line_sender_buffer_at(__pyx_v_self->_impl, __pyx_t_2, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_3)) {
/* … */
  }
+471:             raise c_err_to_py(err)
    __pyx_t_1 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 471, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 471, __pyx_L1_error)
+472:         self._may_trigger_row_complete()
  __pyx_t_4 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__may_trigger_row_complete(__pyx_v_self); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 472, __pyx_L1_error)
+473:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 474: 
+475:     cdef inline int _at_dt(self, datetime dt) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_dt(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyDateTime_DateTime *__pyx_v_dt) {
  int64_t __pyx_v_value;
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_at_dt", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._at_dt", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+476:         cdef int64_t value = datetime_to_nanos(dt)
  __pyx_v_value = __pyx_f_7questdb_3ilp_datetime_to_nanos(__pyx_v_dt);
+477:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+478:         if not line_sender_buffer_at(self._impl, value, &err):
  __pyx_t_1 = ((!(line_sender_buffer_at(__pyx_v_self->_impl, __pyx_v_value, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+479:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 479, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 479, __pyx_L1_error)
+480:         self._may_trigger_row_complete()
  __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__may_trigger_row_complete(__pyx_v_self); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 480, __pyx_L1_error)
+481:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 482: 
+483:     cdef inline int _at_now(self) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_now(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self) {
  struct line_sender_error *__pyx_v_err;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_at_now", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._at_now", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+484:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+485:         if not line_sender_buffer_at_now(self._impl, &err):
  __pyx_t_1 = ((!(line_sender_buffer_at_now(__pyx_v_self->_impl, (&__pyx_v_err)) != 0)) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+486:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 486, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 486, __pyx_L1_error)
+487:         self._may_trigger_row_complete()
  __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__may_trigger_row_complete(__pyx_v_self); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 487, __pyx_L1_error)
+488:         return 0
  __pyx_r = 0;
  goto __pyx_L0;
 489: 
+490:     cdef inline int _at(self, object ts) except -1:
static CYTHON_INLINE int __pyx_f_7questdb_3ilp_16LineSenderBuffer__at(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_ts) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_at", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._at", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+491:         if ts is None:
  __pyx_t_1 = (__pyx_v_ts == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+492:             return self._at_now()
    __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_now(__pyx_v_self); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 492, __pyx_L1_error)
    __pyx_r = __pyx_t_3;
    goto __pyx_L0;
+493:         elif isinstance(ts, TimestampNanos):
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_ts, __pyx_ptype_7questdb_3ilp_TimestampNanos); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {
/* … */
  }
+494:             return self._at_ts(ts)
    if (!(likely(((__pyx_v_ts) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_ts, __pyx_ptype_7questdb_3ilp_TimestampNanos))))) __PYX_ERR(0, 494, __pyx_L1_error)
    __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_ts(__pyx_v_self, ((struct __pyx_obj_7questdb_3ilp_TimestampNanos *)__pyx_v_ts)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 494, __pyx_L1_error)
    __pyx_r = __pyx_t_3;
    goto __pyx_L0;
+495:         elif isinstance(ts, datetime):
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_ts, __pyx_ptype_7cpython_8datetime_datetime); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (likely(__pyx_t_2)) {
/* … */
  }
+496:             return self._at_dt(ts)
    if (!(likely(((__pyx_v_ts) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_ts, __pyx_ptype_7cpython_8datetime_datetime))))) __PYX_ERR(0, 496, __pyx_L1_error)
    __pyx_t_3 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__at_dt(__pyx_v_self, ((PyDateTime_DateTime *)__pyx_v_ts)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 496, __pyx_L1_error)
    __pyx_r = __pyx_t_3;
    goto __pyx_L0;
 497:         else:
+498:             raise TypeError(
  /*else*/ {
/* … */
    __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 498, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_7, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __PYX_ERR(0, 498, __pyx_L1_error)
  }
+499:                 f'Unsupported type: {type(ts)}. Must be one of: ' +
    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = 0;
    __pyx_t_6 = 127;
    __Pyx_INCREF(__pyx_kp_u_Unsupported_type);
    __pyx_t_5 += 18;
    __Pyx_GIVEREF(__pyx_kp_u_Unsupported_type);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_u_Unsupported_type);
    __pyx_t_7 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_ts)), __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6;
    __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_7);
    __pyx_t_7 = 0;
    __Pyx_INCREF(__pyx_kp_u_Must_be_one_of);
    __pyx_t_5 += 18;
    __Pyx_GIVEREF(__pyx_kp_u_Must_be_one_of);
    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_kp_u_Must_be_one_of);
    __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_4, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyUnicode_Concat(__pyx_t_7, __pyx_kp_u_TimestampNanos_datetime_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 500:                 'TimestampNanos, datetime, None')
 501: 
+502:     cdef int _row(
static int __pyx_f_7questdb_3ilp_16LineSenderBuffer__row(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_table_name, struct __pyx_opt_args_7questdb_3ilp_16LineSenderBuffer__row *__pyx_optional_args) {
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._row", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_name);
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_7questdb_3ilp_16LineSenderBuffer__row {
  int __pyx_n;
  PyObject *symbols;
  PyObject *columns;
  PyObject *at;
};
 503:             self,
 504:             str table_name,
+505:             dict symbols=None,
  PyObject *__pyx_v_symbols = ((PyObject*)Py_None);
+506:             dict columns=None,
  PyObject *__pyx_v_columns = ((PyObject*)Py_None);
+507:             object at=None) except -1:
  PyObject *__pyx_v_at = ((PyObject *)Py_None);
  PyObject *__pyx_v_name = NULL;
  PyObject *__pyx_v_value = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_row", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_symbols = __pyx_optional_args->symbols;
      if (__pyx_optional_args->__pyx_n > 1) {
        __pyx_v_columns = __pyx_optional_args->columns;
        if (__pyx_optional_args->__pyx_n > 2) {
          __pyx_v_at = __pyx_optional_args->at;
        }
      }
    }
  }
 508:         """
 509:         Add a row to the buffer.
 510:         """
+511:         self._set_marker()
  __pyx_t_1 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__set_marker(__pyx_v_self); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 511, __pyx_L1_error)
+512:         try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L8_try_end;
    __pyx_L3_error:;
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
/* … */
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_XGIVEREF(__pyx_t_4);
    __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
    goto __pyx_L1_error;
    __pyx_L8_try_end:;
  }
+513:             self._table(table_name)
      __pyx_t_1 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__table(__pyx_v_self, __pyx_v_table_name); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 513, __pyx_L3_error)
+514:             if not (symbols or columns):
      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_symbols); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 514, __pyx_L3_error)
      if (!__pyx_t_6) {
      } else {
        __pyx_t_5 = __pyx_t_6;
        goto __pyx_L10_bool_binop_done;
      }
      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_columns); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 514, __pyx_L3_error)
      __pyx_t_5 = __pyx_t_6;
      __pyx_L10_bool_binop_done:;
      __pyx_t_6 = ((!__pyx_t_5) != 0);
      if (unlikely(__pyx_t_6)) {
/* … */
      }
+515:                 raise IlpError(
        __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_IlpError); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 515, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_8);
+516:                     IlpErrorCode.InvalidApiCall,
        __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 516, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_InvalidApiCall); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 516, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_9 = NULL;
        __pyx_t_1 = 0;
        if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) {
          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
          if (likely(__pyx_t_9)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
            __Pyx_INCREF(__pyx_t_9);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_8, function);
            __pyx_t_1 = 1;
          }
        }
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_8)) {
          PyObject *__pyx_temp[3] = {__pyx_t_9, __pyx_t_10, __pyx_kp_u_Must_specify_at_least_one_symbol};
          __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_1, 2+__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 515, __pyx_L3_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) {
          PyObject *__pyx_temp[3] = {__pyx_t_9, __pyx_t_10, __pyx_kp_u_Must_specify_at_least_one_symbol};
          __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_1, 2+__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 515, __pyx_L3_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        } else
        #endif
        {
          __pyx_t_11 = PyTuple_New(2+__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 515, __pyx_L3_error)
          __Pyx_GOTREF(__pyx_t_11);
          if (__pyx_t_9) {
            __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL;
          }
          __Pyx_GIVEREF(__pyx_t_10);
          PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_1, __pyx_t_10);
          __Pyx_INCREF(__pyx_kp_u_Must_specify_at_least_one_symbol);
          __Pyx_GIVEREF(__pyx_kp_u_Must_specify_at_least_one_symbol);
          PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_1, __pyx_kp_u_Must_specify_at_least_one_symbol);
          __pyx_t_10 = 0;
          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 515, __pyx_L3_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        }
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_Raise(__pyx_t_7, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __PYX_ERR(0, 515, __pyx_L3_error)
 517:                     'Must specify at least one symbol or column')
+518:             if symbols is not None:
      __pyx_t_6 = (__pyx_v_symbols != ((PyObject*)Py_None));
      __pyx_t_5 = (__pyx_t_6 != 0);
      if (__pyx_t_5) {
/* … */
      }
+519:                 for name, value in symbols.items():
        __pyx_t_12 = 0;
        if (unlikely(__pyx_v_symbols == Py_None)) {
          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items");
          __PYX_ERR(0, 519, __pyx_L3_error)
        }
        __pyx_t_8 = __Pyx_dict_iterator(__pyx_v_symbols, 1, __pyx_n_s_items, (&__pyx_t_13), (&__pyx_t_1)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 519, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_XDECREF(__pyx_t_7);
        __pyx_t_7 = __pyx_t_8;
        __pyx_t_8 = 0;
        while (1) {
          __pyx_t_14 = __Pyx_dict_iter_next(__pyx_t_7, __pyx_t_13, &__pyx_t_12, &__pyx_t_8, &__pyx_t_11, NULL, __pyx_t_1);
          if (unlikely(__pyx_t_14 == 0)) break;
          if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 519, __pyx_L3_error)
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_8);
          __pyx_t_8 = 0;
          __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_11);
          __pyx_t_11 = 0;
+520:                     self._symbol(name, value)
          if (!(likely(PyUnicode_CheckExact(__pyx_v_name))||((__pyx_v_name) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_name)->tp_name), 0))) __PYX_ERR(0, 520, __pyx_L3_error)
          if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 520, __pyx_L3_error)
          __pyx_t_14 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__symbol(__pyx_v_self, ((PyObject*)__pyx_v_name), ((PyObject*)__pyx_v_value)); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 520, __pyx_L3_error)
        }
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+521:             if columns is not None:
      __pyx_t_5 = (__pyx_v_columns != ((PyObject*)Py_None));
      __pyx_t_6 = (__pyx_t_5 != 0);
      if (__pyx_t_6) {
/* … */
      }
+522:                 for name, value in columns.items():
        __pyx_t_13 = 0;
        if (unlikely(__pyx_v_columns == Py_None)) {
          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items");
          __PYX_ERR(0, 522, __pyx_L3_error)
        }
        __pyx_t_11 = __Pyx_dict_iterator(__pyx_v_columns, 1, __pyx_n_s_items, (&__pyx_t_12), (&__pyx_t_1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 522, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_XDECREF(__pyx_t_7);
        __pyx_t_7 = __pyx_t_11;
        __pyx_t_11 = 0;
        while (1) {
          __pyx_t_14 = __Pyx_dict_iter_next(__pyx_t_7, __pyx_t_12, &__pyx_t_13, &__pyx_t_11, &__pyx_t_8, NULL, __pyx_t_1);
          if (unlikely(__pyx_t_14 == 0)) break;
          if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 522, __pyx_L3_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_11);
          __pyx_t_11 = 0;
          __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_8);
          __pyx_t_8 = 0;
+523:                     self._column(name, value)
          if (!(likely(PyUnicode_CheckExact(__pyx_v_name))||((__pyx_v_name) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_name)->tp_name), 0))) __PYX_ERR(0, 523, __pyx_L3_error)
          __pyx_t_14 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__column(__pyx_v_self, ((PyObject*)__pyx_v_name), __pyx_v_value); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 523, __pyx_L3_error)
        }
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+524:             self._at(at)
      __pyx_t_1 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__at(__pyx_v_self, __pyx_v_at); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 524, __pyx_L3_error)
+525:             self._clear_marker()
      __pyx_t_7 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__clear_marker(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 525, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+526:         except:
    /*except:*/ {
      __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer._row", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_11) < 0) __PYX_ERR(0, 526, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_GOTREF(__pyx_t_11);
+527:             self._rewind_to_marker()
      __pyx_t_1 = __pyx_f_7questdb_3ilp_16LineSenderBuffer__rewind_to_marker(__pyx_v_self); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 527, __pyx_L5_except_error)
+528:             raise
      __Pyx_GIVEREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_11);
      __Pyx_ErrRestoreWithState(__pyx_t_7, __pyx_t_8, __pyx_t_11);
      __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_11 = 0; 
      __PYX_ERR(0, 528, __pyx_L5_except_error)
    }
    __pyx_L5_except_error:;
 529: 
+530:     def row(
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_15row(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_14row[] = "\n        Add a single row (line) to the buffer.\n\n        At least one ``symbols`` or ``columns`` must be specified.\n\n        .. code-block:: python\n\n            # All fields specified.\n            buffer.row(\n                'table_name',\n                symbols={'sym1': 'abc', 'sym2': 'def'},\n                columns={\n                    'col1': True,\n                    'col2': 123,\n                    'col3': 3.14,\n                    'col4': 'xyz',\n                    'col5': TimestampMicros(123456789),\n                    'col6': datetime(2019, 1, 1, 12, 0, 0)},\n                at=TimestampNanos(123456789))\n\n            # Only symbols specified. Designated timestamp assigned by the db.\n            buffer.row(\n                'table_name',\n                symbols={'sym1': 'abc', 'sym2': 'def'})\n\n            # Float columns and timestamp specified as `datetime.datetime`.\n            # Pay special attention to the timezone, which if unspecified is\n            # assumed to be the local timezone (and not UTC).\n            buffer.row(\n                'sensor data',\n                columns={\n                    'temperature': 24.5,\n                    'humidity': 0.5},\n                at=datetime.datetime.utcnow())\n\n        :param table_name: The name of the table to which the row belongs.\n        :param symbols: A dictionary of symbol column names to ``str`` values.\n        :param columns: A dictionary of column names to ``bool``, ``int``,\n            ``float``, ``str``, ``TimestampMicros`` or ``datetime`` values.\n        :param at: The timestamp of the row. If ``None``, timestamp is assigned\n            by the server. If ``datetime``, the timestamp is converted to\n            nanoseconds. A nanosecond unix epoch timestamp can be passed\n            explicitly as a ``TimestampNanos`` object.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_15row(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_table_name = 0;
  PyObject *__pyx_v_symbols = 0;
  PyObject *__pyx_v_columns = 0;
  PyObject *__pyx_v_at = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("row (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_table_name,&__pyx_n_s_symbols,&__pyx_n_s_columns,&__pyx_n_s_at,0};
    PyObject* values[4] = {0,0,0,0};
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_14row(struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, PyObject *__pyx_v_table_name, PyObject *__pyx_v_symbols, PyObject *__pyx_v_columns, PyObject *__pyx_v_at) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("row", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.row", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 531:             self,
 532:             table_name: str,
 533:             *,
+534:             symbols: Optional[dict[str, str]]=None,
    values[1] = ((PyObject *)Py_None);
 535:             columns: Optional[dict[
 536:                 str,
+537:                 Union[bool, int, float, str, TimestampMicros, datetime]]]=None,
    values[2] = ((PyObject *)Py_None);
+538:             at: Union[None, TimestampNanos, datetime]=None):
    values[3] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_table_name)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (kw_args > 0 && likely(kw_args <= 3)) {
        Py_ssize_t index;
        for (index = 1; index < 4 && kw_args > 0; index++) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]);
          if (value) { values[index] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "row") < 0)) __PYX_ERR(0, 530, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_table_name = ((PyObject*)values[0]);
    __pyx_v_symbols = values[1];
    __pyx_v_columns = values[2];
    __pyx_v_at = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("row", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 530, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.row", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_table_name), (&PyUnicode_Type), 1, "table_name", 1))) __PYX_ERR(0, 532, __pyx_L1_error)
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_14row(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self), __pyx_v_table_name, __pyx_v_symbols, __pyx_v_columns, __pyx_v_at);
 539:         """
 540:         Add a single row (line) to the buffer.
 541: 
 542:         At least one ``symbols`` or ``columns`` must be specified.
 543: 
 544:         .. code-block:: python
 545: 
 546:             # All fields specified.
 547:             buffer.row(
 548:                 'table_name',
 549:                 symbols={'sym1': 'abc', 'sym2': 'def'},
 550:                 columns={
 551:                     'col1': True,
 552:                     'col2': 123,
 553:                     'col3': 3.14,
 554:                     'col4': 'xyz',
 555:                     'col5': TimestampMicros(123456789),
 556:                     'col6': datetime(2019, 1, 1, 12, 0, 0)},
 557:                 at=TimestampNanos(123456789))
 558: 
 559:             # Only symbols specified. Designated timestamp assigned by the db.
 560:             buffer.row(
 561:                 'table_name',
 562:                 symbols={'sym1': 'abc', 'sym2': 'def'})
 563: 
 564:             # Float columns and timestamp specified as `datetime.datetime`.
 565:             # Pay special attention to the timezone, which if unspecified is
 566:             # assumed to be the local timezone (and not UTC).
 567:             buffer.row(
 568:                 'sensor data',
 569:                 columns={
 570:                     'temperature': 24.5,
 571:                     'humidity': 0.5},
 572:                 at=datetime.datetime.utcnow())
 573: 
 574:         :param table_name: The name of the table to which the row belongs.
 575:         :param symbols: A dictionary of symbol column names to ``str`` values.
 576:         :param columns: A dictionary of column names to ``bool``, ``int``,
 577:             ``float``, ``str``, ``TimestampMicros`` or ``datetime`` values.
 578:         :param at: The timestamp of the row. If ``None``, timestamp is assigned
 579:             by the server. If ``datetime``, the timestamp is converted to
 580:             nanoseconds. A nanosecond unix epoch timestamp can be passed
 581:             explicitly as a ``TimestampNanos`` object.
 582:         """
+583:         self._row(table_name, symbols, columns, at)
  if (!(likely(PyDict_CheckExact(__pyx_v_symbols))||((__pyx_v_symbols) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_symbols)->tp_name), 0))) __PYX_ERR(0, 583, __pyx_L1_error)
  if (!(likely(PyDict_CheckExact(__pyx_v_columns))||((__pyx_v_columns) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_columns)->tp_name), 0))) __PYX_ERR(0, 583, __pyx_L1_error)
  __pyx_t_2.__pyx_n = 3;
  __pyx_t_2.symbols = ((PyObject*)__pyx_v_symbols);
  __pyx_t_2.columns = ((PyObject*)__pyx_v_columns);
  __pyx_t_2.at = __pyx_v_at;
  __pyx_t_1 = ((struct __pyx_vtabstruct_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self->__pyx_vtab)->_row(__pyx_v_self, __pyx_v_table_name, &__pyx_t_2); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 583, __pyx_L1_error)
+584:         return self
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;
 585: 
+586:     def tabular(
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_17tabular(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7questdb_3ilp_16LineSenderBuffer_16tabular[] = "\n        Add multiple rows as an iterable of iterables (e.g. list of lists) to\n        the buffer.\n\n        **Data and header**\n\n        The ``data`` argument specifies rows which must all be for the same\n        table. Column names are provided as the ``header``.\n\n        .. code-block:: python\n\n            buffer.tabular(\n                'table_name',\n                [[True, 123, 3.14, 'xyz'],\n                 [False, 456, 6.28, 'abc'],\n                 [True, 789, 9.87, 'def']],\n                header=['col1', 'col2', 'col3', 'col4'])\n\n        **Designated Timestamp Column**\n\n        QuestDB supports a special `designated timestamp\n        <https://questdb.io/docs/concept/designated-timestamp/>`_ column that it\n        uses to sort the rows by timestamp.\n\n        If the data section contains the same number of columns as the header,\n        then the designated is going to be\n        assigned by the server, unless specified for all columns the `at`\n        argument as either an integer wrapped in a ``TimestampNanos`` object\n        representing nanoseconds since unix epoch (1970-01-01 00:00:00 UTC) or\n        as a ``datetime.datetime`` object.\n\n        .. code-block:: python\n\n            buffer.tabular(\n                'table_name',\n                [[True, 123, 3.14, 'xyz'],\n                 [False, 456, 6.28, 'abc'],\n                 [True, 789, 9.87, 'def']],\n                header=['col1', 'col2', 'col3', 'col4'],\n                at=datetime.datetime.utcnow())\n\n                # or ...\n                # at=TimestampNanos(1657386397157631000))\n\n        If the rows need different `designated timestamp\n        <https://questdb.io/docs/concept/designated-timestamp/>`_ values across\n        different rows, you can provide them as an additional unlabeled column.\n        An unlabled column is one that has its name set to ``None``.\n\n        .. code-block:: python\n\n            ts1 = datetime.datetime.utcnow()\n         ""   ts2 = (\n                datetime.datetime.utcnow() +\n                datetime.timedelta(microseconds=1))\n            buffer.tabular(\n                'table_name',\n                [[True, 123, ts1],\n                 [False, 456, ts2]],\n                header=['col1', 'col2', None])\n\n        Like the ``at`` argument, the designated timestamp column may also be\n        specified as ``TimestampNanos`` objects.\n\n        .. code-block:: python\n\n            buffer.tabular(\n                'table_name',\n                [[True, 123, TimestampNanos(1657386397157630000)],\n                 [False, 456, TimestampNanos(1657386397157631000)]],\n                header=['col1', 'col2', None])\n\n        The designated timestamp column may appear anywhere positionally.\n\n        .. code-block:: python\n\n            ts1 = datetime.datetime.utcnow()\n            ts2 = (\n                datetime.datetime.utcnow() +\n                datetime.timedelta(microseconds=1))\n            buffer.tabular(\n                'table_name',\n                [[1000, ts1, 123],\n                 [2000, ts2, 456]],\n                header=['col1', None, 'col2'])\n\n        **Other timestamp columns**\n\n        Other columns may also contain timestamps. These columns can take\n        ``datetime.datetime`` objects or ``TimestampMicros`` (*not nanos*)\n        objects.\n\n        .. code-block:: python\n\n            ts1 = datetime.datetime.utcnow()\n            ts2 = (\n                datetime.datetime.utcnow() +\n                datetime.timedelta(microseconds=1))\n            buffer.tabular(\n                'table_name',\n                [[1000, ts1, 123],\n                 [2000, ts2, 456]],\n                header=['col1', 'col2', 'col3'],\n                at=datetime.datetime.utcnow())\n\n        **Symbol Columns**\n\n        QuestDB can represent strings via the ``STRING`` or ``SYMBOL`` types.\n\n        If all the columns of type ``str`` are to be treated as ``STRING``, th""en\n        specify ``symbols=False`` (default - see exaples above).\n\n        If all need to be treated as ``SYMBOL`` specify ``symbols=True``.\n\n        .. code-block:: python\n\n            buffer.tabular(\n                'table_name',\n                [['abc', 123, 3.14, 'xyz'],\n                 ['def', 456, 6.28, 'abc'],\n                 ['ghi', 789, 9.87, 'def']],\n                header=['col1', 'col2', 'col3', 'col4'],\n                symbols=True)  # `col1` and `col4` are SYMBOL columns.\n\n        Whilst if only a select few are to be treated as ``SYMBOL``, specify a\n        list of column indices to the ``symbols`` arg.\n\n        .. code-block:: python\n\n            buffer.tabular(\n                'table_name',\n                [['abc', 123, 3.14, 'xyz'],\n                 ['def', 456, 6.28, 'abc'],\n                 ['ghi', 789, 9.87, 'def']],\n                header=['col1', 'col2', 'col3', 'col4'],\n                symbols=[0])  # `col1` is SYMBOL; 'col4' is STRING.\n\n        Note that column indices are 0-based and negative indices are counted\n        from the end.\n        ";
static PyObject *__pyx_pw_7questdb_3ilp_16LineSenderBuffer_17tabular(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED PyObject *__pyx_v_table_name = 0;
  CYTHON_UNUSED PyObject *__pyx_v_data = 0;
  CYTHON_UNUSED PyObject *__pyx_v_header = 0;
  CYTHON_UNUSED PyObject *__pyx_v_symbols = 0;
  CYTHON_UNUSED PyObject *__pyx_v_at = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tabular (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_table_name,&__pyx_n_s_data,&__pyx_n_s_header,&__pyx_n_s_symbols,&__pyx_n_s_at,0};
    PyObject* values[5] = {0,0,0,0,0};
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_16LineSenderBuffer_16tabular(CYTHON_UNUSED struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_table_name, CYTHON_UNUSED PyObject *__pyx_v_data, CYTHON_UNUSED PyObject *__pyx_v_header, CYTHON_UNUSED PyObject *__pyx_v_symbols, CYTHON_UNUSED PyObject *__pyx_v_at) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tabular", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.tabular", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 587:             self,
 588:             table_name: str,
 589:             data: Iterable[Iterable[Union[
 590:                 bool, int, float, str,
 591:                 TimestampMicros, TimestampNanos, datetime]]],
 592:             *,
+593:             header: Optional[List[Optional[str]]]=None,
    values[2] = ((PyObject *)Py_None);
+594:             symbols: Union[bool, List[int]]=False,
    values[3] = ((PyObject *)Py_False);
+595:             at: Union[None, TimestampNanos, datetime]=None):
    values[4] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_table_name)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tabular", 1, 2, 2, 1); __PYX_ERR(0, 586, __pyx_L3_error)
        }
      }
      if (kw_args > 0 && likely(kw_args <= 3)) {
        Py_ssize_t index;
        for (index = 2; index < 5 && kw_args > 0; index++) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]);
          if (value) { values[index] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tabular") < 0)) __PYX_ERR(0, 586, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_table_name = ((PyObject*)values[0]);
    __pyx_v_data = values[1];
    __pyx_v_header = values[2];
    __pyx_v_symbols = values[3];
    __pyx_v_at = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tabular", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 586, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSenderBuffer.tabular", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_table_name), (&PyUnicode_Type), 1, "table_name", 1))) __PYX_ERR(0, 588, __pyx_L1_error)
  __pyx_r = __pyx_pf_7questdb_3ilp_16LineSenderBuffer_16tabular(((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_v_self), __pyx_v_table_name, __pyx_v_data, __pyx_v_header, __pyx_v_symbols, __pyx_v_at);
 596:         """
 597:         Add multiple rows as an iterable of iterables (e.g. list of lists) to
 598:         the buffer.
 599: 
 600:         **Data and header**
 601: 
 602:         The ``data`` argument specifies rows which must all be for the same
 603:         table. Column names are provided as the ``header``.
 604: 
 605:         .. code-block:: python
 606: 
 607:             buffer.tabular(
 608:                 'table_name',
 609:                 [[True, 123, 3.14, 'xyz'],
 610:                  [False, 456, 6.28, 'abc'],
 611:                  [True, 789, 9.87, 'def']],
 612:                 header=['col1', 'col2', 'col3', 'col4'])
 613: 
 614:         **Designated Timestamp Column**
 615: 
 616:         QuestDB supports a special `designated timestamp
 617:         <https://questdb.io/docs/concept/designated-timestamp/>`_ column that it
 618:         uses to sort the rows by timestamp.
 619: 
 620:         If the data section contains the same number of columns as the header,
 621:         then the designated is going to be
 622:         assigned by the server, unless specified for all columns the `at`
 623:         argument as either an integer wrapped in a ``TimestampNanos`` object
 624:         representing nanoseconds since unix epoch (1970-01-01 00:00:00 UTC) or
 625:         as a ``datetime.datetime`` object.
 626: 
 627:         .. code-block:: python
 628: 
 629:             buffer.tabular(
 630:                 'table_name',
 631:                 [[True, 123, 3.14, 'xyz'],
 632:                  [False, 456, 6.28, 'abc'],
 633:                  [True, 789, 9.87, 'def']],
 634:                 header=['col1', 'col2', 'col3', 'col4'],
 635:                 at=datetime.datetime.utcnow())
 636: 
 637:                 # or ...
 638:                 # at=TimestampNanos(1657386397157631000))
 639: 
 640:         If the rows need different `designated timestamp
 641:         <https://questdb.io/docs/concept/designated-timestamp/>`_ values across
 642:         different rows, you can provide them as an additional unlabeled column.
 643:         An unlabled column is one that has its name set to ``None``.
 644: 
 645:         .. code-block:: python
 646: 
 647:             ts1 = datetime.datetime.utcnow()
 648:             ts2 = (
 649:                 datetime.datetime.utcnow() +
 650:                 datetime.timedelta(microseconds=1))
 651:             buffer.tabular(
 652:                 'table_name',
 653:                 [[True, 123, ts1],
 654:                  [False, 456, ts2]],
 655:                 header=['col1', 'col2', None])
 656: 
 657:         Like the ``at`` argument, the designated timestamp column may also be
 658:         specified as ``TimestampNanos`` objects.
 659: 
 660:         .. code-block:: python
 661: 
 662:             buffer.tabular(
 663:                 'table_name',
 664:                 [[True, 123, TimestampNanos(1657386397157630000)],
 665:                  [False, 456, TimestampNanos(1657386397157631000)]],
 666:                 header=['col1', 'col2', None])
 667: 
 668:         The designated timestamp column may appear anywhere positionally.
 669: 
 670:         .. code-block:: python
 671: 
 672:             ts1 = datetime.datetime.utcnow()
 673:             ts2 = (
 674:                 datetime.datetime.utcnow() +
 675:                 datetime.timedelta(microseconds=1))
 676:             buffer.tabular(
 677:                 'table_name',
 678:                 [[1000, ts1, 123],
 679:                  [2000, ts2, 456]],
 680:                 header=['col1', None, 'col2'])
 681: 
 682:         **Other timestamp columns**
 683: 
 684:         Other columns may also contain timestamps. These columns can take
 685:         ``datetime.datetime`` objects or ``TimestampMicros`` (*not nanos*)
 686:         objects.
 687: 
 688:         .. code-block:: python
 689: 
 690:             ts1 = datetime.datetime.utcnow()
 691:             ts2 = (
 692:                 datetime.datetime.utcnow() +
 693:                 datetime.timedelta(microseconds=1))
 694:             buffer.tabular(
 695:                 'table_name',
 696:                 [[1000, ts1, 123],
 697:                  [2000, ts2, 456]],
 698:                 header=['col1', 'col2', 'col3'],
 699:                 at=datetime.datetime.utcnow())
 700: 
 701:         **Symbol Columns**
 702: 
 703:         QuestDB can represent strings via the ``STRING`` or ``SYMBOL`` types.
 704: 
 705:         If all the columns of type ``str`` are to be treated as ``STRING``, then
 706:         specify ``symbols=False`` (default - see exaples above).
 707: 
 708:         If all need to be treated as ``SYMBOL`` specify ``symbols=True``.
 709: 
 710:         .. code-block:: python
 711: 
 712:             buffer.tabular(
 713:                 'table_name',
 714:                 [['abc', 123, 3.14, 'xyz'],
 715:                  ['def', 456, 6.28, 'abc'],
 716:                  ['ghi', 789, 9.87, 'def']],
 717:                 header=['col1', 'col2', 'col3', 'col4'],
 718:                 symbols=True)  # `col1` and `col4` are SYMBOL columns.
 719: 
 720:         Whilst if only a select few are to be treated as ``SYMBOL``, specify a
 721:         list of column indices to the ``symbols`` arg.
 722: 
 723:         .. code-block:: python
 724: 
 725:             buffer.tabular(
 726:                 'table_name',
 727:                 [['abc', 123, 3.14, 'xyz'],
 728:                  ['def', 456, 6.28, 'abc'],
 729:                  ['ghi', 789, 9.87, 'def']],
 730:                 header=['col1', 'col2', 'col3', 'col4'],
 731:                 symbols=[0])  # `col1` is SYMBOL; 'col4' is STRING.
 732: 
 733:         Note that column indices are 0-based and negative indices are counted
 734:         from the end.
 735:         """
+736:         raise ValueError('nyi')
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 736, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __PYX_ERR(0, 736, __pyx_L1_error)
/* … */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_n_u_nyi); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 736, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
 737: 
 738:     # def pandas(
 739:     #         self,
 740:     #         table_name: str,
 741:     #         data: pd.DataFrame,
 742:     #         *,
 743:     #         symbols: Union[bool, List[int]]=False,
 744:     #         at: Union[None, TimestampNanos, datetime]=None):
 745:     #     """
 746:     #     Add a pandas DataFrame to the buffer.
 747:     #     """
 748:     #     raise ValueError('nyi')
 749: 
 750: 
+751: cdef class LineSender:
struct __pyx_obj_7questdb_3ilp_LineSender {
  PyObject_HEAD
  struct __pyx_vtabstruct_7questdb_3ilp_LineSender *__pyx_vtab;
  struct line_sender_opts *_opts;
  struct line_sender *_impl;
  struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *_buffer;
};
/* … */
struct __pyx_vtabstruct_7questdb_3ilp_LineSender {
  PyObject *(*flush)(struct __pyx_obj_7questdb_3ilp_LineSender *, struct __pyx_opt_args_7questdb_3ilp_10LineSender_flush *__pyx_optional_args);
  PyObject *(*close)(struct __pyx_obj_7questdb_3ilp_LineSender *, int __pyx_skip_dispatch, struct __pyx_opt_args_7questdb_3ilp_10LineSender_close *__pyx_optional_args);
};
static struct __pyx_vtabstruct_7questdb_3ilp_LineSender *__pyx_vtabptr_7questdb_3ilp_LineSender;
 752:     cdef line_sender_opts* _opts
 753:     cdef line_sender* _impl
 754:     cdef LineSenderBuffer _buffer
 755: 
+756:     def __cinit__(self, str host, object port):
/* Python wrapper */
static int __pyx_pw_7questdb_3ilp_10LineSender_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7questdb_3ilp_10LineSender_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_host = 0;
  PyObject *__pyx_v_port = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_host,&__pyx_n_s_port,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_host)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_port)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(0, 756, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 756, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_host = ((PyObject*)values[0]);
    __pyx_v_port = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 756, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSender.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_host), (&PyUnicode_Type), 1, "host", 1))) __PYX_ERR(0, 756, __pyx_L1_error)
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender___cinit__(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self), __pyx_v_host, __pyx_v_port);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_7questdb_3ilp_10LineSender___cinit__(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self, PyObject *__pyx_v_host, PyObject *__pyx_v_port) {
  CYTHON_UNUSED struct line_sender_error *__pyx_v_err;
  PyObject *__pyx_v_port_str = 0;
  struct line_sender_utf8 __pyx_v_host_utf8;
  CYTHON_UNUSED PyObject *__pyx_v_host_owner = 0;
  struct line_sender_utf8 __pyx_v_port_utf8;
  CYTHON_UNUSED PyObject *__pyx_v_port_owner = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("questdb.ilp.LineSender.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_port_str);
  __Pyx_XDECREF(__pyx_v_host_owner);
  __Pyx_XDECREF(__pyx_v_port_owner);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+757:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
 758:         cdef str port_str
 759:         cdef line_sender_utf8 host_utf8
 760:         cdef bytes host_owner
 761:         cdef line_sender_utf8 port_utf8
 762:         cdef bytes port_owner
 763: 
+764:         self._opts = NULL
  __pyx_v_self->_opts = NULL;
+765:         self._impl = NULL
  __pyx_v_self->_impl = NULL;
+766:         self._buffer = None
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_buffer);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_buffer));
  __pyx_v_self->_buffer = ((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)Py_None);
 767: 
+768:         if isinstance(port, int):
  __pyx_t_1 = PyInt_Check(__pyx_v_port); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
    goto __pyx_L3;
  }
+769:             port_str = str(port)
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_port); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_v_port_str = ((PyObject*)__pyx_t_3);
    __pyx_t_3 = 0;
+770:         elif isinstance(port, str):
  __pyx_t_2 = PyUnicode_Check(__pyx_v_port); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (likely(__pyx_t_1)) {
/* … */
    goto __pyx_L3;
  }
+771:             port_str = port
    if (!(likely(PyUnicode_CheckExact(__pyx_v_port))||((__pyx_v_port) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_port)->tp_name), 0))) __PYX_ERR(0, 771, __pyx_L1_error)
    __pyx_t_3 = __pyx_v_port;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_v_port_str = ((PyObject*)__pyx_t_3);
    __pyx_t_3 = 0;
 772:         else:
+773:             raise TypeError(
  /*else*/ {
/* … */
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 773, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 773, __pyx_L1_error)
  }
  __pyx_L3:;
+774:                 f'port must be an integer or a string, not {type(port)}')
    __pyx_t_3 = __Pyx_PyObject_FormatSimple(((PyObject *)Py_TYPE(__pyx_v_port)), __pyx_empty_unicode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 774, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyUnicode_Concat(__pyx_kp_u_port_must_be_an_integer_or_a_str, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 774, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 775: 
+776:         host_owner = str_to_utf8(host, &host_utf8)
  __pyx_t_3 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_host, (&__pyx_v_host_utf8)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_host_owner = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;
+777:         port_owner = str_to_utf8(port_str, &port_utf8)
  __pyx_t_3 = __pyx_f_7questdb_3ilp_str_to_utf8(__pyx_v_port_str, (&__pyx_v_port_utf8)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 777, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_port_owner = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;
+778:         self._opts = line_sender_opts_new_service(host_utf8, port_utf8)
  __pyx_v_self->_opts = line_sender_opts_new_service(__pyx_v_host_utf8, __pyx_v_port_utf8);
+779:         self._buffer = LineSenderBuffer()
  __pyx_t_3 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7questdb_3ilp_LineSenderBuffer)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->_buffer);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_buffer));
  __pyx_v_self->_buffer = ((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)__pyx_t_3);
  __pyx_t_3 = 0;
 780: 
+781:     def connect(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_3connect(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_3connect(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("connect (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender_2connect(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_10LineSender_2connect(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self) {
  struct line_sender_error *__pyx_v_err;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("connect", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("questdb.ilp.LineSender.connect", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+782:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+783:         if self._opts == NULL:
  __pyx_t_1 = ((__pyx_v_self->_opts == NULL) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+784:             raise IlpError(
    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_IlpError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 784, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
+785:                 IlpErrorCode.InvalidApiCall,
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 785, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_InvalidApiCall); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 785, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    __pyx_t_6 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_6 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_5, __pyx_kp_u_connect_can_t_be_called_after_cl};
      __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 784, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_5, __pyx_kp_u_connect_can_t_be_called_after_cl};
      __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 784, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 784, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_t_5);
      __Pyx_INCREF(__pyx_kp_u_connect_can_t_be_called_after_cl);
      __Pyx_GIVEREF(__pyx_kp_u_connect_can_t_be_called_after_cl);
      PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_kp_u_connect_can_t_be_called_after_cl);
      __pyx_t_5 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 784, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 784, __pyx_L1_error)
 786:                 'connect() can\'t be called after close().')
+787:         self._impl = line_sender_connect(self._opts, &err)
  __pyx_v_self->_impl = line_sender_connect(__pyx_v_self->_opts, (&__pyx_v_err));
+788:         if self._impl == NULL:
  __pyx_t_1 = ((__pyx_v_self->_impl == NULL) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+789:             raise c_err_to_py(err)
    __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 789, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 789, __pyx_L1_error)
+790:         line_sender_opts_free(self._opts)
  line_sender_opts_free(__pyx_v_self->_opts);
+791:         self._opts = NULL
  __pyx_v_self->_opts = NULL;
 792:         # self._buffer._row_complete_cb = may_flush_on_row_complete
 793:         # self._buffer._row_complete_ctx = self
 794: 
+795:     def __enter__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_5__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_5__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__enter__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender_4__enter__(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_10LineSender_4__enter__(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__enter__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("questdb.ilp.LineSender.__enter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+796:         self.connect()
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_connect); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+797:         return self
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;
 798: 
 799:     @property
+800:     def buffer(self):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_6buffer_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_6buffer_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender_6buffer___get__(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_10LineSender_6buffer___get__(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+801:         return self._buffer
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self->_buffer));
  __pyx_r = ((PyObject *)__pyx_v_self->_buffer);
  goto __pyx_L0;
 802: 
+803:     cdef flush(self, LineSenderBuffer buffer=None, bint clear=True):
static PyObject *__pyx_f_7questdb_3ilp_10LineSender_flush(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self, struct __pyx_opt_args_7questdb_3ilp_10LineSender_flush *__pyx_optional_args) {
  struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *__pyx_v_buffer = ((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)Py_None);
  int __pyx_v_clear = ((int)1);
  struct line_sender_error *__pyx_v_err;
  struct line_sender_buffer *__pyx_v_c_buf;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("flush", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_buffer = __pyx_optional_args->buffer;
      if (__pyx_optional_args->__pyx_n > 1) {
        __pyx_v_clear = __pyx_optional_args->clear;
      }
    }
  }
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("questdb.ilp.LineSender.flush", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_7questdb_3ilp_10LineSender_flush {
  int __pyx_n;
  struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *buffer;
  int clear;
};
+804:         cdef line_sender_error* err = NULL
  __pyx_v_err = NULL;
+805:         cdef line_sender_buffer* c_buf = NULL
  __pyx_v_c_buf = NULL;
+806:         if self._impl == NULL:
  __pyx_t_1 = ((__pyx_v_self->_impl == NULL) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+807:             raise IlpError(
    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_IlpError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 807, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
+808:                 IlpErrorCode.InvalidApiCall,
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_IlpErrorCode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 808, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_InvalidApiCall); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 808, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    __pyx_t_6 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_6 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_5, __pyx_kp_u_flush_can_t_be_called_after_clos};
      __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 807, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_5, __pyx_kp_u_flush_can_t_be_called_after_clos};
      __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 807, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 807, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_t_5);
      __Pyx_INCREF(__pyx_kp_u_flush_can_t_be_called_after_clos);
      __Pyx_GIVEREF(__pyx_kp_u_flush_can_t_be_called_after_clos);
      PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_kp_u_flush_can_t_be_called_after_clos);
      __pyx_t_5 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 807, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 807, __pyx_L1_error)
 809:                 'flush() can\'t be called after close().')
+810:         if buffer is not None:
  __pyx_t_1 = (((PyObject *)__pyx_v_buffer) != Py_None);
  __pyx_t_8 = (__pyx_t_1 != 0);
  if (__pyx_t_8) {
/* … */
    goto __pyx_L4;
  }
+811:             c_buf = buffer._impl
    __pyx_t_9 = __pyx_v_buffer->_impl;
    __pyx_v_c_buf = __pyx_t_9;
 812:         else:
+813:             c_buf = self._buffer._impl
  /*else*/ {
    __pyx_t_9 = __pyx_v_self->_buffer->_impl;
    __pyx_v_c_buf = __pyx_t_9;
  }
  __pyx_L4:;
+814:         if line_sender_buffer_size(c_buf) == 0:
  __pyx_t_8 = ((line_sender_buffer_size(__pyx_v_c_buf) == 0) != 0);
  if (__pyx_t_8) {
/* … */
  }
+815:             return
    __Pyx_XDECREF(__pyx_r);
    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
    goto __pyx_L0;
 816: 
+817:         try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    goto __pyx_L11_try_end;
    __pyx_L6_error:;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
/* … */
    __Pyx_XGIVEREF(__pyx_t_10);
    __Pyx_XGIVEREF(__pyx_t_11);
    __Pyx_XGIVEREF(__pyx_t_12);
    __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
    goto __pyx_L1_error;
    __pyx_L11_try_end:;
  }
+818:             if clear:
      __pyx_t_8 = (__pyx_v_clear != 0);
      if (__pyx_t_8) {
/* … */
        goto __pyx_L12;
      }
+819:                 if not line_sender_flush(self._impl, c_buf, &err):
        __pyx_t_8 = ((!(line_sender_flush(__pyx_v_self->_impl, __pyx_v_c_buf, (&__pyx_v_err)) != 0)) != 0);
        if (unlikely(__pyx_t_8)) {
/* … */
        }
+820:                     raise c_err_to_py(err)
          __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 820, __pyx_L6_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_Raise(__pyx_t_2, 0, 0, 0);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
          __PYX_ERR(0, 820, __pyx_L6_error)
 821:             else:
+822:                 if not line_sender_flush_and_keep(self._impl, c_buf, &err):
      /*else*/ {
        __pyx_t_8 = ((!(line_sender_flush_and_keep(__pyx_v_self->_impl, __pyx_v_c_buf, (&__pyx_v_err)) != 0)) != 0);
        if (unlikely(__pyx_t_8)) {
/* … */
        }
      }
      __pyx_L12:;
+823:                     raise c_err_to_py(err)
          __pyx_t_2 = __pyx_f_7questdb_3ilp_c_err_to_py(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 823, __pyx_L6_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_Raise(__pyx_t_2, 0, 0, 0);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
          __PYX_ERR(0, 823, __pyx_L6_error)
+824:         except:
    /*except:*/ {
      __Pyx_AddTraceback("questdb.ilp.LineSender.flush", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_7) < 0) __PYX_ERR(0, 824, __pyx_L8_except_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_t_7);
 825:             # Prevent a follow-up call to `.close(flush=True)` (as is usually
 826:             # called from `__exit__`) to raise after the sender entered an error
 827:             # state following a failed call to `.flush()`.
+828:             if c_buf == self._buffer._impl:
      __pyx_t_8 = ((__pyx_v_c_buf == __pyx_v_self->_buffer->_impl) != 0);
      if (__pyx_t_8) {
/* … */
      }
+829:                 line_sender_buffer_clear(c_buf)
        line_sender_buffer_clear(__pyx_v_c_buf);
+830:             raise
      __Pyx_GIVEREF(__pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_XGIVEREF(__pyx_t_7);
      __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_7);
      __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_7 = 0; 
      __PYX_ERR(0, 830, __pyx_L8_except_error)
    }
    __pyx_L8_except_error:;
 831: 
+832:     cpdef close(self, bint flush=True):
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_7close(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_7questdb_3ilp_10LineSender_close(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_7questdb_3ilp_10LineSender_close *__pyx_optional_args) {
  int __pyx_v_flush = ((int)1);
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("close", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_flush = __pyx_optional_args->flush;
    }
  }
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {
    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
      PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
      #endif
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 832, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)(void*)__pyx_pw_7questdb_3ilp_10LineSender_7close)) {
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_flush); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 832, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_1);
        __pyx_t_4 = __pyx_t_1; __pyx_t_5 = NULL;
        if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
          if (likely(__pyx_t_5)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
            __Pyx_INCREF(__pyx_t_5);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_4, function);
          }
        }
        __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3);
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 832, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_r = __pyx_t_2;
        __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
      }
      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
      if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) {
        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
      }
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
    }
    #endif
  }
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("questdb.ilp.LineSender.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_7close(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_7close(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  int __pyx_v_flush;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("close (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flush,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flush);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "close") < 0)) __PYX_ERR(0, 832, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    if (values[0]) {
      __pyx_v_flush = __Pyx_PyObject_IsTrue(values[0]); if (unlikely((__pyx_v_flush == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 832, __pyx_L3_error)
    } else {
      __pyx_v_flush = ((int)1);
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("close", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 832, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSender.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender_6close(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self), __pyx_v_flush);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_10LineSender_6close(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self, int __pyx_v_flush) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("close", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2.__pyx_n = 1;
  __pyx_t_2.flush = __pyx_v_flush;
  __pyx_t_1 = __pyx_vtabptr_7questdb_3ilp_LineSender->close(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 832, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("questdb.ilp.LineSender.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_7questdb_3ilp_10LineSender_close {
  int __pyx_n;
  int flush;
};
+833:         self._buffer._row_complete_cb = NULL
  __pyx_v_self->_buffer->_row_complete_cb = NULL;
+834:         self._buffer._row_complete_ctx = NULL
  __pyx_v_self->_buffer->_row_complete_ctx = NULL;
+835:         line_sender_opts_free(self._opts)
  line_sender_opts_free(__pyx_v_self->_opts);
+836:         self._opts = NULL
  __pyx_v_self->_opts = NULL;
+837:         try:
  /*try:*/ {
+838:             if (flush and (self._impl != NULL) and
    __pyx_t_7 = (__pyx_v_flush != 0);
    if (__pyx_t_7) {
    } else {
      __pyx_t_6 = __pyx_t_7;
      goto __pyx_L7_bool_binop_done;
    }
    __pyx_t_7 = ((__pyx_v_self->_impl != NULL) != 0);
    if (__pyx_t_7) {
    } else {
      __pyx_t_6 = __pyx_t_7;
      goto __pyx_L7_bool_binop_done;
    }
/* … */
    if (__pyx_t_6) {
/* … */
    }
  }
+839:                     (not line_sender_must_close(self._impl))):
    __pyx_t_7 = ((!(line_sender_must_close(__pyx_v_self->_impl) != 0)) != 0);
    __pyx_t_6 = __pyx_t_7;
    __pyx_L7_bool_binop_done:;
+840:                 self.flush(None, True)
      __pyx_t_8.__pyx_n = 2;
      __pyx_t_8.buffer = ((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)Py_None);
      __pyx_t_8.clear = 1;
      __pyx_t_1 = ((struct __pyx_vtabstruct_7questdb_3ilp_LineSender *)__pyx_v_self->__pyx_vtab)->flush(__pyx_v_self, &__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 840, __pyx_L4_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 841:         finally:
+842:             line_sender_close(self._impl)
  /*finally:*/ {
    /*normal exit:*/{
      line_sender_close(__pyx_v_self->_impl);
      goto __pyx_L5;
    }
    __pyx_L4_error:;
    /*exception exit:*/{
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0;
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17);
      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14) < 0)) __Pyx_ErrFetch(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14);
      __Pyx_XGOTREF(__pyx_t_12);
      __Pyx_XGOTREF(__pyx_t_13);
      __Pyx_XGOTREF(__pyx_t_14);
      __Pyx_XGOTREF(__pyx_t_15);
      __Pyx_XGOTREF(__pyx_t_16);
      __Pyx_XGOTREF(__pyx_t_17);
      __pyx_t_9 = __pyx_lineno; __pyx_t_10 = __pyx_clineno; __pyx_t_11 = __pyx_filename;
      {
        line_sender_close(__pyx_v_self->_impl);
      }
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_15);
        __Pyx_XGIVEREF(__pyx_t_16);
        __Pyx_XGIVEREF(__pyx_t_17);
        __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17);
      }
      __Pyx_XGIVEREF(__pyx_t_12);
      __Pyx_XGIVEREF(__pyx_t_13);
      __Pyx_XGIVEREF(__pyx_t_14);
      __Pyx_ErrRestore(__pyx_t_12, __pyx_t_13, __pyx_t_14);
      __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0;
      __pyx_lineno = __pyx_t_9; __pyx_clineno = __pyx_t_10; __pyx_filename = __pyx_t_11;
      goto __pyx_L1_error;
    }
    __pyx_L5:;
  }
+843:         self._impl = NULL
  __pyx_v_self->_impl = NULL;
+844:         self._buffer = None
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_buffer);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->_buffer));
  __pyx_v_self->_buffer = ((struct __pyx_obj_7questdb_3ilp_LineSenderBuffer *)Py_None);
 845: 
+846:     def __exit__(self, exc_type, _exc_val, _exc_tb):
/* Python wrapper */
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_9__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_7questdb_3ilp_10LineSender_9__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_exc_type = 0;
  CYTHON_UNUSED PyObject *__pyx_v__exc_val = 0;
  CYTHON_UNUSED PyObject *__pyx_v__exc_tb = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__exit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_exc_type,&__pyx_n_s_exc_val,&__pyx_n_s_exc_tb,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_exc_type)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_exc_val)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 1); __PYX_ERR(0, 846, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_exc_tb)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 2); __PYX_ERR(0, 846, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__exit__") < 0)) __PYX_ERR(0, 846, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_exc_type = values[0];
    __pyx_v__exc_val = values[1];
    __pyx_v__exc_tb = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 846, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("questdb.ilp.LineSender.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7questdb_3ilp_10LineSender_8__exit__(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self), __pyx_v_exc_type, __pyx_v__exc_val, __pyx_v__exc_tb);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7questdb_3ilp_10LineSender_8__exit__(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self, PyObject *__pyx_v_exc_type, CYTHON_UNUSED PyObject *__pyx_v__exc_val, CYTHON_UNUSED PyObject *__pyx_v__exc_tb) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__exit__", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("questdb.ilp.LineSender.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+847:         self.close(not exc_type)
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_exc_type); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 847, __pyx_L1_error)
  __pyx_t_3.__pyx_n = 1;
  __pyx_t_3.flush = (!__pyx_t_1);
  __pyx_t_2 = ((struct __pyx_vtabstruct_7questdb_3ilp_LineSender *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0, &__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 847, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 848: 
+849:     def __dealloc__(self):
/* Python wrapper */
static void __pyx_pw_7questdb_3ilp_10LineSender_11__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7questdb_3ilp_10LineSender_11__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_7questdb_3ilp_10LineSender_10__dealloc__(((struct __pyx_obj_7questdb_3ilp_LineSender *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_7questdb_3ilp_10LineSender_10__dealloc__(struct __pyx_obj_7questdb_3ilp_LineSender *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_WriteUnraisable("questdb.ilp.LineSender.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
+850:         self.close(False)
  __pyx_t_2.__pyx_n = 1;
  __pyx_t_2.flush = 0;
  __pyx_t_1 = ((struct __pyx_vtabstruct_7questdb_3ilp_LineSender *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 850, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 851: 
 852: 
 853: # cdef int may_flush_on_row_complete(
 854: #         line_sender_buffer* buf,
 855: #         void* ctx) except -1:
 856: #     pass