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