[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