⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fastdbcli.cs

📁 最新版本!fastdb是高效的内存数据库系统
💻 CS
📖 第 1 页 / 共 4 页
字号:
using System;
using System.Text;
using System.Runtime.InteropServices;

namespace FastDbNet
{
  /// <summary>
  /// Exception thrown by Gigabase/FastDB CLI implementation.
  /// </summary>
  public class CliError : Exception {
    public int ErrorCode;

    ///<summary>
    /// Constructor of the exception object.
    /// </summary>
    /// <param name="Msg">message describing the reason of the fault</param>
    public CliError(string Msg) : this((int)CLI.ErrorCode.cli_unknown_error, Msg) {}
    ///<summary>
    /// Constructor of the exception object.
    /// </summary>
    /// <param name="Code">Error code describing the reason of the fault</param>
    public CliError(int Code)   : this(Code, "") {}
    ///<summary>
    /// Constructor of the exception object.
    /// </summary>
    /// <param name="Code">Error code describing the reason of the fault</param>
    /// <param name="Msg">Message describing the reason of the fault</param>
    public CliError(int Code, string Msg): base(FormatMessage(Code, Msg)) {
      ErrorCode = Code;
    }
    private static string FormatMessage(int Code, string Msg) {
      if (Msg != "") 
        Msg += ". " + CLI.CliErrorToStr(Code);
      else
        Msg = CLI.CliErrorToStr(Code);
      return Msg;
    }
  }


  /// <summary>
  /// FastDb CLI interface.
  /// </summary>
  public class CLI {

#if GIGABASE
#if LINUX
		public const string libname = "libgigabase_r.so";
#else
	  public const string libname = "GigaBase.dll";
#endif
#else
#if LINUX
		public const string libname = "libfastdb_r.so";
#else
    public const string libname = "FastDB.dll";
#endif
#endif

    //-----------------------------------------
    // cli_result_code
    //-----------------------------------------
    public enum ErrorCode : int {
      cli_ok                         =  0,
      cli_bad_address                = -1,
      cli_connection_refused         = -2,
      cli_database_not_found         = -3,
      cli_bad_statement              = -4,
      cli_parameter_not_found        = -5,
      cli_unbound_parameter          = -6,
      cli_column_not_found           = -7,
      cli_incompatible_type          = -8,
      cli_network_error              = -9,
      cli_runtime_error              = -10,
      cli_bad_descriptor             = -11,
      cli_unsupported_type           = -12,
      cli_not_found                  = -13,
      cli_not_update_mode            = -14,
      cli_table_not_found            = -15,
      cli_not_all_columns_specified  = -16,
      cli_not_fetched                = -17,
      cli_already_updated            = -18,
      cli_table_already_exists       = -19,
      cli_not_implemented            = -20,
#if GIGABASE
  		cli_login_failed               = -21,
	  	cli_empty_parameter            = -22,
		  cli_closed_connection          = -23
#endif

      //-----------------------------------------
      // cli_error_class
      // Note: When calling CliErrorToStr in TCliErrorHandler subtract 100 from the
      //       code passed as ErrorClassCode in order to get correct description
      //-----------------------------------------
      cli_query_error                = 1  -100,
      cli_arithmetic_error           = 2  -100,
      cli_index_out_of_range_error   = 3  -100,
      cli_database_open_error        = 4  -100,
      cli_file_error                 = 5  -100,
      cli_out_of_memory_error        = 6  -100,
      cli_deadlock                   = 7  -100,
      cli_null_reference_error       = 8  -100,
      cli_lock_revoked               = 9  -100,
      cli_file_limit_exeeded         = 10 -100,

      //-----------------------------------------
      // Extended Error Codes
      //-----------------------------------------
      cli_error_loading_library      = -200,
      cli_session_not_assigned       = -201,
      cli_database_already_open      = -202,
      cli_invalid_field_size         = -203,
      cli_empty_query                = -204,
      cli_item_already_defined       = -205,
      cli_wrong_inverse_reference    = -206,
      cli_no_fields_defined          = -207,
      cli_access_violation           = -208,
      cli_unknown_error              = -999
    }

    //-----------------------------------------
    // Field Types
    //-----------------------------------------
    public enum FieldType : int {
      cli_oid                        = 0,
      cli_bool                       = 1,
      cli_int1                       = 2,
      cli_int2                       = 3,
      cli_int4                       = 4,
      cli_int8                       = 5,
      cli_real4                      = 6,
      cli_real8                      = 7,
      cli_decimal                    = 8,  //{ not supported in FastDB }
      cli_asciiz                     = 9,  //{ zero terminated string (Get/Set function can be used) }
      cli_pasciiz                    = 10, //{ pointer to zero terminated string }
      cli_cstring                    = 11, //{ not supported in FastDB }
      cli_array_of_oid               = 12,
      cli_array_of_bool              = 13,
      cli_array_of_int1              = 14,
      cli_array_of_int2              = 15,
      cli_array_of_int4              = 16,
      cli_array_of_int8              = 17,
      cli_array_of_real4             = 18,
      cli_array_of_real8             = 19,
      cli_array_of_decimal           = 20, //{ not supported in FastDB }
      cli_array_of_string            = 21,
      cli_any                        = 22, //{ not supported in FastDB }
      cli_datetime                   = 23, //{ not supported in FastDB }
      cli_autoincrement              = 24,
      cli_rectangle                  = 25, //{ not supported in FastDB }
      cli_unknown                    = 26,
      //--- Custom types not supported by the database directly -----
      cli_subst                            // Reserved for substitution variables
    };

    internal static int[] SizeOfCliType =
      new int[] {
                  Marshal.SizeOf(typeof(int)),          // cli_oid
                  Marshal.SizeOf(typeof(bool)),					// cli_bool
                  Marshal.SizeOf(typeof(sbyte)),				// cli_int1
                  Marshal.SizeOf(typeof(short)),				// cli_int2
                  Marshal.SizeOf(typeof(int)),	        // cli_int4
                  Marshal.SizeOf(typeof(long)),					// cli_int8_t
                  Marshal.SizeOf(typeof(float)),  			// cli_real4_t
                  Marshal.SizeOf(typeof(double)),				// cli_real8_t
                  0, // cli_decimal
                  0, // cli_asciiz,
                  0, // cli_pasciiz,
                  0, // cli_cstring,
                  0, // cli_array_of_oid,
                  0, // cli_array_of_bool,
                  0, // cli_array_of_int1,
                  0, // cli_array_of_int2,
                  0, // cli_array_of_int4,
                  0, // cli_array_of_int8,
                  0, // cli_array_of_real4,
                  0, // cli_array_of_real8,
                  0, // cli_array_of_decimal,
                  0, // cli_array_of_string,
                  0, // cli_any,
                  Marshal.SizeOf(typeof(double)),         // cli_datetime,
                  Marshal.SizeOf(typeof(int)),          // cli_autoincrement,
                  0, // cli_rectangle,
                  0, // cli_unknown
                  0  // ctSubst
                };

    public static string CliTypeToStr(FieldType type, bool ExtendedSyntax) {
      StringBuilder s = new StringBuilder("");
      FieldType ft = type;
      if (ExtendedSyntax && type >= CLI.FieldType.cli_array_of_oid && type <= CLI.FieldType.cli_array_of_string) {
        s.Append("array of ");
        ft = (CLI.FieldType)((int)type - (int)CLI.FieldType.cli_array_of_oid);
      }

      switch(ft) {
        case CLI.FieldType.cli_oid:
          s.Append((ExtendedSyntax)? "reference" : "(oid)"); break;
        case CLI.FieldType.cli_bool:
          s.Append((ExtendedSyntax)? "bool" : "Boolean"); break;
        case CLI.FieldType.cli_int1:
          s.Append((ExtendedSyntax)? "int1" : "Byte"); break;
        case CLI.FieldType.cli_int2:
          s.Append((ExtendedSyntax)? "int2" : "SmallInt"); break;
        case CLI.FieldType.cli_autoincrement:
        case CLI.FieldType.cli_int4:
          s.Append((ExtendedSyntax)? "int4" : "Integer"); break;
        case CLI.FieldType.cli_int8:
          s.Append((ExtendedSyntax)? "int8" : "Int64"); break;
        case CLI.FieldType.cli_real4:
          s.Append((ExtendedSyntax)? "real4" : "Single"); break;
        case CLI.FieldType.cli_datetime:
          s.Append((ExtendedSyntax)? "real8" : "DateTime"); break;
        case CLI.FieldType.cli_real8:
          s.Append((ExtendedSyntax)? "real8" : "Double"); break;
        case CLI.FieldType.cli_asciiz:
        case CLI.FieldType.cli_pasciiz:
          s.Append((ExtendedSyntax)? "string" : "String"); break;
        default:
          if (!ExtendedSyntax) 
            s.Append(Enum.GetName(typeof(CLI.FieldType), ft).Substring(4)); break;
      }
      return s.ToString();
    }

    public static bool IsArrayType(FieldType tp) { 
      return tp >= FieldType.cli_array_of_oid && tp <= FieldType.cli_array_of_real8; 
    }

    public static int CliCheck(int code, string Msg) {
      if (code < 0)
        throw new CliError(code, Msg);
      else
        return code;
    }

    public static int CliCheck(int code) {
      return CliCheck(code, "");
    }

    // translate error code to string
    public static string CliErrorToStr(int Code) {
      if (Code >= 0)
        return null;
      else
        switch (Code) {
          case (int)ErrorCode.cli_bad_address                : return "Invalid format of server URL";
          case (int)ErrorCode.cli_connection_refused         : return "Connection with server could not be established";
          case (int)ErrorCode.cli_database_not_found         : return "Database cannot be found";
          case (int)ErrorCode.cli_bad_statement              : return "Text of SQL statement is not correct";
          case (int)ErrorCode.cli_parameter_not_found        : return "Parameter was not found in statement";
          case (int)ErrorCode.cli_unbound_parameter          : return "Parameter was not specified";
          case (int)ErrorCode.cli_column_not_found           : return "No such colunm in the table";
          case (int)ErrorCode.cli_incompatible_type          : return "Conversion between application and database type is not possible";
          case (int)ErrorCode.cli_network_error              : return "Connection with server is broken";
          case (int)ErrorCode.cli_runtime_error              : return "Error during query execution";
          case (int)ErrorCode.cli_bad_descriptor             : return "Invalid statement/session description";
          case (int)ErrorCode.cli_unsupported_type           : return "Unsupported type for parameter or column";
          case (int)ErrorCode.cli_not_found                  : return "Record was not found";
          case (int)ErrorCode.cli_not_update_mode            : return "Attempt to update records selected by view only cursor";
          case (int)ErrorCode.cli_table_not_found            : return "There is no table with specified name in the database";
          case (int)ErrorCode.cli_not_all_columns_specified  : return "Insert statement doesn''t specify values for all table columns";
          case (int)ErrorCode.cli_not_fetched                : return "cli_fetch method was not called";
          case (int)ErrorCode.cli_already_updated            : return "cli_update method was invoked more than once for the same record";
          case (int)ErrorCode.cli_table_already_exists       : return "Attempt to create existing table";
          case (int)ErrorCode.cli_not_implemented            : return "Function is not implemented";
            //----- Severe Error Class Codes---------
          case (int)ErrorCode.cli_query_error                : return "Query error";
          case (int)ErrorCode.cli_arithmetic_error           : return "Arithmetic error";
          case (int)ErrorCode.cli_index_out_of_range_error   : return "Index out of range";
          case (int)ErrorCode.cli_database_open_error        : return "Database open error";
          case (int)ErrorCode.cli_file_error                 : return "File error";
          case (int)ErrorCode.cli_out_of_memory_error        : return "Out of memory";
          case (int)ErrorCode.cli_deadlock                   : return "Deadlock detected";
          case (int)ErrorCode.cli_null_reference_error       : return "Null reference";
          case (int)ErrorCode.cli_lock_revoked               : return "Lock revoked";
          case (int)ErrorCode.cli_file_limit_exeeded         : return "File limit exeeded";
            //----- Custom Error Codes---------------
          case (int)ErrorCode.cli_error_loading_library      : return "Error loading library";
          case (int)ErrorCode.cli_session_not_assigned       : return "Session not assigned or not connected";
          case (int)ErrorCode.cli_database_already_open      : return "Database already open";
          case (int)ErrorCode.cli_invalid_field_size         : return "Invalid field size";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -