Module taos.result

Expand source code
from .cinterface import *

# from .connection import TaosConnection
from .error import *

from ctypes import c_void_p


class TaosResult(object):
    """TDengine result interface"""

    def __init__(self, result, close_after=False, conn=None):
        # type: (c_void_p, bool, TaosConnection) -> TaosResult
        # to make the __del__ order right
        self._conn = conn
        self._close_after = close_after
        if isinstance(result, c_void_p):
            self._result = result
        else:
            self._result = c_void_p(result)

        self._fields = None
        self._field_count = None
        self._precision = None

        self._block = None
        self._block_length = None
        self._row_count = 0

    def __iter__(self):
        return self

    def __next__(self):
        return self._next_row()

    def next(self):
        # fetch next row
        return self._next_row()

    def _next_row(self):
        if self._result is None or self.fields is None:
            raise OperationalError("Invalid use of fetch iterator")

        if self._block is None or self._block_iter >= self._block_length:
            self._block, self._block_length = self.fetch_block()
            self._block_iter = 0
            # self._row_count += self._block_length

        raw = self._block[self._block_iter]
        self._block_iter += 1
        self._row_count += 1
        return raw

    @property
    def fields(self):
        """fields definitions of the current result"""
        if self._result is None:
            raise ResultError("no result object")
        if self._fields is None:
            self._fields = taos_fetch_fields(self._result)

        return self._fields

    @property
    def field_count(self):
        """Field count of the current result, eq to taos_field_count(result)"""
        return self.fields.count

    @property
    def row_count(self):
        """Return the rowcount of the object"""
        return self._row_count

    @property
    def precision(self):
        if self._precision is None:
            self._precision = taos_result_precision(self._result)
        return self._precision

    @property
    def affected_rows(self):
        return taos_affected_rows(self._result)

    # @property
    def field_lengths(self):
        return taos_fetch_lengths(self._result, self.field_count)

    def rows_iter(self, num_of_rows=None):
        return TaosRows(self, num_of_rows)

    def blocks_iter(self):
        return TaosBlocks(self)

    def fetch_block(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetch iterator")

        blocks, length = taos_fetch_block(self._result)
        if length == 0:
            raise StopIteration

        return list(map(tuple, zip(*blocks))), length

    def fetch_all(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetchall")

        if self._fields is None:
            self._fields = taos_fetch_fields(self._result)
        buffer = [[] for i in range(len(self._fields))]
        self._row_count = 0
        while True:
            block, num_of_fields = taos_fetch_block(self._result, self._fields)
            errno = taos_errno(self._result)
            if errno != 0:
                raise ProgrammingError(taos_errstr(self._result), errno)
            if num_of_fields == 0:
                break
            self._row_count += num_of_fields
            for i in range(len(self._fields)):
                buffer[i].extend(block[i])
        return list(map(tuple, zip(*buffer)))

    def fetch_all_into_dict(self):
        """Fetch all rows and convert it to dict"""
        names = [field.name for field in self.fields]
        rows = self.fetch_all()
        return list(dict(zip(names, row)) for row in rows)

    def fetch_rows_a(self, callback, param):
        taos_fetch_rows_a(self._result, callback, param)

    def stop_query(self):
        return taos_stop_query(self._result)
    
    def get_topic_name(self):
        return tmq_get_topic_name(self._result)
        
    def get_vgroup_id(self):
        return tmq_get_vgroup_id(self._result)
        
    def get_table_name(self):
        return tmq_get_table_name(self._result)
    
    def get_db_name(self):
        return tmq_get_db_name(self._result)

    def errno(self):
        """**DO NOT** use this directly unless you know what you are doing"""
        return taos_errno(self._result)

    def errstr(self):
        return taos_errstr(self._result)

    def check_error(self, errno=None, close=True):
        if errno is None:
            errno = self.errno()
        if errno != 0:
            msg = self.errstr()
            self.close()
            raise OperationalError(msg, errno)

    def close(self):
        """free result object."""
        if self._result is not None and self._close_after:
            taos_free_result(self._result)
        self._result = None
        self._fields = None
        self._field_count = None
        self._field_lengths = None

    def __del__(self):
        self.close()


class TaosRows:
    """TDengine result rows iterator"""

    def __init__(self, result, num_of_rows=None):
        self._result = result
        self._num_of_rows = num_of_rows

    def __iter__(self):
        return self

    def __next__(self):
        return self._next_row()

    def next(self):
        return self._next_row()

    def _next_row(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetch iterator")
        if self._num_of_rows is not None and self._num_of_rows <= self._result._row_count:
            raise StopIteration

        row = taos_fetch_row_raw(self._result._result)
        if not row:
            raise StopIteration
        self._result._row_count += 1
        return TaosRow(self._result, row)

    @property
    def row_count(self):
        """Return the rowcount of the object"""
        return self._result._row_count


class TaosRow:
    def __init__(self, result, row):
        self._result = result
        self._row = row

    def __str__(self):
        return taos_print_row(self._row, self._result.fields, self._result.field_count)

    def __call__(self):
        return self.as_tuple()

    def _astuple(self):
        return self.as_tuple()

    def __iter__(self):
        return self.as_tuple()

    def as_ptr(self):
        return self._row

    def as_tuple(self):
        precision = self._result.precision
        field_count = self._result.field_count
        blocks = [None] * field_count
        fields = self._result.fields
        field_lens = self._result.field_lengths()
        for i in range(field_count):
            data = ctypes.cast(self._row, ctypes.POINTER(ctypes.c_void_p))[i]
            if fields[i].type not in CONVERT_FUNC:
                raise DatabaseError("Invalid data type returned from database")
            if data is None:
                blocks[i] = None
            else:
                blocks[i] = CONVERT_FUNC[fields[i].type](data, [False], 1, field_lens[i], precision)[0]
        return tuple(blocks)

    def as_dict(self):
        values = self.as_tuple()
        names = self._result.fields
        dict(zip(names, values))


class TaosBlocks:
    """TDengine result blocks iterator"""

    def __init__(self, result):
        self._result = result

    def __iter__(self):
        return self

    def __next__(self):
        return self._result.fetch_block()

    def next(self):
        return self._result.fetch_block()

Classes

class TaosBlocks (result)

TDengine result blocks iterator

Expand source code
class TaosBlocks:
    """TDengine result blocks iterator"""

    def __init__(self, result):
        self._result = result

    def __iter__(self):
        return self

    def __next__(self):
        return self._result.fetch_block()

    def next(self):
        return self._result.fetch_block()

Methods

def next(self)
Expand source code
def next(self):
    return self._result.fetch_block()
class TaosResult (result, close_after=False, conn=None)

TDengine result interface

Expand source code
class TaosResult(object):
    """TDengine result interface"""

    def __init__(self, result, close_after=False, conn=None):
        # type: (c_void_p, bool, TaosConnection) -> TaosResult
        # to make the __del__ order right
        self._conn = conn
        self._close_after = close_after
        if isinstance(result, c_void_p):
            self._result = result
        else:
            self._result = c_void_p(result)

        self._fields = None
        self._field_count = None
        self._precision = None

        self._block = None
        self._block_length = None
        self._row_count = 0

    def __iter__(self):
        return self

    def __next__(self):
        return self._next_row()

    def next(self):
        # fetch next row
        return self._next_row()

    def _next_row(self):
        if self._result is None or self.fields is None:
            raise OperationalError("Invalid use of fetch iterator")

        if self._block is None or self._block_iter >= self._block_length:
            self._block, self._block_length = self.fetch_block()
            self._block_iter = 0
            # self._row_count += self._block_length

        raw = self._block[self._block_iter]
        self._block_iter += 1
        self._row_count += 1
        return raw

    @property
    def fields(self):
        """fields definitions of the current result"""
        if self._result is None:
            raise ResultError("no result object")
        if self._fields is None:
            self._fields = taos_fetch_fields(self._result)

        return self._fields

    @property
    def field_count(self):
        """Field count of the current result, eq to taos_field_count(result)"""
        return self.fields.count

    @property
    def row_count(self):
        """Return the rowcount of the object"""
        return self._row_count

    @property
    def precision(self):
        if self._precision is None:
            self._precision = taos_result_precision(self._result)
        return self._precision

    @property
    def affected_rows(self):
        return taos_affected_rows(self._result)

    # @property
    def field_lengths(self):
        return taos_fetch_lengths(self._result, self.field_count)

    def rows_iter(self, num_of_rows=None):
        return TaosRows(self, num_of_rows)

    def blocks_iter(self):
        return TaosBlocks(self)

    def fetch_block(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetch iterator")

        blocks, length = taos_fetch_block(self._result)
        if length == 0:
            raise StopIteration

        return list(map(tuple, zip(*blocks))), length

    def fetch_all(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetchall")

        if self._fields is None:
            self._fields = taos_fetch_fields(self._result)
        buffer = [[] for i in range(len(self._fields))]
        self._row_count = 0
        while True:
            block, num_of_fields = taos_fetch_block(self._result, self._fields)
            errno = taos_errno(self._result)
            if errno != 0:
                raise ProgrammingError(taos_errstr(self._result), errno)
            if num_of_fields == 0:
                break
            self._row_count += num_of_fields
            for i in range(len(self._fields)):
                buffer[i].extend(block[i])
        return list(map(tuple, zip(*buffer)))

    def fetch_all_into_dict(self):
        """Fetch all rows and convert it to dict"""
        names = [field.name for field in self.fields]
        rows = self.fetch_all()
        return list(dict(zip(names, row)) for row in rows)

    def fetch_rows_a(self, callback, param):
        taos_fetch_rows_a(self._result, callback, param)

    def stop_query(self):
        return taos_stop_query(self._result)
    
    def get_topic_name(self):
        return tmq_get_topic_name(self._result)
        
    def get_vgroup_id(self):
        return tmq_get_vgroup_id(self._result)
        
    def get_table_name(self):
        return tmq_get_table_name(self._result)
    
    def get_db_name(self):
        return tmq_get_db_name(self._result)

    def errno(self):
        """**DO NOT** use this directly unless you know what you are doing"""
        return taos_errno(self._result)

    def errstr(self):
        return taos_errstr(self._result)

    def check_error(self, errno=None, close=True):
        if errno is None:
            errno = self.errno()
        if errno != 0:
            msg = self.errstr()
            self.close()
            raise OperationalError(msg, errno)

    def close(self):
        """free result object."""
        if self._result is not None and self._close_after:
            taos_free_result(self._result)
        self._result = None
        self._fields = None
        self._field_count = None
        self._field_lengths = None

    def __del__(self):
        self.close()

Instance variables

var affected_rows
Expand source code
@property
def affected_rows(self):
    return taos_affected_rows(self._result)
var field_count

Field count of the current result, eq to taos_field_count(result)

Expand source code
@property
def field_count(self):
    """Field count of the current result, eq to taos_field_count(result)"""
    return self.fields.count
var fields

fields definitions of the current result

Expand source code
@property
def fields(self):
    """fields definitions of the current result"""
    if self._result is None:
        raise ResultError("no result object")
    if self._fields is None:
        self._fields = taos_fetch_fields(self._result)

    return self._fields
var precision
Expand source code
@property
def precision(self):
    if self._precision is None:
        self._precision = taos_result_precision(self._result)
    return self._precision
var row_count

Return the rowcount of the object

Expand source code
@property
def row_count(self):
    """Return the rowcount of the object"""
    return self._row_count

Methods

def blocks_iter(self)
Expand source code
def blocks_iter(self):
    return TaosBlocks(self)
def check_error(self, errno=None, close=True)
Expand source code
def check_error(self, errno=None, close=True):
    if errno is None:
        errno = self.errno()
    if errno != 0:
        msg = self.errstr()
        self.close()
        raise OperationalError(msg, errno)
def close(self)

free result object.

Expand source code
def close(self):
    """free result object."""
    if self._result is not None and self._close_after:
        taos_free_result(self._result)
    self._result = None
    self._fields = None
    self._field_count = None
    self._field_lengths = None
def errno(self)

DO NOT use this directly unless you know what you are doing

Expand source code
def errno(self):
    """**DO NOT** use this directly unless you know what you are doing"""
    return taos_errno(self._result)
def errstr(self)
Expand source code
def errstr(self):
    return taos_errstr(self._result)
def fetch_all(self)
Expand source code
def fetch_all(self):
    if self._result is None:
        raise OperationalError("Invalid use of fetchall")

    if self._fields is None:
        self._fields = taos_fetch_fields(self._result)
    buffer = [[] for i in range(len(self._fields))]
    self._row_count = 0
    while True:
        block, num_of_fields = taos_fetch_block(self._result, self._fields)
        errno = taos_errno(self._result)
        if errno != 0:
            raise ProgrammingError(taos_errstr(self._result), errno)
        if num_of_fields == 0:
            break
        self._row_count += num_of_fields
        for i in range(len(self._fields)):
            buffer[i].extend(block[i])
    return list(map(tuple, zip(*buffer)))
def fetch_all_into_dict(self)

Fetch all rows and convert it to dict

Expand source code
def fetch_all_into_dict(self):
    """Fetch all rows and convert it to dict"""
    names = [field.name for field in self.fields]
    rows = self.fetch_all()
    return list(dict(zip(names, row)) for row in rows)
def fetch_block(self)
Expand source code
def fetch_block(self):
    if self._result is None:
        raise OperationalError("Invalid use of fetch iterator")

    blocks, length = taos_fetch_block(self._result)
    if length == 0:
        raise StopIteration

    return list(map(tuple, zip(*blocks))), length
def fetch_rows_a(self, callback, param)
Expand source code
def fetch_rows_a(self, callback, param):
    taos_fetch_rows_a(self._result, callback, param)
def field_lengths(self)
Expand source code
def field_lengths(self):
    return taos_fetch_lengths(self._result, self.field_count)
def get_db_name(self)
Expand source code
def get_db_name(self):
    return tmq_get_db_name(self._result)
def get_table_name(self)
Expand source code
def get_table_name(self):
    return tmq_get_table_name(self._result)
def get_topic_name(self)
Expand source code
def get_topic_name(self):
    return tmq_get_topic_name(self._result)
def get_vgroup_id(self)
Expand source code
def get_vgroup_id(self):
    return tmq_get_vgroup_id(self._result)
def next(self)
Expand source code
def next(self):
    # fetch next row
    return self._next_row()
def rows_iter(self, num_of_rows=None)
Expand source code
def rows_iter(self, num_of_rows=None):
    return TaosRows(self, num_of_rows)
def stop_query(self)
Expand source code
def stop_query(self):
    return taos_stop_query(self._result)
class TaosRow (result, row)
Expand source code
class TaosRow:
    def __init__(self, result, row):
        self._result = result
        self._row = row

    def __str__(self):
        return taos_print_row(self._row, self._result.fields, self._result.field_count)

    def __call__(self):
        return self.as_tuple()

    def _astuple(self):
        return self.as_tuple()

    def __iter__(self):
        return self.as_tuple()

    def as_ptr(self):
        return self._row

    def as_tuple(self):
        precision = self._result.precision
        field_count = self._result.field_count
        blocks = [None] * field_count
        fields = self._result.fields
        field_lens = self._result.field_lengths()
        for i in range(field_count):
            data = ctypes.cast(self._row, ctypes.POINTER(ctypes.c_void_p))[i]
            if fields[i].type not in CONVERT_FUNC:
                raise DatabaseError("Invalid data type returned from database")
            if data is None:
                blocks[i] = None
            else:
                blocks[i] = CONVERT_FUNC[fields[i].type](data, [False], 1, field_lens[i], precision)[0]
        return tuple(blocks)

    def as_dict(self):
        values = self.as_tuple()
        names = self._result.fields
        dict(zip(names, values))

Methods

def as_dict(self)
Expand source code
def as_dict(self):
    values = self.as_tuple()
    names = self._result.fields
    dict(zip(names, values))
def as_ptr(self)
Expand source code
def as_ptr(self):
    return self._row
def as_tuple(self)
Expand source code
def as_tuple(self):
    precision = self._result.precision
    field_count = self._result.field_count
    blocks = [None] * field_count
    fields = self._result.fields
    field_lens = self._result.field_lengths()
    for i in range(field_count):
        data = ctypes.cast(self._row, ctypes.POINTER(ctypes.c_void_p))[i]
        if fields[i].type not in CONVERT_FUNC:
            raise DatabaseError("Invalid data type returned from database")
        if data is None:
            blocks[i] = None
        else:
            blocks[i] = CONVERT_FUNC[fields[i].type](data, [False], 1, field_lens[i], precision)[0]
    return tuple(blocks)
class TaosRows (result, num_of_rows=None)

TDengine result rows iterator

Expand source code
class TaosRows:
    """TDengine result rows iterator"""

    def __init__(self, result, num_of_rows=None):
        self._result = result
        self._num_of_rows = num_of_rows

    def __iter__(self):
        return self

    def __next__(self):
        return self._next_row()

    def next(self):
        return self._next_row()

    def _next_row(self):
        if self._result is None:
            raise OperationalError("Invalid use of fetch iterator")
        if self._num_of_rows is not None and self._num_of_rows <= self._result._row_count:
            raise StopIteration

        row = taos_fetch_row_raw(self._result._result)
        if not row:
            raise StopIteration
        self._result._row_count += 1
        return TaosRow(self._result, row)

    @property
    def row_count(self):
        """Return the rowcount of the object"""
        return self._result._row_count

Instance variables

var row_count

Return the rowcount of the object

Expand source code
@property
def row_count(self):
    """Return the rowcount of the object"""
    return self._result._row_count

Methods

def next(self)
Expand source code
def next(self):
    return self._next_row()