2003-07-03

λ [FreeBSD] portsで勝手に新バージョンを利用する

Makefileを編集して PORTVERSION の行を目的のバージョン番号にした後、 make makesumを実行すると distinfo を書き換えてくれる。 できればdistinfoの中を見てMD5が正しいかどうかを目視する。

λ Pound

新しい奴はSubversion にも対応するようになってるけど、FreeBSD portsで作るのは失敗。 OpenSSLがpthread対応じゃないとダメーと途中で止まってしまう。 FreeBSDのOpenSSLはpthread対応のような気はするのだが…

とりあえずportsの標準状態に戻して Pound 1.2 を利用してみた。 Failoverでサーバが生きているかどうかは、connect(2) でTCPソケットが開けるかどうかだけチェックしている。 使ってみたら意外とCPUを食う。キャッシュ付きapacheプロキシよりCPU時間を消費する。

λ [Windows] mdbにSQL投入する RubyScript

Cygwin環境から cscript jetsql.rb --mdb-file tako.mdb hoge.sql のようにして使うスクリプト。 いちいちAccess2000を起動せずにmdbファイルにSQL構文でデータをつっこんだり、テーブルの作成をしたりできる。 ファイルからSQLの投入は、クエリアナライザ同様 GO で区切って行われる。

<package>
<job id="jetsql">
<?job debug="false" error="false"?>
<script language="RubyScript">
require "win32ole"
require 'getoptlong.rb'

def usage
  STDERR.puts "$Id: 03.rd2d 603 2003-09-09 08:38:42Z svn $"
  STDERR.puts "help strings"
  raise "exit_for_usage"
end

WScript.Arguments.each { |arg|
  if arg =~ /^\-/ then
    ARGV.push arg.sub(/[\r\n]+$/, "")
  else
    filename = `cygpath -m #{arg.sub(/[\r\n]+$/, "")}`
    ARGV.push filename.sub(/[\r\n]+\z/, "")
  end
}

parser = GetoptLong.new
parser.set_options(
  ['--mdb-file',           '-m', GetoptLong::REQUIRED_ARGUMENT],
  ['--quiet', '--silence', '-q', GetoptLong::NO_ARGUMENT],
  ['--help',                     GetoptLong::NO_ARGUMENT],
  ['--version',                  GetoptLong::NO_ARGUMENT]
)

$OPT_MDB_FILE = ''
begin
  parser.each_option do |name, arg|
    eval "$OPT_#{name.sub(/^--/, '').gsub(/-/, '_').upcase} = '#{arg}'"
  end
rescue
  raise "getoptlong"
end

usage() if $OPT_HELP != nil
usage() if $OPT_VERSION != nil

connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=#{$OPT_MDB_FILE}"

puts connectionString

raise "no_mdb_file" if $OPT_MDB_FILE.length == 0

conn = WIN32OLE.new "ADODB.Connection"
conn.ConnectionTimeout = 15
conn.CommandTimeout = 30
conn.CursorLocation = 3
conn.Open connectionString, "Admin", ""

module ADO_CONST
end
WIN32OLE.const_load conn, ADO_CONST

sql = ''
recordsAffected = 0
ARGF.each { |line|
  next if line =~ /\A\#/
  if line =~ /\AGO\s*\z/i then
    puts sql
    conn.execute sql, recordsAffected, ADO_CONST::AdExecuteNoRecords
    sql = ''
    next
  end
  sql += line
}

conn.Close
</script>
</job>
</package>

コードの前半はWindowsScriptingHostにおける引数の解釈をgetoptlong経由にするためのもの。 SQL投入するための後半部分はまあまあリーズナルブルなコードではないかと。 WIN32OLE.const_load conn, ADO_CONSTによる定数読み込みはとても便利。

異常終了するにはexit関数を呼ぶより、raiseで例外を起こしてしまう方がいいらしい。

本日のツッコミ(全1件) [ツッコミを入れる]
λ うねうね (2003-07-07 14:00)

ports 書き換えて最新版にするのはいいけど files の下にある patch-* よく見てからやらないと泣き見るよ。

[]