A MacPort/RubyODBC Update
Quite a while ago I wrote a soup to nuts article on getting the full multi-ruby development stack installed for those using the SQL Server adapter. The base package management system used there was MacPorts. In it I described how to edit the outdated Portfile for the rb-odbc package and exclaimed how important it was to use the +utf8 variant. I was totally wrong about that part.
This past week I started heavily exploring RVM at the advice of friend while we visited the Boston.rb user grooup. As an aside, I finally feel my unix-fu is strong enough to cover the edge cases needed to get the SQL Server stack happy with RVM. Good news, but that's next weeks blog post. Anyways I found that while updating my core MacPort's rb-odbc package that +utf8 was blowing up. I am currently using MacPorts 1.9.1 and was targeting 0.99991 of RubyODBC. Here is the updated port file. To edit your current port file run mate $(port file rb-odbc)
and paste this new one in. Details afterward.
# $Id: Portfile 30250 2010-07-18 02:16:17Z ken@metaskills.net $
PortSystem 1.0
PortGroup ruby 1.0
ruby.setup {odbc ruby-odbc} 0.99991 extconf.rb {README doc test}
maintainers nomaintainer
description An extension library for ODBC from ruby.
long_description Extension library to use ODBC data sources from Ruby. \
Supports Ruby 1.6.x and 1.8 on Win32 OSes and UN*X
checksums md5 64eaf6089e7ca17eeff54c4fe052ac96
homepage http://www.ch-werner.de/rubyodbc
master_sites http://www.ch-werner.de/rubyodbc
categories-append databases
platforms darwin
configure.cmd ${ruby.bin} -rvendor-specific -Cext extconf.rb
build.pre_args-append -C ext
destroot.pre_args-append -C ext
variant utf8 {
configure.cmd ${ruby.bin} -rvendor-specific -Cext/utf8 extconf.rb
build.pre_args-delete -C ext
build.pre_args-append -C ext/utf8
destroot.pre_args-delete -C ext
destroot.pre_args-append -C ext/utf8
}
So where did I go wrong on my old article? My first big mistake was thinking that the +utf8
port variant was needed. Not only is it NOT NEEDED, it may not work right at all. In fact, the old Portfile in MacPorts trunk technically did not even configure/make/install the utf8 version either! Honestly – I spent all day learning the MacPort's Portfile syntax and tested this. Installing that variant just breaks with an error like LoadError: dlsym(0x1010cd3b0, Init_odbc): symbol not found
.
So, even though my updated Portfile above now fixes that issue and supports actually building a utf8 version of RubyODBC, YOU DO NOT NEED IT! In fact the entire SQL Server stack is tested with the plain non-utf8 package and passes with flying colors. This includes passing tests where unicode columns return correctly utf8-encoded strings, among others. Though I have not tested it, I believe the utf8 version would do more damage than good. The RubyODBC documentation says it would make every string utf8 encoded. Not good for an adapter that has mixed data types. For my own personal notes, here is a diff of the Makefile below. I think the Init_odbc error was a result of a missing flag in the Makefile.
# My notes
# +CPPFLAGS = -DHAVE_LONG_LONG
# +CPPFLAGS = -DHAVE_VERSION_H
# +CPPFLAGS = -DHAVE_TYPE_SQLBIGINT
# -CPPFLAGS = -DHAVE_SQLCONFIGDATASOURCEW
# -CPPFLAGS = -DHAVE_SQLINSTALLERERRORW
# -CPPFLAGS = -DHAVE_SQLWRITEFILEDSNW
# -CPPFLAGS = -DHAVE_SQLREADFILEDSNW
--- Makefile(+utf8) 2010-07-18 12:00:24.000000000 -0400
+++ Makefile(-utf8) 2010-07-18 12:49:32.000000000 -0400
@@ -47,7 +47,7 @@
CFLAGS = -fno-common -O2 -arch x86_64 -fno-common -pipe -fno-common $(cflags) -arch x86_64
INCFLAGS = -I. -I. -I/opt/local/lib/ruby/1.8/i686-darwin10 -I.
DEFS =
-CPPFLAGS = -DHAVE_SQL_H -DHAVE_SQLEXT_H -DHAVE_TYPE_SQLTCHAR -DHAVE_TYPE_SQLLEN -DHAVE_TYPE_SQLULEN -DHAVE_ODBCINST_H -DHAVE_SQLCONFIGDATASOURCEW -DHAVE_SQLWRITEFILEDSNW -DHAVE_SQLREADFILEDSNW -DHAVE_SQLINSTALLERERROR -DHAVE_SQLINSTALLERERRORW -I/opt/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -I/opt/local/include
+CPPFLAGS = -DHAVE_VERSION_H -DHAVE_SQL_H -DHAVE_SQLEXT_H -DHAVE_TYPE_SQLTCHAR -DHAVE_TYPE_SQLLEN -DHAVE_TYPE_SQLULEN -DHAVE_ODBCINST_H -DHAVE_SQLINSTALLERERROR -DHAVE_TYPE_SQLBIGINT -I/opt/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -I/opt/local/include -DHAVE_LONG_LONG
CXXFLAGS = $(CFLAGS)
ldflags = -L. -L/opt/local/lib -arch x86_64
dldflags =
@@ -89,7 +89,7 @@
LIBS = $(LIBRUBYARG_SHARED) -lodbcinst -lodbc -lpthread -ldl -lobjc
SRCS = init.c odbc.c
OBJS = init.o odbc.o
-TARGET = odbc_utf8
+TARGET = odbc
DLLIB = $(TARGET).bundle
EXTSTATIC =
STATIC_LIB =