#============================================================ # MySQLApplication #============================================================ package MySQLApplication; use MyApplication; @ISA = qw(MyApplication); use strict; use SQLDB; #========================================== # 大域変数 #========================================== my $DefaultSendmail = '/usr/sbin/sendmail'; my $SourceCharCode = Jcode::getcode('月火水木金土日 '); #============================================================ # 静的関数 #============================================================ #============================================================ # 変数等取得関数 #============================================================ sub DBMName { return shift->{DBMName}; } sub SQLServer { return shift->{DBServer}; } sub SQLUser { return shift->{DBUser}; } sub SQLPassword { return shift->{DBPassword}; } sub DBName { return shift->{DBName}; } sub DBTableName { return shift->{DBTableName}; } sub DB { return shift->{DB}; } sub SetDB { my($this,$DB) = @_; return $this->{DB} = $DB; } #============================================================ # コンストラクタ、デストラクタ #============================================================ BEGIN { } sub new { my ($module, $app) = @_; my $this = {}; bless $this; # $this->SUPER::new(@_); return $this; } sub DESTROY { my $this = shift; # $this->SUPER::DESTROY(@_); } #============================================================ # 継承クラスで定義しなおす関数 #============================================================ #============================================================ # 一般関数 #============================================================ sub MergeDBVars { my ($this, $pParams) = @_; my $DB = $this->DB(); return if($pParams->{DontReadDBVars}); return if(!$DB); return if($this->{nDidMergeDBVars} > 0 and $pParams->{DoNotAllowDBVariables}); return if(!$DB->IsExistTable($pParams->{DBName}, $pParams->{DBVariablesTableName})); #$this->H3("merge"); $this->{nDidMergeDBVars}++; $this->DB()->Search($pParams->{DBVariablesTableName}, "order by sn", ""); my $nHit = $this->DB()->nHit(); # while(1) { for(my $i = 0 ; $i < $nHit ; $i++) { my %Hash = $this->DB()->GetNextHit(); next if(!defined $Hash{VarName} or $Hash{VarName} eq ''); if($Hash{VarName} =~ /^\$/) { #$this->print(" eval: $Hash{VarName} = $Hash{Value};\n"); eval("$Hash{VarName} = $Hash{Value};"); if($Hash{VarName} !~ /\[/ and $Hash{VarName} !~ /\{/) { $Hash{VarName} =~ s/^\$//; $pParams->{$Hash{VarName}} = $Hash{Value}; } } else { #$this->print(" set: $Hash{VarName} = $Hash{Value}\n"); $pParams->{$Hash{VarName}} = $Hash{Value};# if($pParams->{$Hash{VarName}} ne ''); } } #バグ?: evalの後で変数が更新されないので、強制的に参照させるための余計なコードを入れる #$SendNotificationForPrivilegedAccess; # $this->UpdateParams($pParams); } sub SaveDBVars { my ($App, $pParams, $pVars) = @_; my $ret = 1; my $db = $App->DuplicateDB(); foreach my $key (@$pVars) { #$App->print("Check $key [$pParams->{$key}]\n"); next if(!defined $pParams->{$key}); next if(!$App->CanDBVariable($key)); my $val = $pParams->{$key}; if($key =~ /^d_(.*)$/) { $key = "\$$1"; } #$App->print("update $key: $val\n"); my $ret0 = $db->UpdateDataByAutoJudge($pParams->{DBVariablesTableName}, "VarName='$key'", VarName => $key, Value => $val); $ret = 0 if(!$ret0); } return $ret; } sub SaveDBVar { my ($this, $DBVarName, $val) = @_; return $this->SaveDBTemplateVar($DBVarName, $val); } sub SaveDBTemplateVar { my ($this, $DBVarName, $val) = @_; my $pParams = $this->pParams(); $pParams->{$DBVarName} = Utils::URLDecode($val); if($this->SaveDBVars($pParams, [$DBVarName])) { $this->PrintRawHTML(" [$val] has been saved to DBVar '$DBVarName'.
\n"); return 1; } else { $this->PrintRawHTML(" Warning: Save [$val] to DBVar '$DBVarName' failed.
\n"); } return 0; } sub GetSearchedDBHash { my ($App, $DBTableName, $condition) = @_; # $App->DB()->Search($DBTableName, $condition, ""); # my %Hash = $App->DB()->GetNextHit(); my $db = $App->DuplicateDB(); $db->Search($DBTableName, $condition, ""); my %Hash = $db->GetNextHit(); return \%Hash; } sub GetSearchedDBValue { my ($App, $DBTableName, $condition, $Field) = @_; # $App->DB()->Search($DBTableName, $condition, "$Field"); # my %Hash = $App->DB()->GetNextHit(); my $db = $App->DuplicateDB(); $db->Search($DBTableName, $condition, "$Field"); my %Hash = $db->GetNextHit(); return $Hash{$Field}; } sub GetUniqueElements { my ($App, $DBTableName, $condition, $Field, $separator, $NotUseDISTINCT) = @_; $NotUseDISTINCT = 0 if(!defined $NotUseDISTINCT); if(!defined $separator) { $condition = ''; ($Field, $separator) = ($condition, $Field); } if($condition ne '') { $condition = "where $condition"; } my $db = $App->DuplicateDB(); if($NotUseDISTINCT) { $db->Search($DBTableName, $condition, "$Field"); } else { $db->Search($DBTableName, $condition, "DISTINCT $Field"); } my $nHit = $db->nHit(); my %List; for(my $i = 0 ; $i < $nHit ; $i++) { my %Hash = $db->GetNextHit(); my @a = ($Hash{$Field}); #$App->print("a[$Field]:$Hash{$Field}\n"); if($separator ne '') { @a = Utils::Split($separator, $Hash{$Field}); } for(my $i = 0 ; $i < @a ; $i++) { $List{$a[$i]}++; } } return sort keys %List; } #========================================== # DB関係 #========================================== sub GetDBConfig { my ($this, $idx, $pDBConfigArray) = @_; my $i = $idx * 7; return ($pDBConfigArray->[$i ], $pDBConfigArray->[$i+1], $pDBConfigArray->[$i+2], $pDBConfigArray->[$i+3], $pDBConfigArray->[$i+4], $pDBConfigArray->[$i+5], $pDBConfigArray->[$i+6]); } sub FindDBConfig { my ($this, $conf) = @_; for(my $i = 0 ; ; $i++) { my ($lDBConfigName, $lDBMName, $lDBServer, $lDBUser, $lDBPassword, $lDBName, $pTableNames) = $this->GetDBConfig($i); return undef if(!$lDBConfigName); return ($lDBConfigName, $lDBMName, $lDBServer, $lDBUser, $lDBPassword, $lDBName, $pTableNames) if($lDBConfigName eq $conf); } return undef; } sub OpenDB { my ($this, $config, $pDBConfigArray) = @_; my $DB; my ($DBConfigName, $DBMName, $DBServer, $DBUser, $DBPassword, $DBName, $pTableNames); #$this->print("config: $config\n"); if($config ne '' and $config !~ /^auto$/i) { for(my $i = 0 ; ; $i += 7) { $DBConfigName = $pDBConfigArray->[$i+0]; $DBMName = $pDBConfigArray->[$i+1]; #$this->print("DB[$i]: $DBConfigName, $DBMName\n"); if(!$DBConfigName or !$DBMName) { undef $DB; return (undef); } next unless($pDBConfigArray->[$i] =~ /^$config$/i); $DBServer = $pDBConfigArray->[$i+2]; $DBUser = $pDBConfigArray->[$i+3]; $DBPassword = $pDBConfigArray->[$i+4]; $DBName = $pDBConfigArray->[$i+5]; $pTableNames = $pDBConfigArray->[$i+6]; $DB = new SQLDB($DBMName); $DB->SetApplication($this); $DB->SetDBCharCode($this->SQLCharCode()); $DB->SetSourceCharCode($this->WebCharCode()); $DB->SetDebug($this->Debug()); #$this->print("Open($DBServer, $DBUser, $DBPassword, $DBName, undef, 0, 0)\n"); $DB->Open($DBServer, $DBUser, $DBPassword, $DBName, undef, 0, 0); if(!defined $DB or !$DB->dbh()) { $this->H3("Error: Can not open for $config with [$DBServer:$DBUser:$DBName].\n"); return (undef); } last; } } if(!defined $DB or !$DB->dbh()) { for(my $i = 0 ; ; $i += 7) { $DBConfigName = $pDBConfigArray->[$i+0]; $DBMName = $pDBConfigArray->[$i+1]; #$this->print("DB[$i]: $DBConfigName, $DBMName\n"); if(!$DBConfigName or !$DBMName) { undef $DB; return (undef); } $DBServer = $pDBConfigArray->[$i+2]; $DBUser = $pDBConfigArray->[$i+3]; $DBPassword = $pDBConfigArray->[$i+4]; $DBName = $pDBConfigArray->[$i+5]; $pTableNames = $pDBConfigArray->[$i+6]; #$this->print("DB[$i]: $DBConfigName, $DBMName: $DBServer, $DBUser, $DBPassword, $DBName, ", join(':', @$pTableNames), "\n"); $DB = new SQLDB($DBMName); $DB->SetApplication($this); $DB->SetDBCharCode($this->SQLCharCode()); $DB->SetSourceCharCode($this->WebCharCode()); $DB->SetDebug($this->Debug()); $DB->Open($DBServer, $DBUser, $DBPassword, $DBName, undef, 0, 0); last if($DB->dbh()); } } return (undef) if(!$DB or !$DB->dbh()); return ($DB, $DBConfigName, $DBMName, $DBServer, $DBUser, $DBPassword, $DBName, @$pTableNames); } sub DuplicateDB { my ($this) = @_; my $pParams = $this->{pParams}; return new SQLDB($this->{DBMName}, $pParams->{SQLCharCode}, $this->{DBServer}, $this->{DBUser}, $this->{DBPassword}, $this->{DBName}); } sub nHit { my ($App, $db) = @_; $db = $App->DB() if(!defined $db); return 0 if(!$db); return $db->nHit(); } sub GetNextHit { my ($App, $db) = @_; $db = $App->DB() if(!defined $db); return () if(!$db); return $db->GetNextHit(); } sub ConstructSQL1 { my ($App, $pParams, $key0, $target0, $pTargetHash) = @_; Jcode::convert(\$key0, $pParams->{SQLCharCode}) if($pParams->{SQLCharCode} ne ''); my $sql0 = ''; if($key0 ne '') { my $fword0 = "\'%$key0%\'"; if($pTargetHash->{$target0}) { my $pTarget = $pTargetHash->{$target0}; my $s = ''; for(my $i = 0 ; $i < @$pTarget ; $i++) { $s .= ($s eq '')? "$pTarget->[$i] like $fword0" : " or $pTarget->[$i] like $fword0"; } $sql0 = "($s)"; } else { $sql0 .= "($target0 like $fword0)"; } } return $sql0; } sub ConstructSQLAll { my ($App, $pParams, $pHash, $OtherCondition, $pTargetHash, $pOrderArray) = (@_); my $sql = ""; my $sql1 = $App->ConstructSQL1($pParams, $pHash->{SearchKeyword1}, $pHash->{SearchTarget1}, $pTargetHash); if($pHash->{SearchKeyword1} ne '' and $pHash->{SearchKeyword2} ne '') { my $sql2 = $App->ConstructSQL1($pParams, $pHash->{SearchKeyword2}, $pHash->{SearchTarget2}, $pTargetHash); $sql .= "($sql1 $pHash->{SearchOperator1} $sql2)"; } else { $sql .= $sql1; } if($OtherCondition ne '') { if($sql eq '') { $sql = "($OtherCondition)"; } else { $sql .= " and ($OtherCondition)"; } } if($pHash->{SearchOrderTarget} eq '') { if(lc $pHash->{SearchOrderDirection} eq 'ascend') { $sql .= " order by "; #$pHash->{SearchOrderTarget}"; for(my $i = 0 ; $i < @$pOrderArray ; $i++) { $sql .= ($i == 0)? "$pOrderArray->[$i]" : ",$pOrderArray->[$i]"; } } else { $sql .= " order by "; #$pHash->{SearchOrderTarget} desc"; for(my $i = 0 ; $i < @$pOrderArray ; $i++) { $sql .= ($i == 0)? "$pOrderArray->[$i] desc" : ",$pOrderArray->[$i] desc"; } } } else { if(lc $pHash->{SearchOrderDirection} eq 'ascend') { $sql .= " order by $pHash->{SearchOrderTarget}"; } else { $sql .= " order by $pHash->{SearchOrderTarget} desc"; } } $sql =~ s/[\r\n\s]+/ /sg; #$App->H3("
[$sql]
\n"); return $sql; } #========================================== # パラメータハッシュ #========================================== sub CanDBVariable { my ($this, $VarName, $pNoDBVarNames) = @_; #$this->print("aaa[$VarName][$pNoDBVarNames]\n"); for(my $i = 0 ; $i < @$pNoDBVarNames ; $i++) { #$this->print("$i: [$VarName] [@$pNoDBVarNames->[$i]]\n"); return 0 if($VarName =~ /$pNoDBVarNames->[$i]/); } return 1; } sub SearchDBVariables { my ($App, $condition, $vars, $DBVariablesTableName) = @_; my $DB = $App->DuplicateDB(); return 0 if(!$DB); my $pParams = $App->pParams(); return if(!$DB->IsExistTable($pParams->{DBName}, $DBVariablesTableName)); my $pParams = $App->pParams(); my $ret = $DB->Search($DBVariablesTableName, $condition, $vars); return -1 if($ret <= 0); return $DB->rows(); } sub GetDBVar { my ($this, $pParams, $VarName, $DefVar, $DBName, $DBVariablesTableName) = @_; #$this->print("pParams1[$pParams][$DBName]\n"); if($pParams !~ /^HASH/) { # if(ref $pParams !~ /^HASH/) { ($this, $VarName, $DefVar, $DBName, $DBVariablesTableName) = @_; $pParams = $this->pParams(); } return '' if($VarName eq ''); #$this->print("pParams2[$pParams][$DBName]\n"); $DBName = $pParams->{DBName} if($DBName eq ''); #$this->print("pParams3[$pParams][$DBName]\n"); $DBVariablesTableName = $pParams->{DBVariablesTableName} if($DBVariablesTableName eq ''); return if($this->{nDidMergeDBVars} > 0 and $pParams->{DoNotAllowDBVariables}); my $DB = $this->DuplicateDB(); return if(!$DB); return if(!$DB->IsExistTable($DBName, $DBVariablesTableName)); $DB->Search($DBVariablesTableName, "VarName='$VarName' order by sn", ""); my %Hash = $DB->GetNextHit(); #$this->print("Var[$VarName][$Hash{$VarName}]\n"); return $Hash{Value} if(defined $Hash{Value}); return $DefVar; } sub GetDBListVar { my ($App, $varname, $separator) = @_; $separator = "[\\r\\n]+" if(!defined $separator); my $value = $App->GetDBVar($varname); return Utils::Split($separator, $value); } sub SearchUsers { my ($App, $condition, $vars, $DBUsersTableName) = @_; my $pParams = $App->pParams(); my $ret = $App->DB()->Search($DBUsersTableName, $condition, $vars); # my $db = $App->DuplicateDB(); # my $ret = $Adb->Search($pParams->{DBUsersTableName}, $condition, $vars); return -1 if($ret <= 0); return $App->DB()->rows(); } 1;