[Qgis-developer] DBMS support for Win32

Tim Sutton tim at linfiniti.com
Tue Dec 11 07:19:30 EST 2007


Hi Benjamin

Great -  did you make your edits in INSTALL.t2t ? If so, could you
supply your changes as a patch? Be sure to include your name in the
credits at the bottom of the file too.

Regards

Tim

2007/12/11, Benjamin Ducke <benjamin.ducke at ufg.uni-kiel.de>:
> FWIW, I have attached all my notes on how to get support for
> SQLite, MySQL, PostgreSQL and ODBC into GDAL and GRASS using MinGW.
> I don't know whether all of this is optimal, but it works
> for me.
>
> If you find anything wrong or missing in the instructions, please
> let me know.
>
> Benjamin
>
>
>
> --
> Benjamin Ducke, M.A.
> Archäoinformatik
> (Archaeoinformation Science)
> Institut für Ur- und Frühgeschichte
> (Inst. of Prehistoric and Historic Archaeology)
> Christian-Albrechts-Universität zu Kiel
> Johanna-Mestorf-Straße 2-6
> D 24098 Kiel
> Germany
>
> Tel.: ++49 (0)431 880-3378 / -3379
> Fax : ++49 (0)431 880-7300
> www.uni-kiel.de/ufg
>
>
> 1. COMPILING DBMS DRIVERS
>
>
>
>
> **** ODBC ****
>
> ODBC support is part of the standard Win32 functionality. A recent version of MinGW's Win32 API should have the necessary header file sql.h. In addition, you need to copy over odbc32.dll to a location where the MSYS shell and the GRASS configure script can see it. On a Windows 2000 system, the library we need is located in C:\WINNT\system32. On XP it is in C:\Windows\system32.
>
> You also need to rename the library to odbc.dll so the GRASS and GDAL configure scripts will detect it. E.g., on a Windows 2000 system, do:
>
> cp /c/WINNT/system32/odbc32.dll /usr/lib/odbc.dll
> cp /c/WINNT/system32/odbc32.dll /usr/lib/odbcinst.dll
>
> Note: In order to correctly parse the declarations in the odbc header files (sqltype.h, etc.), the file /mingw/include/windows.h needs to be included in every source file that uses ODBC function calls (especially important for GRASS ODBC support: see notes in ).
>
> Note: Windows' own odbc32.dll is not free software and cannot be re-distributed freely! This should not be necessary, however, as every Windows installation should come with a copy of it. To make sure you do not accidentally re-distribute a copy, you may want to delete odbc.dll from /usr/lib after you have finished linking your software to it.
>
>
> **** PostgreSQL 8.2.5 ****
>
> Download the file postgresql-8.2.5.tar.bz2 from  and save in the source folder.
>
> cd /src
> tar -xjf postgresql-8.2.5.tar.bz2
> cd postgresql-8.2.5
>
> In file src/include/port.h: Comment out or delete the line with the definition of the function gettimeofday().
>
> In file src/include/port/win32.h: Comment out or delete the entire definition of struct timezone{}.
>
> In file src/port/gettimeofday.c: Rename the function gettimeofday() to gettimeofday2().
>
> Now continue:
>
> ./configure --prefix=/usr --with-libs=/usr/lib --with-includes=/usr/include --bindir=/usr/local/bin --with-openssl
> make
> make install
> cp /usr/lib/*.dl* /usr/local/bin/
> cp /usr/lib/postgresql/*.dll /usr/local/bin/ -R
>
>
>
> **** SQLite 3.5.1 ****
>
> SQLite is a drop-in replacement for DBF as a file-based attribute data storage that is more flexible and less limited (e.g. no 2GB maximum file size limit).
>
> Download sqlite-3.5.1.tar.gz from  and save it into the source directory.
>
> cd /src
> tar -xzvf sqlite-3.5.1.tar.gz
> cd sqlite-3.5.1
> ./configure --bindir=/usr/local/bin --prefix=/usr --disable-static --enable-shared
> make
>
> We now need to create the DLL files for Win32 and install all neded binaries and header files manually, as the ``make install'' fails for various reasons with MinGW:
>
> make sqlite3.dll
> cp sqlite3.dll /usr/lib/libsqlite3.dll
> cp sqlite3.h /usr/include
> cp sqlite3.exe /usr/local/bin
>
>
>
> **** MySQL 5.0.45 from Binaries ****
>
> Download the file mysql-noinstall-5.0.45-win32.zip from  and save it to any folder.
>
> Uncompress the zip files contents, below the top level directory mysql-5.0.45-win32, to C:\msys\1.0\local\mysql, so that the subfolders bin, data, Docs, etc. go directly into C:\msys\1.0\local\mysql.
>
> In order to get headers and DLLs to work with MinGW, a few adjustments are needed.
>
> First, the libmysql.def file shipped with the MySQL binaries is missing mangled function names which the MinGW linker needs. Open the file C:\msys\1.0\local\mysql\include\libmysql.def in a text editor and make sure it has the following content:
>
> LIBRARY         LIBMYSQL
> VERSION         6.0
> EXPORTS
>         _dig_vec_lower
>         _dig_vec_upper
>         bmove_upp
>         delete_dynamic
>         free_defaults
>         getopt_compare_strings
>         getopt_ull_limit_value
>         handle_options
>         init_dynamic_array
>         insert_dynamic
>         int2str
>         is_prefix
>         list_add
>         list_delete
>         load_defaults
>         my_end
>         my_getopt_print_errors
>         my_init
>         my_malloc
>         my_memdup
>         my_no_flags_free
>         my_path
>         mysql_get_parameters
>         my_print_help
>         my_print_variables
>         my_realloc
>         my_strdup
>         mysql_thread_end
>         mysql_thread_init
>         myodbc_remove_escape
>         mysql_affected_rows
>         mysql_autocommit
>         mysql_stmt_bind_param
>         mysql_stmt_bind_result
>         mysql_change_user
>         mysql_character_set_name
>         mysql_close
>         mysql_commit
>         mysql_data_seek
>         mysql_debug
>         mysql_dump_debug_info
>         mysql_eof
>         mysql_errno
>         mysql_error
>         mysql_escape_string
>         mysql_hex_string
>         mysql_stmt_execute
>         mysql_stmt_fetch
>         mysql_stmt_fetch_column
>         mysql_fetch_field
>         mysql_fetch_field_direct
>         mysql_fetch_fields
>         mysql_fetch_lengths
>         mysql_fetch_row
>         mysql_field_count
>         mysql_field_seek
>         mysql_field_tell
>         mysql_free_result
>         mysql_get_client_info
>         mysql_get_host_info
>         mysql_get_proto_info
>         mysql_get_server_info
>         mysql_get_client_version
>         mysql_get_ssl_cipher
>         mysql_info
>         mysql_init
>         mysql_insert_id
>         mysql_kill
>         mysql_set_server_option
>         mysql_list_dbs
>         mysql_list_fields
>         mysql_list_processes
>         mysql_list_tables
>         mysql_more_results
>         mysql_next_result
>         mysql_num_fields
>         mysql_num_rows
>         mysql_odbc_escape_string
>         mysql_options
>         mysql_stmt_param_count
>         mysql_stmt_param_metadata
>         mysql_ping
>         mysql_stmt_result_metadata
>         mysql_query
>         mysql_read_query_result
>         mysql_real_connect
>         mysql_real_escape_string
>         mysql_real_query
>         mysql_refresh
>         mysql_rollback
>         mysql_row_seek
>         mysql_row_tell
>         mysql_select_db
>         mysql_stmt_send_long_data
>         mysql_send_query
>         mysql_shutdown
>         mysql_ssl_set
>         mysql_stat
>         mysql_stmt_affected_rows
>         mysql_stmt_close
>         mysql_stmt_reset
>         mysql_stmt_data_seek
>         mysql_stmt_errno
>         mysql_stmt_error
>         mysql_stmt_free_result
>         mysql_stmt_num_rows
>         mysql_stmt_row_seek
>         mysql_stmt_row_tell
>         mysql_stmt_store_result
>         mysql_store_result
>         mysql_thread_id
>         mysql_thread_safe
>         mysql_use_result
>         mysql_warning_count
>         mysql_stmt_sqlstate
>         mysql_sqlstate
>         mysql_get_server_version
>         set_dynamic
>         strcend
>         strcont
>         strdup_root
>         strfill
>         strinstr
>         strmake
>         strmov
>         strxmov
>         mysql_stmt_prepare
>         mysql_stmt_init
>         mysql_stmt_insert_id
>         mysql_stmt_attr_get
>         mysql_stmt_attr_set
>         mysql_stmt_field_count
>         client_errors
>         mysql_set_local_infile_default
>         mysql_set_local_infile_handler
>         mysql_disable_reads_from_master
>         mysql_disable_rpl_parse
>         mysql_enable_reads_from_master
>         mysql_enable_rpl_parse
>         mysql_master_query
>         mysql_rpl_parse_enabled
>         mysql_rpl_probe
>         mysql_rpl_query_type
>         mysql_slave_query
>         mysql_embedded
>         mysql_server_init
>         mysql_server_end
>         mysql_set_character_set
>         mysql_get_character_set_info
>         get_defaults_options
>         modify_defaults_file
>       mysql_affected_rows at 4
>       mysql_close at 4
>       mysql_error at 4
>       mysql_escape_string at 12
>       mysql_fetch_fields at 4
>       mysql_fetch_lengths at 4
>       mysql_fetch_row at 4
>       mysql_free_result at 4
>       mysql_init at 4
>       mysql_num_fields at 4
>       mysql_options at 12
>       mysql_query at 8
>       mysql_real_connect at 32
>       mysql_real_escape_string at 16
>       mysql_stmt_bind_param at 8
>       mysql_stmt_bind_result at 8
>       mysql_stmt_close at 4
>       mysql_stmt_error at 4
>       mysql_stmt_execute at 4
>       mysql_stmt_fetch at 4
>       mysql_stmt_free_result at 4
>       mysql_stmt_init at 4
>       mysql_stmt_param_count at 4
>       mysql_stmt_prepare at 12
>       mysql_stmt_result_metadata at 4
>       mysql_stmt_store_result at 4
>       mysql_store_result at 4
>       mysql_use_result at 4
>       myodbc_remove_escape at 8
>       mysql_autocommit at 8
>       mysql_change_user at 16
>       mysql_character_set_name at 4
>       mysql_commit at 4
>       mysql_connect
>       mysql_create_db
>       mysql_debug at 4
>       mysql_dump_debug_info at 4
>       mysql_eof at 4
>       mysql_fetch_field at 4
>       mysql_fetch_field_direct at 8
>       mysql_field_count at 4
>       mysql_field_seek at 8
>       mysql_field_tell at 4
>       mysql_get_client_info at 0
>       mysql_get_client_version at 0
>       mysql_get_host_info at 4
>       mysql_get_proto_info at 4
>       mysql_get_server_info at 4
>       mysql_get_server_version at 4
>       mysql_hex_string at 12
>       mysql_kill at 8
>       mysql_list_dbs at 8
>       mysql_list_fields at 12
>       mysql_list_processes at 4
>       mysql_list_tables at 8
>       mysql_more_results at 4
>       mysql_next_result at 4
>       mysql_num_rows at 4
>       mysql_ping at 4
>       mysql_real_query at 12
>       mysql_rollback at 4
>       mysql_row_tell at 4
>       mysql_select_db at 8
>       mysql_set_server_option at 8
>       mysql_shutdown at 8
>       mysql_sqlstate at 4
>       mysql_ssl_set at 24
>       mysql_stat at 4
>       mysql_stmt_affected_rows at 4
>       mysql_stmt_attr_get at 12
>       mysql_stmt_attr_set at 12
>       mysql_stmt_data_seek at 12
>       mysql_stmt_errno at 4
>       mysql_stmt_fetch_column at 16
>       mysql_stmt_field_count at 4
>       mysql_stmt_insert_id at 4
>       mysql_stmt_num_rows at 4
>       mysql_stmt_param_metadata at 4
>       mysql_stmt_reset at 4
>       mysql_stmt_row_seek at 8
>       mysql_stmt_row_tell at 4
>       mysql_stmt_send_long_data at 16
>       mysql_stmt_sqlstate at 4
>       mysql_thread_end at 0
>       mysql_thread_id at 4
>       mysql_thread_init at 0
>       mysql_thread_safe at 0
>       mysql_warning_count at 4
>       mysql_errno at 4
>       mysql_insert_id at 4
>
> Now, re-generate the libraries:
>
> cd /usr/local/mysql
> dlltool --input-def include/libmySQL.def --dllname bin/libmysql.dll --output-lib bin/libmysqlclient.a -k
>
> You need to adjust some lines in C:\msys\1.0\local\mysql\include\mysql.h. Locate the paragraph that reads:
>
> #ifndef my_socket_defined
> #ifdef __WIN__
> #define my_socket SOCKET
> #else
>
> typedef int my_socket;
>
> #endif /* __WIN__ */
> #endif /* my_socket_defined */
> #endif /* _global_h */
>
>
> And change it to:
>
> #ifndef my_socket_defined
> #ifdef __WIN__
>
> typedef int my_socket;
>
> #endif /* __WIN__ */
> #endif /* my_socket_defined */
> #endif /* _global_h */
>
>
> In C:\msys\1.0\etc\profile, extend the system path to include the MySQL programs:
>
> export PATH="$PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts"
>
> Unfortunately, we need to do a little more clean-up work so that other software will be able to link to the MySQL libraries later.
>
> Open the file C:\msys\local\mysql\include\config-win.h in a text editor.
>
> Remove the entire code block that re-defines the function ``rint'' (ca. lines 227-232):
>
> inline double rint(double nr)
> {
>   double f = floor(nr);
>   double c = ceil(nr);
>   return (((c-nr) >= (nr-f)) ? f :c);
> }
>
> Remove the line (ca. 453) that re-defines the function ``popen'':
>
> #define popen(A,B) _popen((A),(B))
>
> Next, open the C:\msys\local\mysql\scripts\mysql_config in a text editor. This script tells other programs where to find MySQL libraries and include files. We need to fill in some information manually. Locate the lines that define the items ``pkglibdir'', ``pkgincludedir'', ``cflags'' and ``libs'' and change them to the following:
>
>
> pkglibdir='/usr/local/mysql/bin'
> pkgincludedir='/usr/local/mysql/include'
> cflags="-I$pkgincludedir " #note: end space!
> libs="-L$pkglibdir -lz -leay32 -lssleay32 -lmysql"
>
>
>
> 2. CONFIGURING GRASS
>
> ./configure --with-includes=/usr/include --with-libs=/usr/lib --enable-shared=yes --with-opengl=windows --with-curses --with-cxx --without-fftw --with-mysql --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/bin/ --with-odbc --with-postgres --with-sqlite --without-x11
>
>
>
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.qgis.org
> http://lists.qgis.org/cgi-bin/mailman/listinfo/qgis-developer
>
>


-- 
Tim Sutton
QGIS Project Steering Committee Member - Release  Manager
Visit http://qgis.org for a great open source GIS
openModeller Desktop Developer
Visit http://openModeller.sf.net for a great open source ecological
niche modelling tool
Home Page: http://tim.linfiniti.com
Skype: timlinux
Irc: timlinux on #qgis at freenode.net



More information about the Qgis-developer mailing list