Какую логику лучше всего определить, если в конфигурационном файле оставить включенными несколько опций SQL? - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь изобразить наилучшую логику, чтобы определить, оставил ли пользователь моего сценария включенной опцию множественного 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=

1 Ответ

2 голосов
/ 20 декабря 2010

Вот один из способов сделать это:

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
...