1 // 2 // $Id: ha_sphinx.h 4818 2014-09-24 08:53:38Z tomat $ 3 // 4 5 #ifdef USE_PRAGMA_INTERFACE 6 #pragma interface // gcc class implementation 7 #endif 8 9 10 #if MYSQL_VERSION_ID>=50515 11 #define TABLE_ARG TABLE_SHARE 12 #elif MYSQL_VERSION_ID>50100 13 #define TABLE_ARG st_table_share 14 #else 15 #define TABLE_ARG st_table 16 #endif 17 18 19 #if MYSQL_VERSION_ID>=50120 20 typedef uchar byte; 21 #endif 22 23 24 /// forward decls 25 class THD; 26 struct CSphReqQuery; 27 struct CSphSEShare; 28 struct CSphSEAttr; 29 struct CSphSEStats; 30 struct CSphSEThreadTable; 31 32 /// Sphinx SE handler class 33 class ha_sphinx final : public handler 34 { 35 protected: 36 THR_LOCK_DATA m_tLock; ///< MySQL lock 37 38 CSphSEShare * m_pShare; ///< shared lock info 39 40 uint m_iMatchesTotal; 41 uint m_iCurrentPos; 42 const byte * m_pCurrentKey; 43 uint m_iCurrentKeyLen; 44 45 char * m_pResponse; ///< searchd response storage 46 char * m_pResponseEnd; ///< searchd response storage end (points to wilderness!) 47 char * m_pCur; ///< current position into response 48 bool m_bUnpackError; ///< any errors while unpacking response 49 50 public: 51 #if MYSQL_VERSION_ID<50100 52 ha_sphinx ( TABLE_ARG * table_arg ); // NOLINT 53 #else 54 ha_sphinx ( handlerton * hton, TABLE_ARG * table_arg ); 55 #endif 56 ~ha_sphinx (); 57 table_type()58 const char * table_type () const { return "SPHINX"; } ///< SE name for display purposes index_type(uint)59 const char * index_type ( uint ) { return "HASH"; } ///< index type name for display purposes 60 61 #if MYSQL_VERSION_ID>50100 table_flags()62 ulonglong table_flags () const { return HA_CAN_INDEX_BLOBS | 63 HA_CAN_TABLE_CONDITION_PUSHDOWN; } ///< bitmap of implemented flags (see handler.h for more info) 64 #else table_flags()65 ulong table_flags () const { return HA_CAN_INDEX_BLOBS; } ///< bitmap of implemented flags (see handler.h for more info) 66 #endif 67 index_flags(uint,uint,bool)68 ulong index_flags ( uint, uint, bool ) const { return 0; } ///< bitmap of flags that says how SE implements indexes max_supported_record_length()69 uint max_supported_record_length () const { return HA_MAX_REC_LENGTH; } max_supported_keys()70 uint max_supported_keys () const { return 1; } max_supported_key_parts()71 uint max_supported_key_parts () const { return 1; } max_supported_key_length()72 uint max_supported_key_length () const { return MAX_KEY_LENGTH; } max_supported_key_part_length()73 uint max_supported_key_part_length () const { return MAX_KEY_LENGTH; } 74 75 #if MYSQL_VERSION_ID>50100 scan_time()76 virtual double scan_time () { return (double)( stats.records+stats.deleted )/20.0 + 10; } ///< called in test_quick_select to determine if indexes should be used 77 #else scan_time()78 virtual double scan_time () { return (double)( records+deleted )/20.0 + 10; } ///< called in test_quick_select to determine if indexes should be used 79 #endif 80 read_time(uint index,uint ranges,ha_rows rows)81 virtual double read_time(uint index, uint ranges, ha_rows rows) 82 { return ranges + (double)rows/20.0 + 1; } ///< index read time estimate 83 84 public: 85 int open ( const char * name, int mode, uint test_if_locked ); 86 int close (); 87 88 int write_row ( const byte * buf ); 89 int update_row ( const byte * old_data, const byte * new_data ); 90 int delete_row ( const byte * buf ); 91 int extra ( enum ha_extra_function op ); 92 93 int index_init ( uint keynr, bool sorted ); // 5.1.x index_init(uint keynr)94 int index_init ( uint keynr ) { return index_init ( keynr, false ); } // 5.0.x 95 96 int index_end (); 97 int index_read ( byte * buf, const byte * key, uint key_len, enum ha_rkey_function find_flag ); 98 int index_read_idx ( byte * buf, uint idx, const byte * key, uint key_len, enum ha_rkey_function find_flag ); 99 int index_next ( byte * buf ); 100 int index_next_same ( byte * buf, const byte * key, uint keylen ); 101 int index_prev ( byte * buf ); 102 int index_first ( byte * buf ); 103 int index_last ( byte * buf ); 104 105 int get_rec ( byte * buf, const byte * key, uint keylen ); 106 107 int rnd_init ( bool scan ); 108 int rnd_end (); 109 int rnd_next ( byte * buf ); 110 int rnd_pos ( byte * buf, byte * pos ); 111 void position ( const byte * record ); 112 113 #if MYSQL_VERSION_ID>=50030 114 int info ( uint ); 115 #else 116 void info ( uint ); 117 #endif 118 119 int reset(); 120 int external_lock ( THD * thd, int lock_type ); 121 int delete_all_rows (); 122 ha_rows records_in_range ( uint inx, const key_range * min_key, const key_range * max_key, page_range *pages); 123 124 int delete_table ( const char * from ); 125 int rename_table ( const char * from, const char * to ); 126 int create ( const char * name, TABLE * form, HA_CREATE_INFO * create_info ); 127 128 THR_LOCK_DATA ** store_lock ( THD * thd, THR_LOCK_DATA ** to, enum thr_lock_type lock_type ); 129 130 public: 131 #if MYSQL_VERSION_ID<50610 132 virtual const COND * cond_push ( const COND *cond ); 133 #else 134 virtual const Item * cond_push ( const Item *cond ); 135 #endif 136 virtual void cond_pop (); 137 138 private: 139 uint32 m_iFields; 140 char ** m_dFields; 141 142 uint32 m_iAttrs; 143 CSphSEAttr * m_dAttrs; 144 int m_bId64; 145 146 int * m_dUnboundFields; 147 148 private: 149 int Connect ( const char * sQueryHost, ushort uPort ); 150 int ConnectAPI ( const char * sQueryHost, int iQueryPort ); 151 int HandleMysqlError ( struct st_mysql * pConn, int iErrCode ); 152 153 uint32 UnpackDword (); 154 char * UnpackString (); 155 bool UnpackSchema (); 156 bool UnpackStats ( CSphSEStats * pStats ); 157 bool CheckResponcePtr ( int iLen ); 158 159 CSphSEThreadTable * GetTls (); 160 }; 161 162 163 #if MYSQL_VERSION_ID < 50100 164 bool sphinx_show_status ( THD * thd ); 165 #endif 166 167 int sphinx_showfunc_total_found ( THD *, SHOW_VAR *, char * ); 168 int sphinx_showfunc_total ( THD *, SHOW_VAR *, char * ); 169 int sphinx_showfunc_time ( THD *, SHOW_VAR *, char * ); 170 int sphinx_showfunc_word_count ( THD *, SHOW_VAR *, char * ); 171 int sphinx_showfunc_words ( THD *, SHOW_VAR *, char * ); 172 173 // 174 // $Id: ha_sphinx.h 4818 2014-09-24 08:53:38Z tomat $ 175 // 176