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__) + "/../")
# サーバー起動