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 83 84 85 86
  }

  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;
    
    [DllImport("taos.dll", EntryPoint = "taos_init", CallingConvention = CallingConvention.StdCall)]
    static extern public void Init();

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

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

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

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

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

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

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

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

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

      List<TDengineMeta> metas = new List<TDengineMeta>();
123
      if (res == 0)
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 145 146 147 148 149 150 151 152 153 154
        metas.Add(meta);
      }

      return metas;
    }

    [DllImport("taos.dll", EntryPoint = "taos_fetch_row", CallingConvention = CallingConvention.StdCall)]
    static extern public IntPtr FetchRows(long res);

    [DllImport("taos.dll", EntryPoint = "taos_free_result", CallingConvention = CallingConvention.StdCall)]
    static extern public IntPtr FreeResult(long res);

    [DllImport("taos.dll", EntryPoint = "taos_close", CallingConvention = CallingConvention.StdCall)]
    static extern public int Close(long taos);
  }
}