From: Michael N. <mne...@us...> - 2002-09-05 09:57:16
|
Update of /cvsroot/ruby-dbi/subprojects/ruby-db2 In directory usw-pr-cvs1:/tmp/cvs-serv2947/ruby-db2 Added Files: ChangeLog Makefile README setup.rb Log Message: initial import from local CVS repository --- NEW FILE: ChangeLog --- =begin = ChangeLog for Ruby/DB2 : 0.3 * sqlsh.rb interactive SQL shell * Added CLI-functions: SQLFreeStmt : 0.2 * DBD driver for DB2 is available (show RAA under DBD/DB2) * added more examples * added README * Load path for require now prefixed by db2/ * Changed directory layout and using setup.rb * Added following CLI-functions: SQLDataSources, SQLColAttribute, SQLFetchScroll, SQLTables * Now all datatypes in SQLGetData can be handled. : 0.1 * Only the following CLI-functions are implemented: SQLAllocHandle, SQLFreeHandle, SQLConnect, SQLDisconnect, SQLPrepare, SQLNumResultCols, SQLDescribeCol, SQLExecDirect, SQLExecute, SQLRowCount, SQLFetch, SQLGetData, SQLEndTran, SQLGetDiagRec. * No high-level interface! * Tested with DB2 7.1 on Suse Linux 6.3. = History $Id: ChangeLog,v 1.1 2002/09/05 09:57:13 mneumann Exp $ =end --- NEW FILE: Makefile --- export: clean mkdir -p work (cd work; cvs export -D now ruby/ruby-db2) (cd work/ruby/ruby-db2; rm -rf utils Makefile) clean: rm -rf work pack: mkdir -p work/pack ( cd work/pack; cvs export -r Release-$(TAG_MAJOR)_$(TAG_MINOR) ruby/ruby-db2; \ cd ruby/ruby-db2; rm -rf utils Makefile; \ cd ..; tar -cvzf ruby-db2-$(TAG_MAJOR).$(TAG_MINOR).tar.gz ruby-db2 ) --- NEW FILE: README --- $Id: README,v 1.1 2002/09/05 09:57:13 mneumann Exp $ Ruby/DB2: IBM DB2 Module for Ruby Copyright (C) 2001 by Michael Neumann (ne...@s-...) Released under the same terms as Ruby itself. PREREQUISITES ============= * IBM DB2 installed (with CLI), tested with DB2 V7.1 on Suse Linxu 6.3 and DB2 UDB V6.1 for Windows 95/98/NT. * Ruby, only tested with Ruby 1.6.3, but should work with every version >= 1.6. * C-Compiler INSTALL ======= To compile type the following: ruby setup.rb config ruby setup.rb setup If you get an error message that no libraries and header files were found, then you have to set DB2DIR to the correct path where DB2 was installed, e.g.: export DB2DIR=/usr/IBMdb2/V7.1 or under Cygwin and DB2 installed in C:\SQLLIB: export DB2DIR=C:/SQLLIB To install, make sure you are the superuser (under UNIX type "su -l root") and then type: ruby setup.rb install For more options on installation, type: ruby setup.rb --help The DB2 library files are installed in your site_ruby directory, of the actual ruby-version (e.g. "site_ruby/1.6") under the directory "db2" and the .so file under "$arch/db2", where $arch is your architecure (e.g. i686-linux). DOCUMENTATION ============= Not yet written. You should consult the DB2-CLI manual available from IBM's website and look at the comments before each function in the file "ext/db2/db2cli.c". The rule of thumb is that all parameters in the DB2-CLI manual which are declared as "output" or "input/output" are returned by the function (in an array). All input values which are of type HANDLE (HENV, HDBC, HSTMT...) are represented by Integer parameters in the Ruby version. SAMPLES ======= See directory "samples". --- NEW FILE: setup.rb --- # # setup.rb # # Copyright (c) 2000,2001 Minero Aoki <aa...@dp...> # # This program is free software. # You can distribute/modify this program under the terms of # the GNU General Public License version 2 or later. # require 'tempfile' if i = ARGV.index(/\A--rbconfig=/) then file = $' ARGV.delete_at(i) require file else require 'rbconfig' end class InstallError < StandardError; end class Installer Version = '2.0.4' Copyright = 'Copyright (c) 2000,2001 Minero Aoki' TASKS = { 'config' => 'save your config configurations', 'setup' => 'compiles extention or else', 'install' => 'installs packages', 'clean' => "does `make clean' for each extention", 'dryrun' => 'does test run', 'show' => 'shows current configuration' } TASK_ORDER = %w( config setup install clean dryrun show ) FILETYPES = %w( bin lib ext share ) def initialize( argv ) argv = argv.dup @verbose = true @no_harm = false @config = {} @task = nil @other_args = [] @task = parsearg( argv ) parsearg_TASK @task, argv unless @task == 'config' then load_configs check_packdesig end end attr :config attr :task ### ### arg proc. ### def parsearg( argv ) task_re = /\A(?:#{TASKS.keys.join '|'})\z/ task = nil arg = argv.shift case arg when /\A\w+\z/ unless task_re === arg then raise InstallError, "wrong task: #{arg}" end task = arg when '-h', '--help' print_usage $stdout exit 0 when '-v', '--version' puts "setup.rb version #{Version}" exit 0 when '--copyright' puts Copyright exit 0 else raise InstallError, "unknown global option '#{arg}'" end task end def parsearg_TASK( task, argv ) mid = "parsearg_#{task}" if respond_to? mid, true then __send__ mid, argv else unless argv.empty? then raise InstallError, "#{task}: unknown options: #{argv.join ' '}" end end end def parsearg_config( args ) @config_args = {} re = /\A--(#{CONFIG_ORDER.join '|'})=/ args.each do |i| m = re.match(i) or raise InstallError, "config: unknown option #{i}" @config_args[ m[1] ] = m.post_match.strip end end def parsearg_install( args ) args.each do |i| if i == '--no-harm' then @no_harm = true else raise InstallError, "#{@task}: wrong option #{i}" end end end def parsearg_dryrun( args ) @dryrun_args = args end def print_usage( out ) out.puts out.puts 'Usage:' out.puts ' ruby setup.rb <global option>' out.puts ' ruby setup.rb <task> [<task options>]' out.puts out.puts 'Tasks:' TASK_ORDER.each do |name| out.printf " %-10s %s\n", name, TASKS[name] end fmt = " %-20s %s\n" out.puts out.puts 'Global options:' out.printf fmt, '-h,--help', 'print this message' out.printf fmt, '-v,--version', 'print version' out.printf fmt, '--copyright', 'print copyright' out.puts out.puts 'Options for config:' CONFIG_ORDER.each do |name| dflt, arg, desc, dflt2 = CONFIG_OPTS[name] dflt = dflt2 || dflt out.printf " %-20s %s [%s]\n", "--#{name}=#{arg}", desc, dflt end out.printf " %-20s %s [%s]\n", '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's" out.puts out.puts 'Options for install:' out.printf " %-20s %s [%s]\n", '--no-harm', 'only display what to do if given', 'off' out.puts out.puts 'This archive includes:' out.print ' ', packages().join(' '), "\n" out.puts end ### ### tasks ### def execute case @task when 'config', 'setup', 'install', 'clean' tryto @task when 'show' do_show when 'dryrun' do_dryrun else raise 'must not happen' end end def tryto( task ) $stderr.printf "entering %s phase...\n", task begin __send__ 'do_' + task rescue $stderr.printf "%s failed\n", task raise end $stderr.printf "%s done.\n", task end ConfigFile = 'config.save' def do_config CONFIG_OPTS.each do |k,v| dflt, vname, desc = v @config[k] = dflt end @config_args.each do |k,v| setconf k, v end save_configs end def do_show CONFIG_ORDER.each do |k| v = @config[k] if not v or v.empty? then v = '(not specified)' end printf "%-10s %s\n", k, v end end def do_setup into_dir( 'bin' ) { foreach_package do Dir.foreach( '.' ) do |fname| next unless File.file? fname add_rubypath fname end end } into_dir( 'ext' ) { foreach_package do clean extconf make end } end def do_install into_dir( 'bin' ) { foreach_package do |targ, *dummy| install_bin end } into_dir( 'lib' ) { foreach_package do |targ, topfile| install_rb targ if topfile then create_topfile targ, topfile end end } into_dir( 'ext' ) { foreach_package do |targ, *dummy| install_so targ end } into_dir( 'share' ) { foreach_package do |targ, *dummy| install_dat targ end } end def do_clean into_dir( 'ext' ) { foreach_package do clean end } # rmf ConfigFile end def do_dryrun unless dir? 'tmp' then $stderr.puts 'setup.rb: setting up temporaly environment...' @verbose = $DEBUG begin @config['bin-dir'] = isdir(File.expand_path('.'), 'tmp', 'bin') @config['rb-dir'] = isdir(File.expand_path('.'), 'tmp', 'lib') @config['so-dir'] = isdir(File.expand_path('.'), 'tmp', 'ext') @config['data-dir'] = isdir(File.expand_path('.'), 'tmp', 'share') do_install rescue rmrf 'tmp' $stderr.puts '[BUG] setup.rb bug: "dryrun" command failed' raise end end exec @config['ruby-path'], '-I' + File.join('.', 'tmp', 'lib'), '-I' + File.join('.', 'tmp', 'ext'), *@dryrun_args end ### ### lib ### # # config # c = ::Config::CONFIG rubyname = c['ruby_install_name'] major = c['MAJOR'].to_i minor = c['MINOR'].to_i teeny = c['TEENY'].to_i version = "#{major}.#{minor}" arch = c['arch'] bindir = File.join( c['bindir'] ) rubylib = File.join( c['libdir'], 'ruby' ) datadir = File.join( c['datadir'] ) rubypath = File.join( bindir, rubyname ) # >=1.4.4 is new path newpath_p = ((major >= 2) or ((major == 1) and ((minor >= 5) or ((minor == 4) and (teeny >= 4))))) if newpath_p then sitelibdir = File.join( rubylib, 'site_ruby', version ) else sitelibdir = File.join( rubylib, version, 'site_ruby' ) end stdlibdir = File.join( rubylib, version ) siterb = sitelibdir siteso = File.join( sitelibdir, arch ) CONFIG_OPTS = { 'bin-dir' => [ bindir, 'path', 'directory to install commands' ], 'rb-dir' => [ siterb, 'path', 'directory to install ruby scripts' ], 'so-dir' => [ siteso, 'path', 'directory to install ruby extentions' ], 'data-dir' => [ datadir, 'path', 'directory to install data' ], 'ruby-path' => [ rubypath, 'path', 'path to ruby for #!' ], 'ruby-prog' => [ rubypath, 'path', 'path to ruby for installation' ], 'make-prog' => [ 'make', 'name', 'make program to compile ruby extentions' ], 'with' => [ '', 'name,name...', 'package name(s) you want to install', 'ALL' ], 'without' => [ '', 'name,name...', 'package name(s) you do not want to install' ] } CONFIG_ORDER = %w( bin-dir rb-dir so-dir ruby-path make-prog with without ) def save_configs File.open( ConfigFile, 'w' ) do |f| @config.each do |k,v| f.printf "%s=%s\n", k, v if v end end end def load_configs File.file? ConfigFile or raise InstallError, 'setup.rb config first' File.foreach( ConfigFile ) do |line| k, v = line.split( '=', 2 ) setconf k.strip, v.strip end end def setconf( k, v ) if CONFIG_OPTS[k][1] == 'path' then @config[k] = File.expand_path(v) else @config[k] = v end end # # packages # def check_packdesig @with = extract_dirs( @config['with'] ) @without = extract_dirs( @config['without'] ) packs = packages (@with + @without).each do |i| if not packs.include? i and not dir? i then raise InstallError, "no such package or directory '#{i}'" end end end def extract_dirs( s ) ret = [] s.split(',').each do |i| if /[\*\?]/ === i then tmp = Dir.glob(i) tmp.delete_if {|d| not dir? d } if tmp.empty? then tmp.push i # causes error else ret.concat tmp end else ret.push i end end ret end def packages ret = [] FILETYPES.each do |type| next unless File.exist? type foreach_record( "#{type}/PATHCONV" ) do |dir, pack, *dummy| ret.push pack end end ret.uniq end def foreach_package path = {} foreach_record( './PATHCONV' ) do |dir, pack, targ, topfile, *dummy| path[dir] = [pack, targ, topfile] end base = File.basename( Dir.getwd ) Dir.foreach('.') do |dir| next if dir[0] == ?. next unless dir? dir path[dir] or raise "abs path for package '#{dir}' not exist" pack, targ, topfile = path[dir] if inclpack pack, "#{base}/#{dir}" then chdir( dir ) { yield targ, topfile } else $stderr.puts "setup.rb: skip #{base}/#{dir}(#{pack}) by user option" end end end def foreach_record( fname ) File.foreach( fname ) do |line| line.strip! next if line.empty? a = line.split(/\s+/) a[2] ||= '.' yield a end end def inclpack( pack, dname ) if @with.empty? then not @without.include? pack and not @without.include? dname else @with.include? pack or @with.include? dname end end # # setup # def add_rubypath( fn, opt = nil ) line = "\#!#{@config['ruby-path']}#{opt ? ' ' + opt : ''}" $stderr.puts %Q<setting #! line to "#{line}"> if @verbose return if @no_harm tmpf = nil File.open( fn ) do |f| first = f.gets return unless /\A\#!.*ruby/ === first tmpf = Tempfile.open( 'amsetup' ) tmpf.puts line tmpf << first f.each {|i| tmpf << i } tmpf.close end mod = File.stat( fn ).mode tmpf.open File.open( fn, 'w' ) do |wf| tmpf.each {|i| wf << i } end File.chmod mod, fn tmpf.close true end # # install # def install_bin install_all isdir(@config['bin-dir']), 0555 end def install_rb( dir ) install_all isdir(@config['rb-dir'] + '/' + dir), 0644 end def install_dat( dir ) install_all isdir(@config['data-dir'] + '/' + dir), 0644 end def install_all( dir, mode ) Dir.foreach('.') do |fname| next if /\A\./ === fname next unless File.file? fname install fname, dir, mode end end def create_topfile( name, req ) d = isdir(@config['rb-dir']) File.open( "#{d}/#{name}.rb", 'w' ) do |f| f.puts "require '#{name}/#{req}'" end File.chmod 0644, "#{d}/#{name}.rb" end def extconf command "#{@config['ruby-prog']} extconf.rb" end def make command @config['make-prog'] end def clean command @config['make-prog'] + ' clean' if File.file? 'Makefile' end def install_so( dir ) to = isdir(File.expand_path @config['so-dir'] + '/' + dir) find_so('.').each do |fn| install fn, to, 0555 end end DLEXT = ::Config::CONFIG['DLEXT'] def find_so( dir = '.' ) fnames = nil Dir.open( dir ) {|d| fnames = d.to_a } exp = /\.#{DLEXT}\z/ arr = fnames.find_all {|fn| exp === fn } arr or raise InstallError, 'no ruby extention exists: have you done "ruby setup.rb setup" ?' end def so_dir?( dn = '.' ) File.file? "#{dn}/MANIFEST" end # # file op. # def into_dir( libn ) return unless dir? libn chdir( libn ) { yield } end def chdir( dn ) curr = Dir.pwd begin Dir.chdir dn yield ensure Dir.chdir curr end end def isdir( dn ) mkpath dn dn end def mkpath( dname ) $stderr.puts "mkdir -p #{dname}" if @verbose return if @no_harm # does not check '/'... it's too abnormal case dirs = dname.split(%r_(?=/)_) if /\A[a-z]:\z/i === dirs[0] then disk = dirs.shift dirs[0] = disk + dirs[0] end dirs.each_index do |idx| path = dirs[0..idx].join('') Dir.mkdir path unless dir? path end end def rmf( fname ) $stderr.puts "rm -f #{fname}" if @verbose return if @no_harm if File.exist? fname or File.symlink? fname then File.chmod 777, fname File.unlink fname end end def rmrf( dn ) $stderr.puts "rm -rf #{dn}" if @verbose return if @no_harm Dir.chdir dn Dir.foreach('.') do |fn| next if fn == '.' next if fn == '..' if dir? fn then verbose_off { rmrf fn } else verbose_off { rmf fn } end end Dir.chdir '..' Dir.rmdir dn end def verbose_off save, @verbose = @verbose, false yield @verbose = save end def install( from, to, mode ) $stderr.puts "install #{from} #{to}" if @verbose return if @no_harm if dir? to then to = to + '/' + File.basename(from) end str = nil File.open( from, 'rb' ) {|f| str = f.read } if diff? str, to then verbose_off { rmf to if File.exist? to } File.open( to, 'wb' ) {|f| f.write str } File.chmod mode, to end end def diff?( orig, comp ) return true unless File.exist? comp s2 = nil File.open( comp, 'rb' ) {|f| s2 = f.read } orig != s2 end def command( str ) $stderr.puts str if @verbose system str or raise RuntimeError, "'system #{str}' failed" end def dir?( dname ) # for CORRUPTED windows stat() File.directory? (dname[-1,1] == '/' ? dname : dname + '/') end end if $0 == __FILE__ then begin MainInstaller = Installer.new( ARGV ) MainInstaller.execute rescue raise if $DEBUG $stderr.puts $! $stderr.puts 'try "ruby setup.rb --help" for usage' exit 1 end end |