3 =head1 NAME $RCSfile: MySQL.pm,v $
\r
5 MySQL Backend for Machines module
\r
13 Andrew DeFaria <Andrew@DeFaria.com>
\r
21 Mon, Jul 16, 2018 10:13:12 AM
\r
31 Interfaces to a MySQL backend for machine information
\r
35 The rexec.pl script allows you to execute an arbitrary command on a set of
\r
36 machines, however what set of machines? Primative exeuction involves just a
\r
37 flat file with machine information listed in it. This module instead provides
\r
38 a MySQL backend for this machine data.
\r
42 The following methods are available:
\r
46 package Machines::MySQL;
\r
54 use parent qw(Machines);
\r
56 our $VERSION = '$Revision: 1.0 $';
\r
57 ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
\r
60 SERVER => 'localhost',
\r
61 USERNAME => 'machines',
\r
62 PASSWORD => 'w0rk$harder',
\r
66 my ($self, $dbserver) = @_;
\r
68 $dbserver ||= $MACHINEOPTS{SERVER};
\r
70 my $dbname = 'machines';
\r
71 my $dbdriver = 'mysql';
\r
73 $self->{db} = DBI->connect (
\r
74 "DBI:$dbdriver:$dbname:$dbserver",
\r
75 $MACHINEOPTS{USERNAME},
\r
76 $MACHINEOPTS{PASSWORD},
\r
79 "Couldn't connect to $dbname database "
\r
80 . "as $MACHINEOPTS{USERNAME}\@$MACHINEOPTS{SERVER}"
\r
83 $self->{dbserver} = $dbserver;
\r
88 sub _checkRequiredFields ($$) {
\r
89 my ($fields, $rec) = @_;
\r
91 for my $fieldname (@$fields) {
\r
95 if ($fieldname eq $_) {
\r
101 return "$fieldname is required"
\r
106 } # _checkRequiredFields
\r
109 sub _dberror ($$) {
\r
110 my ($self, $msg, $statement) = @_;
\r
112 my $dberr = $self->{db}->err;
\r
113 my $dberrmsg = $self->{db}->errstr;
\r
116 $dberrmsg ||= 'Success';
\r
121 my $function = (caller (1)) [3];
\r
123 $message = "$function: $msg\nError #$dberr: $dberrmsg\n"
\r
124 . "SQL Statement: $statement";
\r
127 return $dberr, $message;
\r
130 sub _formatValues (@) {
\r
131 my ($self, @values) = @_;
\r
135 # Quote data values
\r
136 push @returnValues, $_ eq '' ? 'null' : $self->{db}->quote ($_)
\r
139 return @returnValues;
\r
142 sub _formatNameValues (%) {
\r
143 my ($self, %rec) = @_;
\r
147 push @nameValueStrs, "$_=" . $self->{db}->quote ($rec{$_})
\r
150 return @nameValueStrs;
\r
151 } # _formatNameValues
\r
153 sub _addRecord ($%) {
\r
154 my ($self, $table, %rec) = @_;
\r
156 my $statement = "insert into $table (";
\r
157 $statement .= join ',', keys %rec;
\r
158 $statement .= ') values (';
\r
159 $statement .= join ',', $self->_formatValues (values %rec);
\r
164 $self->{db}->do ($statement);
\r
166 return $self->_dberror ("Unable to add record to $table", $statement);
\r
169 sub _getRecords ($;$) {
\r
170 my ($self, $table, $condition) = @_;
\r
174 my $statement = "select * from $table";
\r
177 $condition .= ' and ';
\r
180 $condition .= 'active = "true"';
\r
181 $statement .= " where $condition";
\r
183 my $sth = $self->{db}->prepare($statement);
\r
186 ($err, $msg) = $self->_dberror('Unable to prepare statement', $statement);
\r
191 my $status = $sth->execute;
\r
193 ($err, $msg) = $self->_dberror ('Unable to execute statement', $statement);
\r
195 return ($err, $msg) if $err;
\r
199 while (my $row = $sth->fetchrow_hashref) {
\r
200 # Change undef to ''
\r
201 $row->{$_} ||= '' for keys %$row;
\r
203 my $name = delete $row->{name};
\r
205 $records{$name} = $row;
\r
212 my ($class, $db) = @_;
\r
214 my $self = bless {}, $class;
\r
216 $self->_connect ($db);
\r
222 my ($self, $condition) = @_;
\r
224 return $self->_getRecords('system', $condition);
\r
227 sub AddSystem (%) {
\r
228 my ($self, %system) = @_;
\r
230 my @requiredFields = (
\r
235 my $result = _checkRequiredFields \@requiredFields, \%system;
\r
237 return -1, "AddSystem: $result" if $result;
\r
239 return $self->_addRecord ('system', %system);
\r