0

我试图找出最好的逻辑来确定我的脚本用户是否在配置文件中启用了多个 SQL 选项,原因是只支持一个。

我的第一个想法是使用一个设置为 0、1、2、3 的简单变量,然后由脚本读取以运行正确的子例程。然后我开始考虑它们是否是一种通过配置文件中是否存在该部分来完成它的方法,我正在使用的模块是可能的。但是我现在遇到的问题是,如果我让它根据某个配置部分的存在来确定要使用哪个 SQL 软件,这并不意味着我必须有逻辑来说明“这个”部分和“那个”部分是否存在然后出错了?但这意味着我将考虑所有相关部分的所有组合。正确的?

解决这个问题的最好方法是我做的第一种方法吗?或者,还有更好的方法?

我已经包含了我的配置文件的示例和将包含逻辑的未完成子例程。我将通过在配置文件中将它们注释掉来控制这些部分的存在。顺便说一句,我正在使用 Perl 编写,并且正在使用Config::IniFiles来读取和写入 INI 文件。

任何想法将不胜感激。

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

这是一种方法:

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 回答