diff options
author | Olivier Bertrand <bertrandop@gmail.com> | 2013-11-13 00:15:38 +0100 |
---|---|---|
committer | Olivier Bertrand <bertrandop@gmail.com> | 2013-11-13 00:15:38 +0100 |
commit | 793f05c32187d5ca8d1cbf736e36e87c48f7c1de (patch) | |
tree | 35fe0efc8058a73a26d70e4664d1cdc369ba16a7 /storage/connect/tabodbc.cpp | |
parent | 260c0de9188727f3a7ced1e96c7e368bf7a37437 (diff) | |
download | mariadb-git-793f05c32187d5ca8d1cbf736e36e87c48f7c1de.tar.gz |
- Modify the way UPDATE and DELETE statements are sent to ODBC
and MYSQL CONNECT tables to take care of kewords such as IGNORE.
modified:
storage/connect/myconn.cpp
storage/connect/odbconn.cpp
storage/connect/tabmysql.cpp
storage/connect/tabmysql.h
storage/connect/tabodbc.cpp
storage/connect/tabodbc.h
Diffstat (limited to 'storage/connect/tabodbc.cpp')
-rw-r--r-- | storage/connect/tabodbc.cpp | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index bb7588e0d66..643b5e734c4 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -519,6 +519,61 @@ bool TDBODBC::BindParameters(PGLOBAL g) } // end of BindParameters /***********************************************************************/ +/* MakeCommand: make the Update or Delete statement to send to the */ +/* MySQL server. Limited to remote values and filtering. */ +/***********************************************************************/ +char *TDBODBC::MakeCommand(PGLOBAL g) + { + char *p, name[68], *qc = Ocp->GetQuoteChar(); + char *stmt = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 64); + char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1); + bool qtd = Quoted > 0; + int i = 0, k = 0; + + // Make a lower case copy of the originale query and change + // back ticks to the data source identifier quoting character + do { + qrystr[i] = (Qrystr[i] == '`') ? *qc : tolower(Qrystr[i]); + } while (Qrystr[i++]); + + // Check whether the table name is equal to a keyword + // If so, it must be quoted in the original query + strlwr(strcat(strcat(strcpy(name, " "), Name), " ")); + + if (!strstr(" update delete low_priority ignore quick from ", name)) + strlwr(strcpy(name, Name)); // Not a keyword + else + strlwr(strcat(strcat(strcpy(name, qc), Name), qc)); + + if ((p = strstr(qrystr, name))) { + for (i = 0; i < p - qrystr; i++) + stmt[i] = (Qrystr[i] == '`') ? *qc : Qrystr[i]; + + stmt[i] = 0; + k = i + (int)strlen(Name); + + if (qtd && *(p-1) == ' ') + strcat(strcat(strcat(stmt, qc), TableName), qc); + else + strcat(stmt, TableName); + + i = (int)strlen(stmt); + + do { + stmt[i++] = (Qrystr[k] == '`') ? *qc : Qrystr[k]; + } while (Qrystr[k++]); + + } else { + sprintf(g->Message, "Cannot use this %s command", + (Mode == MODE_UPDATE) ? "UPDATE" : "DELETE"); + return NULL; + } // endif p + + return stmt; + } // end of MakeCommand + +#if 0 +/***********************************************************************/ /* MakeUpdate: make the SQL statement to send to ODBC connection. */ /***********************************************************************/ char *TDBODBC::MakeUpdate(PGLOBAL g) @@ -582,6 +637,7 @@ char *TDBODBC::MakeDelete(PGLOBAL g) return stmt; } // end of MakeDelete +#endif // 0 /***********************************************************************/ /* ResetSize: call by TDBMUL when calculating size estimate. */ @@ -713,10 +769,8 @@ bool TDBODBC::OpenDB(PGLOBAL g) } // endif Query - } else if (Mode == MODE_UPDATE) - Query = MakeUpdate(g); - else if (Mode == MODE_DELETE) - Query = MakeDelete(g); + } else if (Mode == MODE_UPDATE || Mode == MODE_DELETE) + Query = MakeCommand(g); else sprintf(g->Message, "Invalid mode %d", Mode); |