summaryrefslogtreecommitdiff
path: root/storage/connect/tabmysql.cpp
diff options
context:
space:
mode:
authorOlivier Bertrand <bertrandop@gmail.com>2014-04-19 17:02:53 +0200
committerOlivier Bertrand <bertrandop@gmail.com>2014-04-19 17:02:53 +0200
commit187e41697b7e4c43fcfe8e5c01f7cc7ad289f995 (patch)
tree77a96d5bbcd63a2abc1f8130e8b6218f3d4df428 /storage/connect/tabmysql.cpp
parent213ecbbb4f3d252ba2d653eacf756e123821c41a (diff)
downloadmariadb-git-187e41697b7e4c43fcfe8e5c01f7cc7ad289f995.tar.gz
- Implement "remote" index (similar to FEDERATED ones) for MYSQL tables.
Not yet done for ODBC tables. modified: storage/connect/connect.cc storage/connect/ha_connect.cc storage/connect/ha_connect.h storage/connect/mycat.cc storage/connect/plgdbsem.h storage/connect/reldef.h storage/connect/tabdos.h storage/connect/tabmysql.cpp storage/connect/tabmysql.h storage/connect/tabodbc.cpp storage/connect/tabodbc.h storage/connect/xindex.cpp storage/connect/xtable.h - Return error in "info" on Cardinality error. modified: storage/connect/ha_connect.cc
Diffstat (limited to 'storage/connect/tabmysql.cpp')
-rw-r--r--storage/connect/tabmysql.cpp67
1 files changed, 53 insertions, 14 deletions
diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp
index 84a070f1ddf..67eba4061bf 100644
--- a/storage/connect/tabmysql.cpp
+++ b/storage/connect/tabmysql.cpp
@@ -61,6 +61,7 @@
#include "tabmysql.h"
#include "valblk.h"
#include "tabutil.h"
+#include "ha_connect.h"
#if defined(_CONSOLE)
void PrintResult(PGLOBAL, PSEM, PQRYRES);
@@ -481,16 +482,16 @@ PCOL TDBMYSQL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n)
/* Note: when implementing EOM filtering, column only used in local */
/* filter should be removed from column list. */
/***********************************************************************/
-bool TDBMYSQL::MakeSelect(PGLOBAL g)
+bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx)
{
char *tk = "`";
- int rank = 0;
- bool b = FALSE;
+ int len = 0, rank = 0;
+ bool b = false;
PCOL colp;
//PDBUSER dup = PlgGetUser(g);
if (Query)
- return FALSE; // already done
+ return false; // already done
if (Srcdef) {
Query = Srcdef;
@@ -506,12 +507,12 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g)
if (!colp->IsSpecial()) {
// if (colp->IsSpecial()) {
// strcpy(g->Message, MSG(NO_SPEC_COL));
-// return TRUE;
+// return true;
// } else {
if (b)
strcat(Query, ", ");
else
- b = TRUE;
+ b = true;
strcat(strcat(strcat(Query, tk), colp->GetName()), tk);
((PMYCOL)colp)->Rank = rank++;
@@ -526,16 +527,24 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g)
} // endif ncol
strcat(strcat(strcat(strcat(Query, " FROM "), tk), Tabname), tk);
+ len = strlen(Query);
+
+ if (To_CondFil) {
+ if (!mx) {
+ strcat(strcat(Query, " WHERE "), To_CondFil->Body);
+ len = strlen(Query) + 1;
+ } else
+ len += (strlen(To_CondFil->Body) + 256);
- if (To_CondFil)
- strcat(strcat(Query, " WHERE "), To_CondFil->Body);
+ } else
+ len += (mx ? 256 : 1);
if (trace)
htrc("Query=%s\n", Query);
// Now we know how much to suballocate
- PlugSubAlloc(g, NULL, strlen(Query) + 1);
- return FALSE;
+ PlugSubAlloc(g, NULL, len);
+ return false;
} // end of MakeSelect
/***********************************************************************/
@@ -833,9 +842,9 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
/*********************************************************************/
/* Allocate whatever is used for getting results. */
/*********************************************************************/
- if (Mode == MODE_READ) {
- if (!MakeSelect(g))
- m_Rc = Myc.ExecSQL(g, Query);
+ if (Mode == MODE_READ || Mode == MODE_READX) {
+ MakeSelect(g, Mode == MODE_READX);
+ m_Rc = (Mode == MODE_READ) ? Myc.ExecSQL(g, Query) : RC_OK;
#if 0
if (!Myc.m_Res || !Myc.m_Fields) {
@@ -995,6 +1004,36 @@ int TDBMYSQL::SendCommand(PGLOBAL g)
} // end of SendCommand
/***********************************************************************/
+/* Data Base indexed read routine for MYSQL access method. */
+/***********************************************************************/
+bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len)
+{
+ int oldlen = strlen(Query);
+ bool rc;
+
+ if (op == OP_NEXT)
+ return false;
+ else if (op == OP_FIRST) {
+ if (To_CondFil)
+ strcat(strcat(Query, " WHERE "), To_CondFil->Body);
+
+ } else {
+ if (Myc.m_Res)
+ Myc.FreeResult();
+
+ rc = To_Def->GetHandler()->MakeKeyWhere(g, Query, op, "`", key, len);
+
+ if (To_CondFil)
+ strcat(strcat(strcat(Query, " AND ("), To_CondFil->Body), ")");
+
+ } // endif's op
+
+ m_Rc = Myc.ExecSQL(g, Query);
+ Query[oldlen] = 0;
+ return false;
+} // end of ReadKey
+
+/***********************************************************************/
/* Data Base read routine for MYSQL access method. */
/***********************************************************************/
int TDBMYSQL::ReadDB(PGLOBAL g)
@@ -1451,7 +1490,7 @@ bool TDBMYEXC::OpenDB(PGLOBAL g)
Use = USE_OPEN; // Do it now in case we are recursively called
- if (Mode != MODE_READ) {
+ if (Mode != MODE_READ && Mode != MODE_READX) {
strcpy(g->Message, "No INSERT/DELETE/UPDATE of MYSQL EXEC tables");
return true;
} // endif Mode