diff options
author | Olivier Bertrand <bertrandop@gmail.com> | 2013-12-03 22:59:40 +0100 |
---|---|---|
committer | Olivier Bertrand <bertrandop@gmail.com> | 2013-12-03 22:59:40 +0100 |
commit | ee2f04450b45515c507e4511c26e48e2b846aa73 (patch) | |
tree | 2c1d9bec56e1268c8c41629ae1dd4f1d8253f471 /storage/connect/myconn.cpp | |
parent | d240a0418cf6d59fba711f0677f164d9ee881b7e (diff) | |
download | mariadb-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.cpp | 74 |
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; |