From: Bob D. <bd...@si...> - 2005-04-11 14:13:09
|
Hello, On Mon, 2005-04-11 at 13:47 +0200, Zoltan Boszormenyi wrote: > Hi, > > I am experimenting with this report maker software to finally > deploy it in a multiplatform environment. I make my (GPLed) program > under Fedora Core 3/x86-64 and will compile it for Windows with MingW. Cool! > > My software is special purpose software for business planning and > invoicing for a subsidiary of the Hungarian national oil company. > > I use GTK2 and ODBC as both work under both Linux and Windows. > > I have first compiled rlib-1.3.2 with the --enable-utf8 option > because under Fedora Core everything is UTF-8 encoded and GTK2 > also has a strong dependence on UTF-8 even on Windows. > The report XML file is UTF-8 encoded, as I typed in some literals > into it with Hungarian accented characters. My PostgreSQL database > is created with UTF-8 encoding. One of the reasons UTF-8 support is half ass in RLIB is because UTF-8 PDF Support is not there at all. > > But UTF-8 in RLIB causes problems. All the literals and the strings > that come from the data source are displayed incorrectly. And on the > terminal, I got "Encoder was NULL" messages. > Here's my code that tries to report something: > > ------------------------------------------- > char *query = "some sqlquery..."; > > r = rlib_init(); > rlib_add_datasource_odbc(r, "mainsource", "ODBCDSN", "uid", "pwd"); > rlib_add_query_as(r, "mainsource", query, "mainquery"); > rlib_add_report(r, "rlibtest.xml"); > rlib_set_output_format(r, RLIB_FORMAT_PDF); > rlib_execute(r); > output_type = rlib_get_content_type_as_text(r); > outbuf = rlib_get_output(r); > output_len = rlib_get_output_length(r); > > fn = open("out.pdf", O_RDWR|O_CREAT|O_TRUNC); > if (fn) { > write(fn, outbuf, output_len); > close(fn); > } else > printf("open() error: %s\n", strerror(errno)); > > rlib_free(r); > ------------------------------------------- > > After I recompiled rlib without UTF-8 support and set > the connection string in the ODBC DSN to > "set client_encoding='ISO-8859-2'" all the string are displayed > correctly. I wasn't surprised by the strings it fetched from the > query, but the literals in the XML file are still UTF-8. (?) > The XML encoding is explicitely UTF-8, as the first line is: You should probably make your encoding "ISO-8859-2" in the xml here in order to make the characters come out correctly. > > <?xml version="1.0" encoding="UTF-8"?> > > OK then, I will have to set up two ODBC DSNs, one for the GTK2 > application, one for the report purposes. Not a big problem, > but I would like to use only one. When will the UTF-8 usage > be fixed in RLIB? Nudge, nudge. :-) If you make RLIB compile in windows with MingGW I'll make sure UTF-8 Support works for you :). Cygwin/mingw and -mno-cygwin have been driving me nuts trying to make windows DLL's > > The other, more serious problem is that if I use the ODBC > input method in RLIB, the last record is repeated 4 times, > somehow overwriting the first 3 records. And if the query > gave less than 3 records (i.e. 0, 1 or 2) then RLIB crashes. > > I.e. my query gave 54 records and for easy comparison, > I put an ORDER BY clause into it. Running the query from psql > shows that the first three records are missing and the > last record is repeated four times in the PDF report produced > by RLIB. The same happened with the report in text format. > > It did not happen when I tried using the native PostgreSQL > call in RLIB, so I took a look into the ODBC input method > and I found a strange next/previous state and row copying > logic. I modified the inputs/odbc/odbc.c and it now uses > SQLFetchScroll(hStmt, SQL_FETCH_{FIRST|NEXT|PRIOR|LAST}, 0) > instead of just SQLFetch(hStmt). It fixed the problem for me. > My ODBC 3.5 Developers Guide says that SQLFetchScroll() is > defined in X/OPEN 95 CLI or under ODBC 3.0+. But it's > CORE Conformance functionality, so it's kind of expected to work > anywhere. Well, except ODBC 2.0 and lower, a.k.a in very old > Win16 drivers. Hm, I just checked the www.unixodbc.org site and > the MySQL and PostgreSQL drivers' ODBC versions are 2.5 and > SQLFetchScroll() definitely works in the unixODBC PostgreSQL > driver. I expect the same from the MySQL ODBC driver. > > When the Windows port of RLIB is ready, ODBC will be the first > input method that will work and it must work properly. Yes. I never use the ODBC stuff and I did it a year ago for some dude as a favor and I never maintained it or really checked that it worked properly ;) > > So please, consider adding my patch to RLIB-1.3.3 or whatever the > next version is. > > I read the policy about patches at http://rlib.sicompos.com > I will print, sign and send the copyright assignment but please > allow me some days to actually do it. I don't have a printer > at present and I am off-work to finish the above mentioned > software, for my second work. Cool! Thanks > > I will definitely send more patches towards you, to fix issues > and warnings that pop up. I already found a solution for the > "langinfo.h is missing under MingW", so one compilation error > is fixed under Windows. The attached ODBC fix at least allows > me to create my reports and test it under Linux. Great! > > And I have some warning fixes that follows the GTK2 development > guideline, e.g. replacing (gpointer *)x with GINT_TO_POINTER(x). > The macro works correctly under x86-64, where the explicit > pointer conversion prints warnings. Thanks! Patch looks nice. I'll apply it as soon as you sign the copyright assignment. - Bob |