bin/sekka-server in sekka-0.9.1 vs bin/sekka-server in sekka-0.9.2

- old
+ new

@@ -25,11 +25,31 @@ DICTDIR + "/SEKKA-JISYO.LARGE.tch", DICTDIR + "/SEKKA-JISYO.SMALL.tch" ] MEMCACHED = "localhost:11211" # memcahced +def getSekkaDbInfo( env ) + if env.has_key?( 'SEKKA_DB' ) + m = env['SEKKA_DB'].match( /^redis:(.*)$/ ) + if m + dictSource = if 0 == m[1].size + dictSource = "localhost" + else + dictSource = m[1] + end + [ :redis, dictSource ] + elsif m = ENV['SEKKA_DB'].match( /^tokyo[a-z]+$/ ) + [ :tokyocabinet, nil ] + else + raise RuntimeError, "Error: env var SEKKA_DB requires [redis:hostname] or [redis:] or [tokyocabinet]" + end + else + [ :tokyocabinet, nil ] + end +end + def main if not File.directory?( DICTDIR ) Dir.mkdir( DICTDIR ) STDERR.printf( "Info: created directory [%s]\n", DICTDIR ) end @@ -46,11 +66,11 @@ uri = URI.parse ENV[ 'http_proxy' ] proxyPort = uri.port proxyHost = uri.host end - if not File.exist?( TC_FILE ) + if not File.exist?( TSVFILE ) STDERR.printf( "Info: Downloading SEKKA-JISYO\n" ) # 辞書をダウンロードする cmd = sprintf( "curl -o %s %s", TSVFILE, TSVURL ) STDERR.printf( "Command : %s\n", cmd ) system( cmd ) @@ -74,29 +94,64 @@ STDERR.printf( "Error: downloaded file [%s] verify NG.\n", TSVFILE ) File.unlink( TSVFILE ) exit( 1 ) end } + end - # tsvファイルをTokyo CabinetのHashDB化する - STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" ) - cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE ) - STDERR.printf( "Command : %s\n", cmd ) - system( cmd ) + # 環境変数から、DBの接続先情報を取得する。 + ( dictType, dictSource ) = getSekkaDbInfo( ENV ) - # 中身を確認する(tchmgrで読めるものができている) - STDERR.printf( "Info: inform *.tch\n" ) - cmd = sprintf( "tchmgr inform %s", TC_FILE ) - STDERR.printf( "Command : %s\n", cmd ) - system( cmd ) + case dictType + when :tokyocabinet + # .tchファイルが存在すうるか調べる + list = TC_FILE_LIST.select { |name| File.exist?( name ) } - end + if 0 == list.size + # tsvファイルをTokyo CabinetのHashDB化する + STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" ) + cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE ) + STDERR.printf( "Command : %s\n", cmd ) + system( cmd ) - # 辞書ディレクトリに存在している辞書ファイルリストを作る - list = TC_FILE_LIST.select { |name| File.exist?( name ) } + # 中身を確認する(tchmgrで読めるものができている) + STDERR.printf( "Info: inform *.tch\n" ) + cmd = sprintf( "tchmgr inform %s", TC_FILE ) + STDERR.printf( "Command : %s\n", cmd ) + system( cmd ) + end + # 存在する.tchファイルの中で一番最初のファイルを使う。 + list = TC_FILE_LIST.select { |name| File.exist?( name ) } + dictSource = list[0] + when :redis + key = "SEKKA::VERSION" + # redisサーバーに辞書が投入済みか確認する + STDERR.printf( "Info: Checking SEKKA jisyo on redis server...\n" ) + require 'redis' + require 'sekka/kvs' + redis = Kvs.new( :redis ) + begin + redis.open( dictSource ) + result = redis.get( key ) + rescue => e + STDERR.printf( "Error: sekka-server can't connect to redis(port=%s)...\n", dictSource ) + exit 1 + end + unless result + # tsvファイルをuploadする。 + STDERR.printf( "Info: Uploading...\n" ) + cmd = sprintf( "sekka-jisyo restore %s %s:%s", TSVFILE, dictType, dictSource ) + STDERR.printf( "Command : %s\n", cmd ) + system( cmd ) + end + STDERR.printf( "Info: [OK]\n" ) + else + raise RuntimeError, sprintf( "Error: unknown dictType [%s]", dictType ) + end + # 設定項目をConfigオブジェクトに代入 - SekkaServer::Config.setup( list[0], MEMCACHED, 12929, proxyHost, proxyPort ) + SekkaServer::Config.setup( dictType, dictSource, MEMCACHED, 12929, proxyHost, proxyPort ) # サーバースクリプトのrootディレクトリへ移動 FileUtils.cd(File.dirname(__FILE__) + "/../") # サーバー起動