0

スクリプトのユーザーが構成ファイルで複数のSQLオプションを有効にしたままにしているかどうかを判断するための最適なロジックを見つけようとしています。理由は、サポートされているのは1つだけです。

私が最初に考えたのは、0、1、2、3のいずれかに設定された単純な変数を使用し、スクリプトによって読み取られて正しいサブルーチンを実行することでした。次に、そのセクションが構成ファイルに存在するかどうかによってそれを実行する方法であるかどうかを考えるようになりました。これは、使用しているモジュールで可能でした。しかし、私が今遭遇した問題は、特定の構成セクションの存在に基づいて使用するSQLソフトウェアを決定する場合、「this」セクションと「that」セクションが存在するかどうかを示すロジックが必要であることを意味するわけではありません。その後、エラーが発生しますか?しかし、それは私が関係するすべてのセクションのすべての組み合わせを考慮に入れることを意味します。右?

これにアプローチする最良の方法は、私が最初に行った方法でしたか?またはもっと良い方法はありますか?

構成ファイルのサンプルと、ロジックが含まれる未完成のサブルーチンを含めました。セクションを構成ファイルにコメントアウトすることで、セクションの存在を制御します。ちなみに私はPerlで書いていて、INIファイルの読み取りと書き込みにConfig::IniFilesを使用しています。

任意のアイデアをいただければ幸いです。

sub sql_option {
        if (config_file()->SectionExists('SQLite')) {
            sqlite_setup();
        } elsif (config_file()->SectionExists('MySQL')) {
            mysql_setup();
        } elsif (config_file()->SectionExists('PgSQL')) {
            pgsql_setup();
        } elsif (config_file()->SectionExists('MSSQL')) {
            mssql_setup();
        } else {
            print color 'red';
            print "No SQL server option defined!\n";
            print color 'reset';
            print "\n";
            die "Script halted!\n";
        } 
}

そしてINIファイル:

[ESX]

host=esxi01.solignis.local
;port=
user=root
password=

[SQLite]

db=discovery.db


[MySQL]
host=sql01.solignis.local
;port=
user=root
password=

;[PgSQL]
;host=
;port=
;user=
;password=

;[MSSQL]
;host=
;port=
;user=
;password=
4

1 に答える 1

2

これを行う1つの方法は次のとおりです。

my %sql_setup_functions = (
  SQLite => \&sqlite_setup,
  MySQL  => \&mysql_setup,
  PgSQL  => \&pgsql_setup,
  MSSQL  => \&mssql_setup,
);

sub sql_option
{
  my @engines = grep {
    config_file()->SectionExists($_)
  } keys %sql_setup_functions;

  unless (@engines == 1) {
    print color 'red';
    if (@engines) {
      print "Multiple SQL server options defined!\n";
      print "  $_\n" for sort @engines;
    } else {
      print "No SQL server option defined!\n";
    }
    print color 'reset';
    print "\n";
    die "Script halted!\n";
  } # end unless exactly 1 SQL engine

  # Call the setup function for the selected engine:
  $sql_setup_functions{$engines[0]}->();
} # end sql_option
于 2010-12-20T05:55:58.720 に答える