summaryrefslogtreecommitdiff
path: root/storage/connect/myconn.cpp
diff options
context:
space:
mode:
authorOlivier Bertrand <bertrandop@gmail.com>2013-12-03 22:59:40 +0100
committerOlivier Bertrand <bertrandop@gmail.com>2013-12-03 22:59:40 +0100
commitee2f04450b45515c507e4511c26e48e2b846aa73 (patch)
tree2c1d9bec56e1268c8c41629ae1dd4f1d8253f471 /storage/connect/myconn.cpp
parentd240a0418cf6d59fba711f0677f164d9ee881b7e (diff)
downloadmariadb-git-ee2f04450b45515c507e4511c26e48e2b846aa73.tar.gz
- Add support for unsigned numeric types
added: storage/connect/mysql-test/connect/r/unsigned.result storage/connect/mysql-test/connect/t/unsigned.test modified: storage/connect/colblk.cpp storage/connect/colblk.h storage/connect/connect.cc storage/connect/ha_connect.cc storage/connect/myconn.cpp storage/connect/mysql-test/connect/r/mysql_discovery.result storage/connect/mysql-test/connect/r/xml.result storage/connect/myutil.cpp storage/connect/myutil.h storage/connect/plgdbsem.h storage/connect/tabdos.cpp storage/connect/tabfix.cpp storage/connect/tabmysql.cpp storage/connect/tabutil.cpp storage/connect/valblk.cpp storage/connect/valblk.h storage/connect/value.cpp storage/connect/value.h storage/connect/xobject.cpp storage/connect/xobject.h
Diffstat (limited to 'storage/connect/myconn.cpp')
-rw-r--r--storage/connect/myconn.cpp74
1 files changed, 42 insertions, 32 deletions
diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp
index f9763f0eb2f..d2a130e103f 100644
--- a/storage/connect/myconn.cpp
+++ b/storage/connect/myconn.cpp
@@ -46,21 +46,6 @@
#define DLL_EXPORT // Items are exported from this DLL
#include "myconn.h"
-#if defined(EMBEDDED)
-static char *server_args[] = {
- "this_program", /* this string is not used */
- "--skip-bdb",
- "--skip-innodb"
- };
-
-static char *server_groups[] = {
- "PlugDB_SERVER",
- "embedded",
- "server",
- (char *)NULL
- };
-#endif // EMBEDDED
-
extern "C" int trace;
extern MYSQL_PLUGIN_IMPORT uint mysqld_port;
@@ -82,12 +67,12 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
{
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT,
TYPE_STRING, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT,
- TYPE_STRING, TYPE_STRING, TYPE_STRING};
+ TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING};
static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC,
FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL,
- FLD_REM, FLD_NO, FLD_CHARSET};
- static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 256, 32, 32};
- char *fld, *fmt, v, cmd[128];
+ FLD_REM, FLD_NO, FLD_DEFAULT, FLD_CHARSET};
+ static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 0, 32};
+ char *fld, *fmt, v, cmd[128], uns[16], zero[16];
int i, n, nf, ncol = sizeof(buftyp) / sizeof(int);
int len, type, prec, rc, k = 0;
PQRYRES qrp;
@@ -122,9 +107,10 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} // endif n
/********************************************************************/
- /* Get the size of the name columns. */
+ /* Get the size of the name and default columns. */
/********************************************************************/
length[0] = myc.GetFieldLength(0);
+ length[10] = myc.GetFieldLength(5);
} else {
n = 0;
length[0] = 128;
@@ -164,18 +150,29 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = qrp->Colresp; // Column_Name
crp->Kdata->SetValue(fld, i);
- // Get type, type name, and precision
+ // Get type, type name, precision, unsigned and zerofill
fld = myc.GetCharField(1);
prec = 0;
len = 0;
v = 0;
-
- if ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec)) < 1) {
- sprintf(g->Message, MSG(BAD_FIELD_TYPE), fld);
- myc.Close();
- return NULL;
- } else
- qrp->Nblin++;
+ *uns = 0;
+ *zero = 0;
+
+ switch ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec))) {
+ case 3:
+ nf = sscanf(fld, "%[^(](%d,%d) %s %s", cmd, &len, &prec, uns, zero);
+ break;
+ case 2:
+ nf = sscanf(fld, "%[^(](%d) %s %s", cmd, &len, uns, zero) + 1;
+ break;
+ case 1:
+ nf = sscanf(fld, "%s %s %s", cmd, uns, zero) + 2;
+ break;
+ default:
+ sprintf(g->Message, MSG(BAD_FIELD_TYPE), fld);
+ myc.Close();
+ return NULL;
+ } // endswitch nf
if ((type = MYSQLtoPLG(cmd, &v)) == TYPE_ERROR) {
sprintf(g->Message, "Unsupported column type %s", cmd);
@@ -184,9 +181,16 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} else if (type == TYPE_STRING)
len = min(len, 4096);
+ qrp->Nblin++;
crp = crp->Next; // Data_Type
crp->Kdata->SetValue(type, i);
- crp->Nulls[i] = v;
+
+ switch (nf) {
+ case 5: crp->Nulls[i] = 'Z'; break;
+ case 4: crp->Nulls[i] = 'U'; break;
+ default: crp->Nulls[i] = v; break;
+ } // endswitch nf
+
crp = crp->Next; // Type_Name
crp->Kdata->SetValue(cmd, i);
@@ -200,7 +204,7 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = crp->Next; // Precision
crp->Kdata->SetValue(len, i);
- crp = crp->Next; // was Length
+ crp = crp->Next; // key (was Length)
fld = myc.GetCharField(4);
crp->Kdata->SetValue(fld, i);
@@ -218,9 +222,13 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
fld = myc.GetCharField(8);
crp->Kdata->SetValue(fld, i);
- crp = crp->Next; // New
+ crp = crp->Next; // Date format
crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i);
+ crp = crp->Next; // New (default)
+ fld = myc.GetCharField(5);
+ crp->Kdata->SetValue(fld, i);
+
crp = crp->Next; // New (charset)
fld = myc.GetCharField(2);
crp->Kdata->SetValue(fld, i);
@@ -657,6 +665,7 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
{
char *fmt;
int n;
+ bool uns;
PCOLRES *pcrp, crp;
PQRYRES qrp;
MYSQL_FIELD *fld;
@@ -707,9 +716,10 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
crp->Prec = (crp->Type == TYPE_FLOAT) ? fld->decimals : 0;
crp->Length = fld->max_length;
crp->Clen = GetTypeSize(crp->Type, crp->Length);
+ uns = (fld->flags & (UNSIGNED_FLAG | ZEROFILL_FLAG)) ? true : false;
if (!(crp->Kdata = AllocValBlock(g, NULL, crp->Type, m_Rows,
- crp->Clen, 0, FALSE, TRUE, FALSE))) {
+ crp->Clen, 0, FALSE, TRUE, uns))) {
sprintf(g->Message, MSG(INV_RESULT_TYPE),
GetFormatType(crp->Type));
return NULL;