Re: db-lib: support for new MS SQL 2008 data types - part 2
LacaK <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <[email protected]> |
Frediano Ziglio wrote / napísal(a): > 2014-04-04 11:00 GMT+01:00 LacaK <[email protected]>: > >> Now I can read successfuly: >> - dbcoltype() returning SYBMSDATE, SYBMSTIME, SYBMSDATETIME2 >> >> I am trying do next small step. >> As far as I understand dbdata() function for SYBMSDATE, SYBMSTIME, >> SYBMSDATETIME2 return pointer to TDS_DATETIMEALL struct. >> (dbdata() internally uses: return (BYTE *) colinfo->column_data) >> >> > > Well.... dbdata returns any possible column_data stored. This does not > exactly means that is correct for these types. All other types are > coded as wire data while these type use an internal encoding defined > by our library. > > >> If it is so I need some way how to convert TDS_DATETIMEALL struct to >> DBDATEREC struct. >> (which is good readable) >> >> There is already function: >> dbdatecrack(DBPROCESS * dbproc, DBDATEREC * output, DBDATETIME * datetime) >> but it takes as 3rd parameter DBDATETIME struct, which is struct used by old >> "datetime" data type SYBDATETIME) >> >> So my idea is introduce new API function: >> tdsdbdatecrack(DBPROCESS * dbproc, INT datetype, DBDATEREC * output, const >> void *datetime) >> (like we have tdsdbopen() vs dbopen()) >> Where datetime can be pointer to either old DBDATETIME or new >> TDS_DATETIMEALL, depending on datetype supplied >> >> > > Could work. You can use tds_datecrack to help you. > > >> What is your opinion on that? >> I am asking for sure about every step, because I am not so familiar with >> internals. >> >> Thanks >> -Laco. >> > > > Here the problem is not internals but dblib. There is no definition on > how to extend this library. There's also a problem on the precision of > DBDATEREC which do not take into account fraction of seconds beside > milliseconds > For now I have realized that I do not need conversion from TDS_DATETIMEALL to DBDATEREC. I can easy parse TDS_DATETIMEALL and convert it direct to FreePascal TDateTime data type, which is my destination type. I attach small patches for - src/dblib/dblib.c: "Adjust dbconvert() to support SYBMSDATE, SYBMSTIME, SYBMSDATETIME2, SYBMSDATETIMEOFFSET data types" - src/tds/token.c: "add data type name for SYBMSXML, SYBMSDATETIMEOFFSET to tds_prtype()" Thanks -Laco. _______________________________________________ FreeTDS mailing list [email protected] http://lists.ibiblio.org/mailman/listinfo/freetds
dblib.c.diff
(text/plain, 1.2 KB)
--- dblib.c.ori Thu Apr 03 13:39:42 2014 +++ dblib.c Fri Apr 11 09:41:32 2014 @@ -2325,6 +2325,14 @@ dbconvert(DBPROCESS * dbproc, int srctyp memcpy(dest, src, ret); break; + case SYBMSDATE: + case SYBMSTIME: + case SYBMSDATETIME2: + case SYBMSDATETIMEOFFSET: + ret = sizeof(TDS_DATETIMEALL); + memcpy(dest, src, ret); + break; + default: ret = -1; break; @@ -2447,6 +2455,13 @@ dbconvert(DBPROCESS * dbproc, int srctyp memcpy(dest, &(dres.u), sizeof(TDS_UNIQUE)); ret = sizeof(TDS_UNIQUE); break; + case SYBMSDATE: + case SYBMSTIME: + case SYBMSDATETIME2: + case SYBMSDATETIMEOFFSET: + memcpy(dest, &(dres.dta), sizeof(TDS_DATETIMEALL)); + ret = sizeof(TDS_DATETIMEALL); + break; case SYBCHAR: case SYBVARCHAR: case SYBTEXT: @@ -7166,6 +7181,11 @@ tds_prdatatype(TDS_SERVER_TYPE datatype_ case SYBUINT8: return "SYBUINT8"; case SYBUNIQUE: return "SYBUNIQUE"; case SYBVARIANT: return "SYBVARIANT"; + case SYBMSXML: return "SYBMSXML"; + case SYBMSDATE: return "SYBMSDATE"; + case SYBMSTIME: return "SYBMSTIME"; + case SYBMSDATETIME2: return "SYBMSDATETIME2"; + case SYBMSDATETIMEOFFSET: return "SYBMSDATETIMEOFFSET"; default: break; } return "(unknown)";
token.c.diff
(text/plain, 429 B)
--- token.c.ori Thu Apr 03 11:04:48 2014 +++ token.c Wed Apr 09 07:55:34 2014 @@ -3014,9 +3014,11 @@ tds_prtype(int type) TYPE(XSYBNVARCHAR, "x UCS-2 varchar"); TYPE(XSYBVARBINARY, "xvarbinary"); TYPE(XSYBVARCHAR, "xvarchar"); + TYPE(SYBMSXML, "xml"); TYPE(SYBMSDATE, "date"); TYPE(SYBMSTIME, "time"); TYPE(SYBMSDATETIME2, "datetime2"); + TYPE(SYBMSDATETIMEOFFSET, "datetimeoffset"); default: break; }