Re: no conversion changes...

"ZIGLIO, Frediano, VF-IT" <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
> Frediano Ziglio wrote:
> > Il giorno sab, 13/09/2008 alle 16.51 -0400, James K. Lowden 
> ha scritto:
> > > First: What do we mean by "wide"?  UCS-2?  UTF-16?  
> UCS-4?  UTF-8?  Is
> > > it compile-time dependent?  Run-time?  
> > 
> > It depends from DM... unixODBC use UCS-2 while iODBC use wchar_t
> > (usually UCS-4 on Unix.. or not?? I'm not sure, certainly Linux use
> > UCS-4). Using unixODBC there is a configuration flags to 
> use wchar_t but
> > usually is not enabled
> 
> OK, so it's a compile-time setting.  
> 
> > > I see a
> > > reference to a "ODBC 3.5 (or later) Unicode Driver".  Is that what
> > > we're building?  
> > 
> > Yes, in a future (not very far) yes
> 
> OK. 
> 
> > Unicode driver means that all ANSI version have a
> > corresponding unicode version (like SQLExecDirectW for 
> SQLExecDirect).
> > The change is interpret characters as wide instead of ANSI.
> 
> I see.  So a Unicode appliction calls SQLExecDirectW, or does a
> preprocessor macro convert it, something like:
> 
> 	#if UNICODE
> 	#define SQLExecDirect SQLExecDirectW
> 	#endif
> 
> ??
> 

Yes

> > > Fourth: Can you show me the API function call sequence that mixes
> > > encodings for a single column?  
> > 
> > I never tried but I think reading TEXT/NTEXT with 
> SQLGetData changing
> > SQL_C_CHAR/SQL_C_WCHAR for the same column.
> 
> The app can call SQLBindCol in between calls to SQLFetch, too:  
> 
> 	"A column can be bound, unbound, or rebound at any 
> time, even after data
> has been fetched from the result set. The new binding takes effect the
> next time that a function that uses bindings is called."
> (http://msdn.microsoft.com/en-us/library/ms711010(VS.85).aspx)
> 

Yes, it's correct... however using SQLGetData you don't have a bind active. 

> > > Maybe it would be easier to create a BRANCH_UNICODE branch in CVS 
> > 
> > I would
> > prefer a "from XXX date code is quite broken so if you want 
> to use CVS
> > use cvs co -D XXX". 
> 
> OK.  Maybe just a CVS tag UNICODE_BASE or something like 
> that, so we don't
> have to remember the date.  
> 
> As long as db-lib and ct-lib remain useable in CVS HEAD, I'm happy.  I
> intend to change tds_connect() for example, so broken code 
> would be bad.  
> 

I did the branch however currently changes to code are very limited and still "#if
ENABLE_DEVELOPMENT" marked.

> > To be sure we could branch and continue working on CVS 
> HEAD, having a
> > BRANCH_NOUNICODE. Branch and merging is heavy on CVS, this way main
> > changes will go to the no-branch.
> 
> We can do that later if HEAD becomes too unstable to use.  
> 
> > The problem with "convert nearest the wire" is that at the 
> moment libTDS
> > fetch data and fill row buffer it doesn't know which encode 
> the client
> > wants (SQL_C_CHAR or SQL_C_WCHAR). 
> 
> Understood.  
> 
> > All that stuff suggest me "direct binding"... 
> 
> Right.  Convert at the ODBC<->libtds boundary.  
> 

Yes, from TODOs I can see:
- Upper layer should be able to read data from network and handle rows
- Possibility to stop sending/receiving data for SQLPutData and similar
- limit copy of data (now wire -> tds -> temp -> client)
  use a method like zero-copy
  In token.c getting row should write data even to client
  (callback, new user types, see ctlib conversion functions)
  In query.c writing data do the same (use additional column fields?)

I think I'll start implementing some of them... I think that we should have an option
where libTDS could stop before columns/parameters and return data as streams. Something
like tds_read_data(tds, buffer, size). Perhaps it would be better to define even a
structure like TDSSTREAM with a read "method". So even tdsconvert could use this
structure. Well.. this would give to libTDS the possibility to return data, even
chunked/blob without allocating any data. You should ask me why it helps with ODBC...
well... it helps with SQLGetData :). I discovered that SQLGetData can return
*StrLen_or_IndPtr as SQL_NO_TOTAL. This help me in situations where you have to convert
for instance big5->ucs2 or similar. There are issues as some client call SQLGetData with
BufferLength == 0 to determine the size to allocate but this is not my problem :). Another
note for blob1 test... I changed it to align behavior to MS one but I think that MS
behavior is not correct :(. From documentation: "If the length of character data
(including the null-termination character) exceeds BufferLength, SQLGetData truncates the
data to BufferLength less the length of a null-termination character. It then
null-terminates the data.", actually MS can truncate data using less bytes due to
conversion binary -> char, for instance passing 0x010203 and a BufferLength of 4
(SQL_C_CHAR) documentation state it should return "012" (terminated) but MS actually
returns "01" (terminated). So test was correct... I'll rollback change if nobody disagree.

> > how to implement all new datatypes of mssql2005 and mssql2008 ?? One
> > problem with mssql2005 is the VARCHAR(MAX) which can be very large,
> > something like SYBLONGCHAR/SYBBLOB of Sybase (still not 
> that supported).
> 
> I haven't thought about this very much.  I know that for 
> zero-copy, the
> client library must provide the target buffer into which 
> libtds places the
> data.  
> 

IMO there are two way to implement it:
- libTDS store in buffer provided by client
- client read data from libTDS directly (like using streams above)

Actually streams are not the easy cause client must be able to
- read size if available. Think BLOBs, mainly they have a size that is passed before all
data, but chunked versions (like VARCHAR(MAX) which I would like to implement or SYBBLOB
Sybase type) can have no initial size
- discard pending data (for truncation and similar)

> > I'm currently filling a table of types with flags (like 
> ascii, unicode,
> > fixed and so on) and other informations (varint ms/sybase)
> 
> Excellent.  You might want "cardinal" type, too.  
> 

Yes, I think this is the missing information. The table is now at misc/types.txt. There is
a script at misc/types.sh that convert it to CSV and a script at src/tds/types.pl that
convert this table to src/tds/types.h which replace some old functions.

I didn't actually a "cardinal type" cause is actually very libTDS bounded. Mainly it's
just a fix of conversions to single-bytes and limiting types. 

Well... but what's SYBNVARCHAR type?? Where does this type came?? Is not documented in
Sybase so I thik is MS but why having a SYBNVARCHAR if XSYBNVARCHAR is available?? From my
memory they introduced nvarchar and types with extended (>255) size at the same time...

bye
  freddy77

_______________________________________________
FreeTDS mailing list
[email protected]
http://lists.ibiblio.org/mailman/listinfo/freetds
smime.p7s (application/x-pkcs7-signature, 3.1 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.