NdbSqlUtil.hpp 5.13 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/* Copyright (C) 2003 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   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.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#ifndef NDB_SQL_UTIL_HPP
#define NDB_SQL_UTIL_HPP

unknown's avatar
unknown committed
20
#include <ndb_global.h>
unknown's avatar
unknown committed
21
#include <kernel/ndb_limits.h>
22

unknown's avatar
unknown committed
23 24 25
struct charset_info_st;
typedef struct charset_info_st CHARSET_INFO;

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
class NdbSqlUtil {
public:
  /**
   * Compare strings, optionally with padded semantics.  Returns
   * negative (less), zero (equal), or positive (greater).
   */
  static int char_compare(const char* s1, unsigned n1,
                          const char* s2, unsigned n2, bool padded);

  /**
   * Like operator, optionally with padded semantics.  Returns true or
   * false.
   */
  static bool char_like(const char* s1, unsigned n1,
                        const char* s2, unsigned n2, bool padded);

  /**
unknown's avatar
unknown committed
43 44 45
   * Compare attribute values.  Returns -1, 0, +1 for less, equal,
   * greater, respectively.  Parameters are pointers to values and their
   * lengths in bytes.  The lengths can differ.
46
   *
unknown's avatar
unknown committed
47 48 49 50 51 52 53 54 55 56 57
   * First value is a full value but second value can be partial.  If
   * the partial value is not enough to determine the result, CmpUnknown
   * will be returned.  A shorter second value is not necessarily
   * partial.  Partial values are allowed only for types where prefix
   * comparison is possible (basically, binary types).
   *
   * First parameter is a pointer to type specific extra info.  Char
   * types receive CHARSET_INFO in it.
   *
   * If a value cannot be parsed, it compares like NULL i.e. less than
   * any valid value.
58
   */
unknown's avatar
unknown committed
59
  typedef int Cmp(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full);
60 61 62 63 64

  enum CmpResult {
    CmpLess = -1,
    CmpEqual = 0,
    CmpGreater = 1,
65
    CmpUnknown = 2      // insufficient partial data
66 67 68 69
  };

  struct Type {
    enum Enum {
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
      Undefined = NDB_TYPE_UNDEFINED,
      Tinyint = NDB_TYPE_TINYINT,
      Tinyunsigned = NDB_TYPE_TINYUNSIGNED,
      Smallint = NDB_TYPE_SMALLINT,
      Smallunsigned = NDB_TYPE_SMALLUNSIGNED,
      Mediumint = NDB_TYPE_MEDIUMINT,
      Mediumunsigned = NDB_TYPE_MEDIUMUNSIGNED,
      Int = NDB_TYPE_INT,
      Unsigned = NDB_TYPE_UNSIGNED,
      Bigint = NDB_TYPE_BIGINT,
      Bigunsigned = NDB_TYPE_BIGUNSIGNED,
      Float = NDB_TYPE_FLOAT,
      Double = NDB_TYPE_DOUBLE,
      Decimal = NDB_TYPE_DECIMAL,
      Char = NDB_TYPE_CHAR,
      Varchar = NDB_TYPE_VARCHAR,
      Binary = NDB_TYPE_BINARY,
      Varbinary = NDB_TYPE_VARBINARY,
      Datetime = NDB_TYPE_DATETIME,
unknown's avatar
unknown committed
89
      Date = NDB_TYPE_DATE,
90 91
      Blob = NDB_TYPE_BLOB,
      Text = NDB_TYPE_TEXT,
92
      Bit = NDB_TYPE_BIT,
unknown's avatar
unknown committed
93
      Longvarchar = NDB_TYPE_LONG_VARCHAR,
unknown's avatar
Merge  
unknown committed
94
      Longvarbinary = NDB_TYPE_LONG_VARBINARY,
unknown's avatar
Merge  
unknown committed
95
      Time = NDB_TYPE_TIME
96
    };
unknown's avatar
unknown committed
97
    Enum m_typeId;      // redundant
98
    Cmp* m_cmp;         // comparison method
99 100 101 102 103
  };

  /**
   * Get type by id.  Can return the Undefined type.
   */
104
  static const Type& getType(Uint32 typeId);
105

unknown's avatar
unknown committed
106
  /**
unknown's avatar
unknown committed
107 108
   * Get the normalized type used in hashing and key comparisons.
   * Maps all string types to Binary.
unknown's avatar
unknown committed
109 110 111
   */
  static const Type& getTypeBinary(Uint32 typeId);

unknown's avatar
unknown committed
112 113 114
  /**
   * Check character set.
   */
unknown's avatar
unknown committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
  static bool usable_in_pk(Uint32 typeId, const void* info);
  static bool usable_in_hash_index(Uint32 typeId, const void* info);
  static bool usable_in_ordered_index(Uint32 typeId, const void* info);

  /**
   * Get number of length bytes and length from variable length string.
   * Returns false on error (invalid data).  For other types returns
   * zero length bytes and the fixed attribute length.
   */
  static bool get_var_length(Uint32 typeId, const void* p, unsigned attrlen, Uint32& lb, Uint32& len);

  /**
   * Temporary workaround for bug#7284.
   */
  static int strnxfrm_bug7284(CHARSET_INFO* cs, unsigned char* dst, unsigned dstLen, const unsigned char*src, unsigned srcLen);
unknown's avatar
unknown committed
130

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
private:
  /**
   * List of all types.  Must match Type::Enum.
   */
  static const Type m_typeList[];
  /**
   * Comparison methods.
   */
  static Cmp cmpTinyint;
  static Cmp cmpTinyunsigned;
  static Cmp cmpSmallint;
  static Cmp cmpSmallunsigned;
  static Cmp cmpMediumint;
  static Cmp cmpMediumunsigned;
  static Cmp cmpInt;
  static Cmp cmpUnsigned;
  static Cmp cmpBigint;
  static Cmp cmpBigunsigned;
  static Cmp cmpFloat;
  static Cmp cmpDouble;
  static Cmp cmpDecimal;
  static Cmp cmpChar;
  static Cmp cmpVarchar;
  static Cmp cmpBinary;
  static Cmp cmpVarbinary;
  static Cmp cmpDatetime;
unknown's avatar
unknown committed
157
  static Cmp cmpDate;
unknown's avatar
unknown committed
158
  static Cmp cmpBlob;
unknown's avatar
unknown committed
159
  static Cmp cmpText;
unknown's avatar
unknown committed
160 161 162
  static Cmp cmpBit;
  static Cmp cmpLongvarchar;
  static Cmp cmpLongvarbinary;
unknown's avatar
unknown committed
163
  static Cmp cmpTime;
164 165 166
};

#endif