/* * Copyright (c) 2019 TAOS Data, Inc. * * This program is free software: you can use, redistribute, and/or modify * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace TDengineDriver { public enum TDengineDataType { TSDB_DATA_TYPE_NULL = 0, // 1 bytes TSDB_DATA_TYPE_BOOL = 1, // 1 bytes TSDB_DATA_TYPE_TINYINT = 2, // 1 bytes TSDB_DATA_TYPE_SMALLINT = 3, // 2 bytes TSDB_DATA_TYPE_INT = 4, // 4 bytes TSDB_DATA_TYPE_BIGINT = 5, // 8 bytes TSDB_DATA_TYPE_FLOAT = 6, // 4 bytes TSDB_DATA_TYPE_DOUBLE = 7, // 8 bytes TSDB_DATA_TYPE_BINARY = 8, // string TSDB_DATA_TYPE_TIMESTAMP = 9,// 8 bytes TSDB_DATA_TYPE_NCHAR = 10, // unicode string TSDB_DATA_TYPE_UTINYINT = 11,// 1 byte TSDB_DATA_TYPE_USMALLINT = 12,// 2 bytes TSDB_DATA_TYPE_UINT = 13, // 4 bytes TSDB_DATA_TYPE_UBIGINT = 14 // 8 bytes } public enum TDengineInitOption { TSDB_OPTION_LOCALE = 0, TSDB_OPTION_CHARSET = 1, TSDB_OPTION_TIMEZONE = 2, TDDB_OPTION_CONFIGDIR = 3, TDDB_OPTION_SHELL_ACTIVITY_TIMER = 4 } public class TDengineMeta { public string name; public short size; public byte type; public string TypeName() { switch ((TDengineDataType)type) { case TDengineDataType.TSDB_DATA_TYPE_BOOL: return "BOOL"; case TDengineDataType.TSDB_DATA_TYPE_TINYINT: return "TINYINT"; case TDengineDataType.TSDB_DATA_TYPE_SMALLINT: return "SMALLINT"; case TDengineDataType.TSDB_DATA_TYPE_INT: return "INT"; case TDengineDataType.TSDB_DATA_TYPE_BIGINT: return "BIGINT"; case TDengineDataType.TSDB_DATA_TYPE_UTINYINT: return "TINYINT UNSIGNED"; case TDengineDataType.TSDB_DATA_TYPE_USMALLINT: return "SMALLINT UNSIGNED"; case TDengineDataType.TSDB_DATA_TYPE_UINT: return "INT UNSIGNED"; case TDengineDataType.TSDB_DATA_TYPE_UBIGINT: return "BIGINT UNSIGNED"; case TDengineDataType.TSDB_DATA_TYPE_FLOAT: return "FLOAT"; case TDengineDataType.TSDB_DATA_TYPE_DOUBLE: return "DOUBLE"; case TDengineDataType.TSDB_DATA_TYPE_BINARY: return "STRING"; case TDengineDataType.TSDB_DATA_TYPE_TIMESTAMP: return "TIMESTAMP"; case TDengineDataType.TSDB_DATA_TYPE_NCHAR: return "NCHAR"; default: return "undefine"; } } } public class TDengine { public const int TSDB_CODE_SUCCESS = 0; [DllImport("taos", EntryPoint = "taos_init", CallingConvention = CallingConvention.Cdecl)] static extern public void Init(); [DllImport("taos", EntryPoint = "taos_cleanup", CallingConvention = CallingConvention.Cdecl)] static extern public void Cleanup(); [DllImport("taos", EntryPoint = "taos_options", CallingConvention = CallingConvention.Cdecl)] static extern public void Options(int option, string value); [DllImport("taos", EntryPoint = "taos_connect", CallingConvention = CallingConvention.Cdecl)] static extern public IntPtr Connect(string ip, string user, string password, string db, short port); [DllImport("taos", EntryPoint = "taos_errstr", CallingConvention = CallingConvention.Cdecl)] static extern private IntPtr taos_errstr(IntPtr res); static public string Error(IntPtr res) { IntPtr errPtr = taos_errstr(res); return Marshal.PtrToStringAnsi(errPtr); } [DllImport("taos", EntryPoint = "taos_errno", CallingConvention = CallingConvention.Cdecl)] static extern public int ErrorNo(IntPtr res); [DllImport("taos", EntryPoint = "taos_query", CallingConvention = CallingConvention.Cdecl)] static extern public IntPtr Query(IntPtr conn, string sqlstr); [DllImport("taos", EntryPoint = "taos_affected_rows", CallingConvention = CallingConvention.Cdecl)] static extern public int AffectRows(IntPtr res); [DllImport("taos", EntryPoint = "taos_field_count", CallingConvention = CallingConvention.Cdecl)] static extern public int FieldCount(IntPtr res); [DllImport("taos", EntryPoint = "taos_fetch_fields", CallingConvention = CallingConvention.Cdecl)] static extern private IntPtr taos_fetch_fields(IntPtr res); static public List FetchFields(IntPtr res) { const int fieldSize = 68; List metas = new List(); if (res == IntPtr.Zero) { return metas; } int fieldCount = FieldCount(res); IntPtr fieldsPtr = taos_fetch_fields(res); for (int i = 0; i < fieldCount; ++i) { int offset = i * fieldSize; TDengineMeta meta = new TDengineMeta(); meta.name = Marshal.PtrToStringAnsi(fieldsPtr + offset); meta.type = Marshal.ReadByte(fieldsPtr + offset + 65); meta.size = Marshal.ReadInt16(fieldsPtr + offset + 66); metas.Add(meta); } return metas; } [DllImport("taos", EntryPoint = "taos_fetch_row", CallingConvention = CallingConvention.Cdecl)] static extern public IntPtr FetchRows(IntPtr res); [DllImport("taos", EntryPoint = "taos_free_result", CallingConvention = CallingConvention.Cdecl)] static extern public IntPtr FreeResult(IntPtr res); [DllImport("taos", EntryPoint = "taos_close", CallingConvention = CallingConvention.Cdecl)] static extern public int Close(IntPtr taos); //get precision in restultset [DllImport("taos", EntryPoint = "taos_result_precision", CallingConvention = CallingConvention.Cdecl)] static extern public int ResultPrecision(IntPtr taos); //schemaless API [DllImport("taos",SetLastError = true, EntryPoint = "taos_schemaless_insert", CallingConvention = CallingConvention.Cdecl)] static extern public IntPtr SchemalessInsert(IntPtr taos, string[] lines, int numLines, int protocol, int precision); } }