add all hashes method--the speed is good about 0.58 versus 0.68 if you do it the old Ruby way
This commit is contained in:
parent
b9e2abaa70
commit
266ef93d28
114
ext/Makefile
114
ext/Makefile
@ -4,73 +4,59 @@ SHELL = /bin/sh
|
|||||||
#### Start of system configuration section. ####
|
#### Start of system configuration section. ####
|
||||||
|
|
||||||
srcdir = .
|
srcdir = .
|
||||||
topdir = /usr/local/include/ruby-1.9.0
|
topdir = /Users/rogerpack/dev/ruby_186_installed/lib/ruby/1.8/i686-darwin9.4.0
|
||||||
hdrdir = /usr/local/include/ruby-1.9.0
|
hdrdir = $(topdir)
|
||||||
arch_hdrdir = /usr/local/include/ruby-1.9.0/$(arch)
|
VPATH = $(srcdir):$(topdir):$(hdrdir)
|
||||||
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
prefix = $(DESTDIR)/Users/rogerpack/dev/ruby_186_installed
|
||||||
prefix = $(DESTDIR)/usr/local
|
|
||||||
exec_prefix = $(prefix)
|
exec_prefix = $(prefix)
|
||||||
bindir = $(exec_prefix)/bin
|
|
||||||
sbindir = $(exec_prefix)/sbin
|
|
||||||
libexecdir = $(exec_prefix)/libexec
|
|
||||||
datarootdir = $(prefix)/share
|
|
||||||
datadir = $(datarootdir)
|
|
||||||
sysconfdir = $(prefix)/etc
|
|
||||||
sharedstatedir = $(prefix)/com
|
|
||||||
localstatedir = $(prefix)/var
|
|
||||||
includedir = $(prefix)/include
|
|
||||||
oldincludedir = $(DESTDIR)/usr/include
|
|
||||||
docdir = $(datarootdir)/doc/$(PACKAGE)
|
|
||||||
infodir = $(datarootdir)/info
|
|
||||||
htmldir = $(docdir)
|
|
||||||
dvidir = $(docdir)
|
|
||||||
pdfdir = $(docdir)
|
|
||||||
psdir = $(docdir)
|
|
||||||
libdir = $(exec_prefix)/lib
|
|
||||||
localedir = $(datarootdir)/locale
|
|
||||||
mandir = $(datarootdir)/man
|
|
||||||
sitedir = $(prefix)/lib/ruby/site_ruby
|
sitedir = $(prefix)/lib/ruby/site_ruby
|
||||||
vendordir = $(prefix)/lib/ruby/vendor_ruby
|
|
||||||
rubyhdrdir = $(includedir)/ruby-$(MAJOR).$(MINOR).$(TEENY)
|
|
||||||
sitehdrdir = $(rubyhdrdir)/site_ruby
|
|
||||||
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
|
|
||||||
rubylibdir = $(libdir)/ruby/$(ruby_version)
|
rubylibdir = $(libdir)/ruby/$(ruby_version)
|
||||||
|
docdir = $(datarootdir)/doc/$(PACKAGE)
|
||||||
|
dvidir = $(docdir)
|
||||||
|
datarootdir = $(prefix)/share
|
||||||
archdir = $(rubylibdir)/$(arch)
|
archdir = $(rubylibdir)/$(arch)
|
||||||
sitelibdir = $(sitedir)/$(ruby_version)
|
sbindir = $(exec_prefix)/sbin
|
||||||
|
psdir = $(docdir)
|
||||||
|
localedir = $(datarootdir)/locale
|
||||||
|
htmldir = $(docdir)
|
||||||
|
datadir = $(datarootdir)
|
||||||
|
includedir = $(prefix)/include
|
||||||
|
infodir = $(datarootdir)/info
|
||||||
|
sysconfdir = $(prefix)/etc
|
||||||
|
mandir = $(datarootdir)/man
|
||||||
|
libdir = $(exec_prefix)/lib
|
||||||
|
sharedstatedir = $(prefix)/com
|
||||||
|
oldincludedir = $(DESTDIR)/usr/include
|
||||||
|
pdfdir = $(docdir)
|
||||||
sitearchdir = $(sitelibdir)/$(sitearch)
|
sitearchdir = $(sitelibdir)/$(sitearch)
|
||||||
vendorlibdir = $(vendordir)/$(ruby_version)
|
bindir = $(exec_prefix)/bin
|
||||||
vendorarchdir = $(vendorlibdir)/$(sitearch)
|
localstatedir = $(prefix)/var
|
||||||
|
sitelibdir = $(sitedir)/$(ruby_version)
|
||||||
|
libexecdir = $(exec_prefix)/libexec
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CXX = g++
|
LIBRUBY = $(LIBRUBY_SO)
|
||||||
LIBRUBY = $(LIBRUBY_A)
|
|
||||||
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
||||||
LIBRUBYARG_SHARED = -Wl,-R -Wl,$(libdir) -L$(libdir)
|
LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
|
||||||
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
|
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
|
||||||
OUTFLAG = -o
|
|
||||||
COUTFLAG = -o
|
|
||||||
|
|
||||||
RUBY_EXTCONF_H =
|
RUBY_EXTCONF_H =
|
||||||
CFLAGS = -fPIC -g -O2 $(cflags)
|
CFLAGS = -fno-common -g -O2 -fno-common -pipe -fno-common
|
||||||
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir) -I$(srcdir)
|
INCFLAGS = -I. -I. -I/Users/rogerpack/dev/ruby_186_installed/lib/ruby/1.8/i686-darwin9.4.0 -I.
|
||||||
DEFS = -D_FILE_OFFSET_BITS=64
|
DEFS =
|
||||||
CPPFLAGS = -DHAVE_MYSQL_SSL_SET -DHAVE_RB_STR_SET_LEN -DHAVE_MYSQL_MYSQL_H -I/usr/local/include $(DEFS) $(cppflags)
|
CPPFLAGS = -DHAVE_MYSQL_SSL_SET -DHAVE_MYSQL_H -I/usr/local/mysql/include -Os -arch i386 -fno-common
|
||||||
CXXFLAGS = $(CFLAGS) -g -O2
|
CXXFLAGS = $(CFLAGS)
|
||||||
ldflags = -L. -rdynamic -Wl,-export-dynamic
|
DLDFLAGS = -L.
|
||||||
dldflags =
|
LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
|
||||||
archflag =
|
|
||||||
DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
|
|
||||||
LDSHARED = $(CC) -shared
|
|
||||||
LDSHAREDXX = $(CXX) -shared
|
|
||||||
AR = ar
|
AR = ar
|
||||||
EXEEXT =
|
EXEEXT =
|
||||||
|
|
||||||
RUBY_INSTALL_NAME = ruby
|
RUBY_INSTALL_NAME = ruby
|
||||||
RUBY_SO_NAME = ruby
|
RUBY_SO_NAME = ruby
|
||||||
arch = i686-linux
|
arch = i686-darwin9.4.0
|
||||||
sitearch = i686-linux
|
sitearch = i686-darwin9.4.0
|
||||||
ruby_version = 1.9.0
|
ruby_version = 1.8
|
||||||
ruby = /usr/local/bin/ruby
|
ruby = /Users/rogerpack/dev/ruby_186_installed/bin/ruby
|
||||||
RUBY = $(ruby)
|
RUBY = $(ruby)
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
MAKEDIRS = mkdir -p
|
MAKEDIRS = mkdir -p
|
||||||
@ -83,8 +69,8 @@ COPY = cp
|
|||||||
|
|
||||||
preload =
|
preload =
|
||||||
|
|
||||||
libpath = . $(libdir) /usr/local/lib
|
libpath = . $(libdir)
|
||||||
LIBPATH = -L. -L$(libdir) -Wl,-R$(libdir) -L/usr/local/lib -Wl,-R/usr/local/lib
|
LIBPATH = -L. -L$(libdir)
|
||||||
DEFFILE =
|
DEFFILE =
|
||||||
|
|
||||||
CLEANFILES = mkmf.log
|
CLEANFILES = mkmf.log
|
||||||
@ -94,22 +80,20 @@ extout =
|
|||||||
extout_prefix =
|
extout_prefix =
|
||||||
target_prefix =
|
target_prefix =
|
||||||
LOCAL_LIBS =
|
LOCAL_LIBS =
|
||||||
LIBS = -lmysqlclient -lpthread -lrt -ldl -lcrypt -lm -lc
|
LIBS = $(LIBRUBYARG_SHARED) -L/usr/local/mysql/lib -lmysqlclient -lz -lm -ldl -lobjc
|
||||||
SRCS = mysql.c
|
SRCS = mysql.c
|
||||||
OBJS = mysql.o
|
OBJS = mysql.o
|
||||||
TARGET = mysqlplus
|
TARGET = mysql
|
||||||
DLLIB = $(TARGET).so
|
DLLIB = $(TARGET).bundle
|
||||||
EXTSTATIC =
|
EXTSTATIC =
|
||||||
STATIC_LIB =
|
STATIC_LIB =
|
||||||
|
|
||||||
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
||||||
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
||||||
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
||||||
HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
|
|
||||||
ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
|
|
||||||
|
|
||||||
TARGET_SO = $(DLLIB)
|
TARGET_SO = $(DLLIB)
|
||||||
CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
|
CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
|
||||||
CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
|
CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
|
||||||
|
|
||||||
all: $(DLLIB)
|
all: $(DLLIB)
|
||||||
@ -143,22 +127,22 @@ site-install-rb: install-rb
|
|||||||
.SUFFIXES: .c .m .cc .cxx .cpp .C .o
|
.SUFFIXES: .c .m .cc .cxx .cpp .C .o
|
||||||
|
|
||||||
.cc.o:
|
.cc.o:
|
||||||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
.cxx.o:
|
.cxx.o:
|
||||||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
.C.o:
|
.C.o:
|
||||||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
|
||||||
|
|
||||||
$(DLLIB): $(OBJS)
|
$(DLLIB): $(OBJS)
|
||||||
@-$(RM) $(@)
|
@-$(RM) $@
|
||||||
$(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
$(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
72
ext/mysql.c
72
ext/mysql.c
@ -1064,6 +1064,62 @@ static VALUE fetch_row(VALUE obj)
|
|||||||
return ary;
|
return ary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fetch_hashes_array (internal) */
|
||||||
|
static VALUE fetch_hashes_array(VALUE obj, VALUE with_table)
|
||||||
|
{
|
||||||
|
MYSQL_RES* res = GetMysqlRes(obj);
|
||||||
|
unsigned int n = mysql_num_fields(res);
|
||||||
|
MYSQL_ROW row = mysql_fetch_row(res); // need one early to determine the columns
|
||||||
|
if (row == NULL)
|
||||||
|
return Qnil;
|
||||||
|
unsigned long* lengths = mysql_fetch_lengths(res);
|
||||||
|
MYSQL_FIELD* fields = mysql_fetch_fields(res);
|
||||||
|
unsigned int i;
|
||||||
|
VALUE hash;
|
||||||
|
VALUE colname;
|
||||||
|
|
||||||
|
if (with_table == Qnil || with_table == Qfalse) {
|
||||||
|
colname = rb_iv_get(obj, "colname");
|
||||||
|
if (colname == Qnil) {
|
||||||
|
colname = rb_ary_new2(n);
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
VALUE s = rb_tainted_str_new2(fields[i].name);
|
||||||
|
rb_obj_freeze(s);
|
||||||
|
rb_ary_store(colname, i, s);
|
||||||
|
}
|
||||||
|
rb_obj_freeze(colname);
|
||||||
|
rb_iv_set(obj, "colname", colname);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
colname = rb_iv_get(obj, "tblcolname");
|
||||||
|
if (colname == Qnil) {
|
||||||
|
colname = rb_ary_new2(n);
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
int len = strlen(fields[i].table)+strlen(fields[i].name)+1;
|
||||||
|
VALUE s = rb_tainted_str_new(NULL, len);
|
||||||
|
snprintf(RSTRING_PTR(s), len+1, "%s.%s", fields[i].table, fields[i].name);
|
||||||
|
rb_obj_freeze(s);
|
||||||
|
rb_ary_store(colname, i, s);
|
||||||
|
}
|
||||||
|
rb_obj_freeze(colname);
|
||||||
|
rb_iv_set(obj, "tblcolname", colname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VALUE ary;
|
||||||
|
ary = rb_ary_new();
|
||||||
|
while(row != NULL)
|
||||||
|
{
|
||||||
|
hash = rb_hash_new();
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
rb_hash_aset(hash, rb_ary_entry(colname, i), row[i]? rb_tainted_str_new(row[i], lengths[i]): Qnil);
|
||||||
|
}
|
||||||
|
rb_ary_push(ary, hash);
|
||||||
|
row = mysql_fetch_row(res);
|
||||||
|
}
|
||||||
|
return ary;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* fetch_hash2 (internal) */
|
/* fetch_hash2 (internal) */
|
||||||
static VALUE fetch_hash2(VALUE obj, VALUE with_table)
|
static VALUE fetch_hash2(VALUE obj, VALUE with_table)
|
||||||
{
|
{
|
||||||
@ -1206,6 +1262,21 @@ static VALUE each_hash(int argc, VALUE* argv, VALUE obj)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* all_hashes(with_table=false) -- returns an array of hashes, one hash per row */
|
||||||
|
static VALUE all_hashes(int argc, VALUE* argv, VALUE obj)
|
||||||
|
{
|
||||||
|
VALUE with_table;
|
||||||
|
VALUE field_names;
|
||||||
|
VALUE res;
|
||||||
|
unsigned int n,i;
|
||||||
|
check_free(obj);
|
||||||
|
rb_scan_args(argc, argv, "01", &with_table);
|
||||||
|
if (with_table == Qnil)
|
||||||
|
with_table = Qfalse;
|
||||||
|
return fetch_hashes_array(obj, with_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------
|
/*-------------------------------
|
||||||
* Mysql::Field object method
|
* Mysql::Field object method
|
||||||
*/
|
*/
|
||||||
@ -2155,6 +2226,7 @@ void Init_mysql(void)
|
|||||||
rb_define_method(cMysqlRes, "row_tell", row_tell, 0);
|
rb_define_method(cMysqlRes, "row_tell", row_tell, 0);
|
||||||
rb_define_method(cMysqlRes, "each", each, 0);
|
rb_define_method(cMysqlRes, "each", each, 0);
|
||||||
rb_define_method(cMysqlRes, "each_hash", each_hash, -1);
|
rb_define_method(cMysqlRes, "each_hash", each_hash, -1);
|
||||||
|
rb_define_method(cMysqlRes, "all_hashes", all_hashes, -1);
|
||||||
|
|
||||||
/* MysqlField object method */
|
/* MysqlField object method */
|
||||||
rb_define_method(cMysqlField, "name", field_name, 0);
|
rb_define_method(cMysqlField, "name", field_name, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user