TDengineDriver.cs 5.4 KB
Newer Older
S
slguan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * 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 <http://www.gnu.org/licenses/>.
 */

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace TDengineDriver
{
  enum TDengineDataType {
23 24 25 26 27 28 29 30 31 32 33
    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
S
slguan 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
  }

  enum TDengineInitOption
  {
    TSDB_OPTION_LOCALE = 0,
    TSDB_OPTION_CHARSET = 1,
    TSDB_OPTION_TIMEZONE = 2,
    TDDB_OPTION_CONFIGDIR = 3,
    TDDB_OPTION_SHELL_ACTIVITY_TIMER = 4
  }

  class TDengineMeta
  {
    public string name;
    public short size;
    public byte type;
    public string TypeName()
    {
      switch ((TDengineDataType)type)
      {
        case TDengineDataType.TSDB_DATA_TYPE_BOOL:
          return "BOOLEAN";
        case TDengineDataType.TSDB_DATA_TYPE_TINYINT:
          return "BYTE";
        case TDengineDataType.TSDB_DATA_TYPE_SMALLINT:
          return "SHORT";
        case TDengineDataType.TSDB_DATA_TYPE_INT:
          return "INT";
        case TDengineDataType.TSDB_DATA_TYPE_BIGINT:
          return "LONG";
        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";
      }
    }
  }

  class TDengine
  {
    public const int TSDB_CODE_SUCCESS = 0;
83 84

    [DllImport("taos.dll", EntryPoint = "taos_init", CallingConvention = CallingConvention.Cdecl)]
S
slguan 已提交
85 86
    static extern public void Init();

87
    [DllImport("taos.dll", EntryPoint = "taos_cleanup", CallingConvention = CallingConvention.Cdecl)]
88 89
    static extern public void Cleanup();

90
    [DllImport("taos.dll", EntryPoint = "taos_options", CallingConvention = CallingConvention.Cdecl)]
S
slguan 已提交
91 92
    static extern public void Options(int option, string value);

93 94
    [DllImport("taos.dll", EntryPoint = "taos_connect", CallingConvention = CallingConvention.Cdecl)]
    static extern public IntPtr Connect(string ip, string user, string password, string db, short port);
S
slguan 已提交
95

96 97 98
    [DllImport("taos.dll", EntryPoint = "taos_errstr", CallingConvention = CallingConvention.Cdecl)]
    static extern private IntPtr taos_errstr(IntPtr res);
    static public string Error(IntPtr res)
S
slguan 已提交
99
    {
100
      IntPtr errPtr = taos_errstr(res);
S
slguan 已提交
101 102 103
      return Marshal.PtrToStringAnsi(errPtr);
    }

104 105
    [DllImport("taos.dll", EntryPoint = "taos_errno", CallingConvention = CallingConvention.Cdecl)]
    static extern public int ErrorNo(IntPtr res);
S
slguan 已提交
106

107 108
    [DllImport("taos.dll", EntryPoint = "taos_query", CallingConvention = CallingConvention.Cdecl)]
    static extern public IntPtr Query(IntPtr conn, string sqlstr);
S
slguan 已提交
109

110 111
    [DllImport("taos.dll", EntryPoint = "taos_affected_rows", CallingConvention = CallingConvention.Cdecl)]
    static extern public int AffectRows(IntPtr res);
S
slguan 已提交
112

113 114
    [DllImport("taos.dll", EntryPoint = "taos_field_count", CallingConvention = CallingConvention.Cdecl)]
    static extern public int FieldCount(IntPtr res);
S
slguan 已提交
115

116 117 118
    [DllImport("taos.dll", EntryPoint = "taos_fetch_fields", CallingConvention = CallingConvention.Cdecl)]
    static extern private IntPtr taos_fetch_fields(IntPtr res);
    static public List<TDengineMeta> FetchFields(IntPtr res)
S
slguan 已提交
119 120 121 122
    {
      const int fieldSize = 68;

      List<TDengineMeta> metas = new List<TDengineMeta>();
123
      if (res == IntPtr.Zero)
S
slguan 已提交
124 125 126 127
      {
        return metas;
      }

128 129
      int fieldCount = FieldCount(res);
      IntPtr fieldsPtr = taos_fetch_fields(res);
S
slguan 已提交
130 131 132 133 134 135 136
  
      for (int i = 0; i < fieldCount; ++i)
      {
        int offset = i * fieldSize;
        
        TDengineMeta meta = new TDengineMeta();
        meta.name = Marshal.PtrToStringAnsi(fieldsPtr + offset);
137 138
        meta.type = Marshal.ReadByte(fieldsPtr + offset + 65);
        meta.size = Marshal.ReadInt16(fieldsPtr + offset + 66);
S
slguan 已提交
139 140 141 142 143 144
        metas.Add(meta);
      }

      return metas;
    }

145 146
    [DllImport("taos.dll", EntryPoint = "taos_fetch_row", CallingConvention = CallingConvention.Cdecl)]
    static extern public IntPtr FetchRows(IntPtr res);
S
slguan 已提交
147

148 149
    [DllImport("taos.dll", EntryPoint = "taos_free_result", CallingConvention = CallingConvention.Cdecl)]
    static extern public IntPtr FreeResult(IntPtr res);
S
slguan 已提交
150

151 152
    [DllImport("taos.dll", EntryPoint = "taos_close", CallingConvention = CallingConvention.Cdecl)]
    static extern public int Close(IntPtr taos);
S
slguan 已提交
153 154
  }
}