Ejemplo n.º 1
0
    def run(self, script, *args):
        # print("run")

        if not script or len(script.strip()) == 0:
            raise Exception('Empty Script Received', script)
        if not self.sessionID:
            raise Exception(
                'Connection has not been established yet; please call function connect!'
            )
        """msg send"""
        objs = []
        if len(args):
            """ function with arguments"""
            body = "function\n" + script
            body += "\n" + str(len(args)) + "\n"
            body += "1" if self.remoteLittleEndian else "0"
            message = "API " + self.sessionID + " " + str(
                len(body.encode('utf-8'))) + '\n' + body
            for arg in args:
                objs.append(self.write_python_obj(arg))
        else:
            """pure script"""
            body = "script\n" + script
            message = "API " + self.sessionID + " " + str(
                len(body.encode('utf-8'))) + '\n' + body
        reconnected = False
        try:
            # print(message)
            # print(objs)
            socket_util.sendall(self.socket, message, objs)
        except IOError:
            reconnected = self._reconnect(message)
        """msg receive"""
        header = socket_util.readline(self.socket, self.socketbuffer)
        while header == "MSG":
            socket_util.read_string(
                self.socket, self.socketbuffer
            )  # python API doesn't support progress listener
            header = socket_util.readline(self.socket, self.socketbuffer)

        headers = header.split()
        if len(headers) != 3:
            raise Exception('Header Length Incorrect', header)
        if reconnected:
            if not self.sessionID == headers[0]:
                print(
                    "old sessionID %s is invalid after reconnection; new sessionID is %s\n"
                    % (self.sessionID, headers[0]))
                self.sessionID = headers[0]

        sid, obj_num, _ = headers
        msg = socket_util.readline(self.socket, self.socketbuffer)
        if msg != 'OK':
            raise Exception('Server Exception', msg)
        if int(obj_num) == 0:
            return None
        return self.read_dolphindb_obj
Ejemplo n.º 2
0
    def rpc(self, function_name, *args):
        """

        :param function_name: remote function call name
        :param args: arguments for remote function
        :return: return remote function call result
        """
        """msg send"""
        # if len(args):
        """ function with arguments"""
        body = "function\n" + function_name
        body += "\n" + str(len(args)) + "\n"
        body += "1" if self.remoteLittleEndian else "0"
        message = "API " + self.sessionID + " " + str(len(
            body.encode('utf-8'))) + '\n' + body
        for arg in args:
            message = self.write_python_obj(arg)
        # else:
        #     """pure script"""
        #     body = "script\n"+function_name
        #     message = "API "+self.sessionID + " " + str(len(body)) + '\n' + body

        #print(message)

        reconnected = False
        try:
            socket_util.sendall(self.socket, message)
        except IOError:
            reconnected = self._reconnect(message)
        """msg receive"""
        header = socket_util.readline(self.socket, self.socketbuffer)
        while header == "MSG":
            socket_util.read_string(
                self.socket, self.socketbuffer
            )  # python API doesn't support progress listener
            header = socket_util.readline(self.socket, self.socketbuffer)

        headers = header.split()
        if len(headers) != 3:
            raise Exception('Header Length Incorrect', header)
        if reconnected:
            if not self.sessionID == headers[0]:
                print(
                    "old sessionID %s is invalid after reconnection; new sessionID is %s\n"
                    % (self.sessionID, headers[0]))
                self.sessionID = headers[0]

        sid, obj_num, _ = headers
        msg = socket_util.readline(self.socket, self.socketbuffer)
        if msg != 'OK':
            raise Exception('Server Exception', msg)
        if int(obj_num) == 0:
            return None
        return self.read_dolphindb_obj
Ejemplo n.º 3
0
def vec_generator_df(socket, data_type, buffer, nullMap):
    row = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    col = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    size = row * col
    if data_type in [DT_SYMBOL, DT_STRING]:
        return [read_string(socket, buffer) for i in range(size)]
    else:
        return list(DATA_UNPACKER[data_type](socket, size, buffer, nullMap))
Ejemplo n.º 4
0
def table_generator(socket, buffer, nullMap):
    """
    Generate a pandas data frame from dolphindb table object
    :param socket:
    :return:
    """
    rows = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    cols = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    tableName = read_string(socket, buffer)
    """ read column names """
    colNameDict = dict()
    colNames = []
    for i in range(cols):
        name = read_string(socket, buffer)
        colNameDict[name] = len(colNameDict)
        colNames.append(name)
    """ read columns and generate a pandas data frame"""
    df = pd.DataFrame()
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        df.__2xdbColumnTypes__ = dict()
    for col in colNames:
        data_form, data_type = get_form_type(socket, buffer, nullMap)

        # print(data_type)
        if data_form != DF_VECTOR:
            raise Exception("column " + col + "in table " + tableName +
                            " must be a vector!")

        df[col] = TABLE_GEN_HANDLER.get(data_type,
                                        _default_handler)(data_type, socket,
                                                          buffer, nullMap)
        # print(df)

        if data_type in [DT_BYTE, DT_SHORT]:
            data_type = DT_INT
        if data_type in [DT_SYMBOL]:
            data_type = DT_STRING
        if data_type in [DT_FLOAT]:
            data_type = DT_DOUBLE
        if data_type >= 6 and data_type <= 14:
            # TODO: improve datetime transmission
            data_type = DT_DATETIME64
        df.__2xdbColumnTypes__[col] = data_type

    return df
Ejemplo n.º 5
0
def vec_generator(socket, data_type, buffer, nullMap):
    '''
    generate a numpy array from a dolphindb vector
    :param socket: TCP socket
    :param data_type: dolphindb data type
    :return: the python corresponding data type
    '''
    row = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    col = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    size = row * col
    if data_type in [DT_SYMBOL, DT_STRING]:
        # print("size",size)
        """
        while True:
            packet = recvall(socket, 4096)
            if not packet or not len(packet):
                break
            data += packet
        (data.split('\x00\x00')[0].split('\x00')[:size])
        """
        return [read_string(socket, buffer) for i in range(size)]
    else:
        return list(DATA_UNPACKER[data_type](socket, size, buffer, nullMap))
Ejemplo n.º 6
0
def table_str_col_generator(socket, buffer, nullMap):
    row = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    col = DATA_UNPACKER_SCALAR[DT_INT](socket, buffer, nullMap)
    size = row * col
    vc = np.array([read_string(socket, buffer) for i in range(size)])
    return vc
Ejemplo n.º 7
0
        (recvall(x, DATA_SIZE[DT_TIMESTAMP], y)))[0])
DATA_UNPACKER_SCALAR[DT_NANOTIME] = lambda x, y, nullMap: NanoTime(
    Struct(endianness('q')).unpack(recvall(x, DATA_SIZE[DT_NANOTIME], y))[0])
DATA_UNPACKER_SCALAR[DT_NANOTIMESTAMP] = lambda x, y, nullMap: NanoTimestamp(
    Struct(endianness('q')).unpack(
        (recvall(x, DATA_SIZE[DT_NANOTIMESTAMP], y)))[0])
DATA_UNPACKER_SCALAR[DT_DATETIME64] = lambda x, y, nullMap: NanoTimestamp(
    Struct(endianness('q')).unpack(recvall(x, DATA_SIZE[DT_NANOTIMESTAMP], y))[
        0])
DATA_UNPACKER_SCALAR[DT_FLOAT] = lambda x, y, nullMap: swap_fromxxdb(
    Struct(endianness('f')).unpack(recvall(x, DATA_SIZE[DT_FLOAT], y))[0],
    DT_FLOAT, nullMap)
DATA_UNPACKER_SCALAR[DT_DOUBLE] = lambda x, y, nullMap: swap_fromxxdb(
    Struct(endianness('d')).unpack(
        (recvall(x, DATA_SIZE[DT_DOUBLE], y)))[0], DT_DOUBLE, nullMap)
DATA_UNPACKER_SCALAR[DT_SYMBOL] = lambda x, y, nullMap: read_string(x, y)
DATA_UNPACKER_SCALAR[DT_STRING] = lambda x, y, nullMap: read_string(x, y)
DATA_UNPACKER_SCALAR[DT_ANY] = lambda x, y, nullMap: None
DATA_UNPACKER_SCALAR[DT_DICTIONARY] = lambda x, y, nullMap: None
DATA_UNPACKER_SCALAR[DT_OBJECT] = lambda x, y, nullMap: None

DATA_UNPACKER = dict()
DATA_UNPACKER[DT_VOID] = lambda x, y, z, nullMap: list(
    map(lambda z: swap_fromxxdb(z, DT_BOOL, nullMap),
        Struct(str(y) + 'b').unpack(recvall(x, DATA_SIZE[DT_BOOL] * y, z))))
DATA_UNPACKER[DT_BOOL] = lambda x, y, z, nullMap: Struct(str(y) + 'b').unpack(
    recvall(x, DATA_SIZE[DT_BOOL] * y, z))
DATA_UNPACKER[DT_BYTE] = lambda x, y, z, nullMap: list(
    map(lambda z: swap_fromxxdb(z, DT_BYTE, nullMap),
        Struct(str(y) + 'b').unpack(recvall(x, DATA_SIZE[DT_BYTE] * y, z))))
DATA_UNPACKER[DT_SHORT] = lambda x, y, z, nullMap: list(