3 =head1 NAME $RCSfile: CCDB.pm,v $
5 Object oriented interface to CCDB.
13 Andrew DeFaria <Andrew@ClearSCM.com>
21 Wed Mar 9 17:03:48 PST 2011
25 $Date: 2011/04/15 22:27:45 $
31 Provides the CCDB object which handles all interaction with the CCDB
32 database. Similar add/change/delete/update methods for other record types. In
33 general you must orient your record hashs to have the appropriately named
34 keys that correspond to the database. Also see method documentation for
35 specifics about the method you are envoking.
37 # Create new CCDB object
42 name => 'The Next Thing',
43 pvob => '8800_projects',
44 description => 'This is the greatest thing since sliced bread',
47 my ($err, $msg) = $CCDB->AddProject (%project);
49 # Find projects matching '8800'
50 my @projects = $ccdb->FindProject ('8800');
52 # Get a project by name
53 my %project = $ccdb->GetProject ('8800_projects');
57 'description' => 'Greatest thing since the net!',
60 my ($err, $msg) = $ccdb->UpdateProject ('8800_projects', %update);
62 # Delete project (Warning: will delete all related records regarding this
64 my ($err, $msg) = $ccdb->DeleteProject ('8800_projects');
68 This package provides and object oriented interface to the CCDB database.
69 Methods are provided to manipulate records by adding, updating and deleting
70 them. In general you need to specify a hash which contains keys and values
71 corresponding to the database field names and values.
75 The following methods are available:
89 use lib "$FindBin::Bin/../../lib";
96 our %CCDBOPTS = GetConfig ("$FindBin::Bin/../etc/ccdb.conf");
98 $CCDBOPTS{CCDB_MY_CNF} = "$FindBin::Bin/etc/$CCDBOPTS{CCDB_MY_CNF}";
101 our $VERSION = '$Revision: 1.4 $';
102 ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
104 $CCDBOPTS{CCDB_USERNAME} = $ENV{CCDB_USERNAME}
105 ? $ENV{CCDB_USERNAME}
106 : $CCDBOPTS{CCDB_USERNAME}
107 ? $CCDBOPTS{CCDB_USERNAME}
108 : '<specify username>';
109 $CCDBOPTS{CCDB_PASSWORD} = $ENV{CCDB_PASSWORD}
110 ? $ENV{CCDB_PASSWORD}
111 : $CCDBOPTS{CCDB_PASSWORD}
112 ? $CCDBOPTS{CCDB_PASSWORD}
113 : '<specify password>';
114 $CCDBOPTS{CCDB_SERVER} = $ENV{CCDB_SERVER}
116 : $CCDBOPTS{CCDB_SERVER}
117 ? $CCDBOPTS{CCDB_SERVER}
118 : '<specify server>';
122 my ($self, $msg, $statement) = @_;
124 my $dberr = $self->{db}->err;
125 my $dberrmsg = $self->{db}->errstr;
128 $dberrmsg ||= 'Success';
133 my $function = (caller (1)) [3];
135 $message = "$function: $msg\nError #$dberr: $dberrmsg\n"
136 . "SQL Statement: $statement";
139 return $dberr, $message;
142 sub _formatValues (@) {
143 my ($self, @values) = @_;
151 push @returnValues, $self->{db}->quote ($_);
156 push @returnValues, 'null';
159 return @returnValues;
162 sub _formatNameValues (%) {
163 my ($self, %rec) = @_;
167 push @nameValueStrs, "$_=" . $self->{db}->quote ($rec{$_})
170 return @nameValueStrs;
171 } # _formatNameValues
173 sub _addRecord ($%) {
174 my ($self, $table, %rec) = @_;
176 my $statement = "insert into $table (";
177 $statement .= join ',', keys %rec;
178 $statement .= ') values (';
179 $statement .= join ',', $self->_formatValues (values %rec);
182 $self->{db}->do ($statement);
184 return $self->_dberror ("Unable to add record to $table", $statement);
187 sub _deleteRecord ($;$) {
188 my ($self, $table, $condition) = @_;
192 my $statement = "select count(*) from $table ";
193 $statement .= "where $condition"
196 my $sth = $self->{db}->prepare ($statement)
197 or return $self->_dberror ('Unable to prepare statement', $statement);
200 or return $self->_dberror ('Unable to execute statement', $statement);
202 my @row = $sth->fetchrow_array;
212 return ($count, 'Records deleted')
215 $statement = "delete from $table ";
216 $statement .= "where $condition"
219 $self->{db}->do ($statement);
221 if ($self->{db}->err) {
222 return $self->_dberror ("Unable to delete record from $table", $statement);
224 return $count, 'Records deleted';
228 sub _updateRecord ($$%) {
229 my ($self, $table, $condition, %rec) = @_;
231 my $statement = "update $table set ";
232 $statement .= join ',', $self->_formatNameValues (%rec);
233 $statement .= " where $condition"
236 $self->{db}->do ($statement);
238 return $self->_dberror ("Unable to update record in $table", $statement);
241 sub _checkRequiredFields ($$) {
242 my ($fields, $rec) = @_;
244 foreach my $fieldname (@$fields) {
247 foreach (keys %$rec) {
248 if ($fieldname eq $_) {
254 return "$fieldname is required"
259 } # _checkRequiredFields
261 sub _getRecords ($$) {
262 my ($self, $table, $condition) = @_;
266 my $statement = "select * from $table where $condition";
268 my $sth = $self->{db}->prepare ($statement);
271 ($err, $msg) = $self->_dberror ('Unable to prepare statement', $statement);
276 my $status = $sth->execute;
279 ($err, $msg) = $self->_dberror ('Unable to execute statement', $statement);
286 while (my $row = $sth->fetchrow_hashref) {
296 my $statement = 'select last_insert_id()';
298 my $sth = $self->{db}->prepare ($statement);
303 ($err, $msg) = $self->_dberror ('Unable to prepare statement', $statement);
308 my $status = $sth->execute;
311 ($err, $msg) = $self->_dberror ('Unable to execute statement', $statement);
318 my @row = $sth->fetchrow_array;
324 my ($class, $dbserver) = @_;
326 $dbserver ||= $CCDBOPTS{CCDB_SERVER};
328 my $self = bless {}, $class;
331 my $dbdriver = 'mysql';
333 $self->{db} = DBI->connect (
334 "DBI:$dbdriver:$dbname:$dbserver;"
335 . "mysql_read_default_file=$CCDBOPTS{CCDB_MY_CNF}",
336 $CCDBOPTS{CCDB_USERNAME},
337 $CCDBOPTS{CCDB_PASSWORD},
340 "Couldn't connect to $dbname database "
341 . "as $CCDBOPTS{CCDB_USERNAME}\@$dbserver\nDBERR: $DBI::errstr"
347 sub AddRecord ($$$) {
348 my ($self, $record, $required, $data) = @_;
350 my $Record = ucfirst $record;
351 my @requiredFields = @$required;
353 unless (ref $data eq 'HASH') {
363 # Determine oid if necessary
364 unless ($data{oid}) {
365 if ($record eq 'activity'
366 or $record eq 'baseline'
367 or $record eq 'folder',
368 or $record eq 'project'
369 or $record eq 'stream'
370 or $record eq 'replica'
371 or $record eq 'vob') {
373 if ($record eq 'vob') {
374 $data{oid} = $Clearcase::CC->name2oid (
375 'vob:' . Clearcase::vobtag ($data{name})
377 } elsif ($record eq 'replica') {
378 $data{oid} = $Clearcase::CC->name2oid (
379 "replica:$data{replica}", $data{vob}
382 $data{oid} = $Clearcase::CC->name2oid (
383 "$record:$data{name}", $data{pvob}
389 my $result = _checkRequiredFields \@requiredFields, \%data;
391 return -1, "Add$Record: $result"
394 return $self->_addRecord ($record, %data);
397 sub DeleteRecord ($$$) {
398 my ($self, $table, $keyname, $keyvalue) = @_;
400 # If $keyname is an array then we have multiple keys in the database. When
401 # this is the case we assume that both $keyname and $keyvalue are references
402 # to equal sized name/value pairs and we construct the condition in the form
403 # of "<keyname1>=<keyvalue1> and <keyname2>=<keyvalue2>..."
406 if (ref $keyname eq 'ARRAY') {
407 for (my $i = 0; $i < @$keyname; $i++) {
408 unless ($condition) {
409 $condition = "$$keyname[$i]='$$keyvalue[$i]'"
411 $condition .= " and $$keyname[$i]='$$keyvalue[$i]'"
415 $condition = "$keyname='$keyvalue'";
418 return $self->_deleteRecord ($table, $condition);
421 sub UpdateRecord ($$$$) {
422 my ($self, $table, $keyname, $keyvalue, $update) = @_;
424 # If $keyname is an array then we have multiple keys in the database. When
425 # this is the case we assume that both $keyname and $keyvalue are references
426 # to equal sized name/value pairs and we construct the condition in the form
427 # of "<keyname1>=<keyvalue1> and <keyname2>=<keyvalue2>..."
430 if (ref $keyname eq 'ARRAY') {
431 for (my $i = 0; $i < @$keyname; $i++) {
432 unless ($condition) {
433 $condition = "$$keyname[$i] like '$$keyvalue[$i]'"
435 $condition .= " and $$keyname[$i] like '$$keyvalue[$i]'"
439 $condition = "$keyname like '$keyvalue'";
442 unless (ref $update eq 'HASH') {
450 my %update = %$update;
452 return $self->_updateRecord ($table, $condition, %update);
455 sub GetRecord ($$$) {
456 my ($self, $table, $keyname, $keyvalue) = @_;
458 # If $keyname is an array then we have multiple keys in the database. When
459 # this is the case we assume that both $keyname and $keyvalue are references
460 # to equal sized name/value pairs and we construct the condition in the form
461 # of "<keyname1>=<keyvalue1> and <keyname2>=<keyvalue2>..."
464 if (ref $keyname eq 'ARRAY') {
465 for (my $i = 0; $i < @$keyname; $i++) {
466 $$keyvalue[$i] ||= '';
468 unless ($condition) {
469 $condition = "$$keyname[$i]='$$keyvalue[$i]'"
471 $condition .= " and $$keyname[$i]='$$keyvalue[$i]'"
475 $condition = "$keyname='$keyvalue'";
478 my @records = $self->_getRecords ($table, $condition);
481 return %{$records[0]};
487 sub FindRecord ($$$;$) {
488 my ($self, $table, $keyname, $keyvalue, $additional) = @_;
490 # If $keyname is an array then we have multiple keys in the database. When
491 # this is the case we assume that both $keyname and $keyvalue are references
492 # to equal sized name/value pairs and we construct the condition in the form
493 # of "<keyname1> like <keyvalue1> and <keyname2> like <keyvalue2>..."
496 if (ref $keyname eq 'ARRAY') {
497 for (my $i = 0; $i < @$keyname; $i++) {
498 $$keyvalue[$i] ||= '';
499 $$keyvalue[$i] = '' if $$keyvalue[$i] eq '*';
501 unless ($condition) {
502 $condition = "$$keyname[$i] like '%$$keyvalue[$i]%'"
504 $condition .= " and $$keyname[$i] like '%$$keyvalue[$i]%'"
509 $keyvalue = '' if $keyvalue eq '*';
510 $condition = "$keyname like '%$keyvalue%'";
513 return $self->_getRecords ($table, $condition);
517 my ($self, $data) = @_;
519 return $self->AddRecord (
521 ['name', 'folder', 'pvob'],
526 sub DeleteProject ($$$) {
527 my ($self, $name, $folder, $pvob) = @_;
529 return $self->DeleteRecord (
531 ['name', 'folder', 'pvob'],
532 [$name, $folder, $pvob]
536 sub UpdateProject ($$$$) {
537 my ($self, $name, $folder, $pvob, $update) = @_;
539 return $self->UpdateRecord (
541 ['name', 'folder', 'pvob'],
542 [$name, $folder, $pvob],
548 my ($self, $name, $folder, $pvob) = @_;
550 return $self->GetRecord (
552 ['name', 'folder', 'pvob'],
553 [$name, $folder, $pvob]
557 sub FindProject (;$$$) {
558 my ($self, $name, $folder, $project, $pvob) = @_;
560 return $self->FindRecord (
562 ['name', 'folder', 'pvob'],
563 [$name, $folder, $pvob]
567 sub AddRegistry ($) {
568 my ($self, $data) = @_;
570 return $self->AddRecord (
577 sub DeleteRegistry ($) {
578 my ($self, $name) = @_;
580 return $self->DeleteRecord ('registry', 'name', $name);
583 sub UpdateRegistry ($$) {
584 my ($self, $name, $update) = @_;
586 return $self->UpdateRecord ('registry', 'name', $name, $update);
589 sub GetRegistry ($) {
590 my ($self, $name) = @_;
592 return $self->GetRecord ('registry', 'name', $name);
595 sub FindRegistry (;$) {
596 my ($self, $name) = @_;
598 return $self->FindRecord ('registry', 'name', $name);
602 my ($self, $data) = @_;
604 # TODO: We should probably make sure that things like $$data{pvob} and
605 # $$data{name} exist in $data first. Maybe add the record (which checks for
606 # required fields) then perform an update to update the type to intergration
607 # IFF this is an intergration stream.
609 # Determine the integration stream for this stream's project. First get
610 # project for the stream.
611 my $pvobTag = Clearcase::vobtag ($$data{pvob});
612 my $cmd = "lsstream -fmt \"%[project]p\" $$data{name}\@$pvobTag";
614 my ($status, @output) = $Clearcase::CC->execute ($cmd);
617 my $project = $output[0];
619 # Now get the intergration stream for this project
620 $cmd = "lsproject -fmt \"%[istream]p\" $project\@$pvobTag";
622 ($status, @output) = $Clearcase::CC->execute ($cmd);
625 $$data{type} = 'integration'
626 if $$data{name} eq $output[0];
630 return $self->AddRecord (
637 sub DeleteStream ($$) {
638 my ($self, $name, $pvob) = @_;
640 return $self->DeleteRecord (
647 sub DeleteStreamOID ($) {
648 my ($self, $oid) = @_;
650 return $self->DeleteRecord (
657 sub UpdateStream ($$$) {
658 my ($self, $name, $pvob, $update) = @_;
660 return $self->UpdateRecord (
669 my ($self, $name, $pvob) = @_;
671 return $self->GetRecord (
678 sub FindStream (;$$) {
679 my ($self, $name, $pvob) = @_;
681 return $self->FindRecord (
688 sub AddSubfolder ($) {
689 my ($self, $data) = @_;
691 return $self->AddRecord (
693 ['parent', 'subfolder', 'pvob'],
698 sub DeleteSubfolder ($$$) {
699 my ($self, $parent, $subfolder, $pvob) = @_;
701 return $self->DeleteRecord (
703 ['parent', 'subfolder', 'pvob'],
704 [$parent, $subfolder, $pvob],
708 sub UpdateSubfolder ($$$$) {
709 my ($self, $parent, $subfolder, $pvob, $update) = @_;
711 return $self->UpdateRecord (
713 ['parent', 'subfolder', 'pvob'],
714 [$parent, $subfolder, $pvob],
719 sub GetSubfolder ($$$) {
720 my ($self, $parent, $subfolder, $pvob) = @_;
722 return $self->GetRecord (
724 ['parent', 'subfolder', 'pvob'],
725 [$parent, $subfolder, $pvob],
729 sub FindSubfolder (;$$$) {
730 my ($self, $parent, $subfolder, $pvob) = @_;
732 return $self->FindRecord (
734 ['parent', 'subfolder', 'pvob'],
735 [$parent, $subfolder, $pvob]
739 sub AddActivity ($) {
740 my ($self, $data) = @_;
743 $$data{type} = 'integration'
744 if $$data{name} =~ /^(deliver|rebase|integrate|revert|tlmerge)/i;
747 return $self->AddRecord (
754 sub DeleteActivity ($$) {
755 my ($self, $name, $pvob) = @_;
757 return $self->DeleteRecord (
764 sub DeleteActivityOID ($) {
765 my ($self, $oid) = @_;
767 return $self->DeleteRecord (
772 } # DeleteActivityOID
774 sub UpdateActivity ($$$) {
775 my ($self, $name, $pvob, $update) = @_;
777 return $self->UpdateRecord (
785 sub GetActivity ($$) {
786 my ($self, $name, $pvob) = @_;
788 return $self->GetRecord (
795 sub FindActivity (;$$) {
796 my ($self, $name, $pvob) = @_;
798 return $self->FindRecord (
805 sub AddBaseline ($) {
806 my ($self, $data) = @_;
808 return $self->AddRecord (
815 sub DeleteBaseline ($$) {
816 my ($self, $name, $pvob) = @_;
818 return $self->DeleteRecord (
825 sub DeleteBaselineOID ($) {
826 my ($self, $oid) = @_;
828 return $self->DeleteRecord (
833 } # DeleteBaselineOID
835 sub UpdateBaseline ($$$) {
836 my ($self, $name, $pvob, $update) = @_;
838 return $self->UpdateRecord (
846 sub GetBaseline ($$) {
847 my ($self, $name, $pvob) = @_;
849 return $self->GetRecord (
856 sub FindBaseline (;$$) {
857 my ($self, $name, $pvob) = @_;
859 return $self->FindRecord (
866 sub DeleteElementAll ($) {
867 my ($self, $name) = @_;
869 my ($total, $err, $msg);
871 foreach ($self->FindChangeset (undef, $name)) {
874 ($err, $msg) = $self->DeleteChangeset (
875 $changeset{activity},
882 if $msg ne 'Records deleted';
887 return ($total, $msg);
890 sub AddChangeset ($) {
891 my ($self, $data) = @_;
893 return $self->AddRecord (
895 ['activity', 'element', 'version', 'pvob'],
900 sub DeleteChangeset ($$$$) {
901 my ($self, $activity, $element, $version, $pvob) = @_;
903 return $self->DeleteRecord (
905 ['activity', 'element', 'version', 'pvob'],
906 [$activity, $element, $version, $pvob],
910 sub UpdateChangeset ($$$$$) {
911 my ($self, $activity, $element, $version, $pvob, $update) = @_;
913 return $self->UpdateRecord (
915 ['activity', 'element', 'version', 'pvob'],
916 [$activity, $element, $version, $pvob],
921 sub GetChangeset ($$$$) {
922 my ($self, $activity, $element, $version, $pvob) = @_;
924 return $self->GetRecord (
926 ['activity', 'element', 'version', 'pvob'],
927 [$activity, $element, $version, $pvob],
931 sub FindChangeset (;$$$$) {
932 my ($self, $activity, $element, $version, $pvob) = @_;
934 return $self->FindRecord (
936 ['activity', 'element', 'version', 'pvob'],
937 [$activity, $element, $version, $pvob]
942 my ($self, $data) = @_;
944 return $self->AddRecord (
951 sub DeleteFolder ($$) {
952 my ($self, $folder, $pvob) = @_;
954 return $self->DeleteRecord (
961 sub UpdateFolder ($$$) {
962 my ($self, $name, $pvob, $update) = @_;
964 return $self->UpdateRecord (
973 my ($self, $name, $pvob) = @_;
975 return $self->GetRecord (
982 sub FindFolder (;$$) {
983 my ($self, $name, $pvob) = @_;
985 return $self->FindRecord (
993 my ($self, $data) = @_;
995 return $self->AddRecord (
1003 my ($self, $name) = @_;
1005 return $self->DeleteRecord (
1012 sub UpdateVob ($$) {
1013 my ($self, $name, $update) = @_;
1015 return $self->UpdateRecord ('vob', 'name', $name, $update);
1019 my ($self, $name) = @_;
1021 return $self->GetRecord (
1029 my ($self, $name, $type) = @_;
1033 return $self->FindRecord (
1040 sub AddStreamActivityXref ($) {
1041 my ($self, $data) = @_;
1043 return $self->AddRecord (
1044 'stream_activity_xref',
1045 ['stream', 'activity', 'pvob'],
1048 } # AddStreamActivityXref
1050 sub DeleteStreamActivityXref ($$$) {
1051 my ($self, $stream, $activity, $pvob) = @_;
1053 return $self->DeleteRecord (
1054 'stream_activity_xref',
1055 ['stream', 'activity', 'pvob'],
1056 [$stream, $activity, $pvob],
1058 } # DeleteStreamActivityXref
1060 sub UpdateStreamActivityXref ($$$$) {
1061 my ($self, $stream, $activity, $pvob, $update) = @_;
1063 return $self->UpdateRecord (
1064 'stream_activity_xref',
1065 ['stream', 'activity', 'pvob'],
1066 [$stream, $activity, $pvob],
1069 } # UpdateStreamActivityXref
1071 sub GetStreamActivityXref ($$$) {
1072 my ($self, $stream, $activity, $pvob) = @_;
1074 return $self->GetRecord (
1075 'stream_activity_xref',
1076 ['stream', 'activity', 'pvob'],
1077 [$stream, $activity, $pvob],
1079 } # GetStreamActivityXref
1081 sub FindStreamActivityXref (;$$$) {
1082 my ($self, $stream, $activity, $pvob) = @_;
1084 return $self->FindRecord (
1085 'stream_activity_xref',
1086 ['stream', 'activity', 'pvob'],
1087 [$stream, $activity, $pvob]
1089 } # FindStreamActivityXref
1091 sub AddStreamBaselineXref ($) {
1092 my ($self, $data) = @_;
1094 return $self->AddRecord (
1095 'stream_baseline_xref',
1096 ['stream', 'baseline', 'pvob'],
1099 } # AddStreamBaselineXref
1101 sub DeleteStreamBaselineXref ($$$) {
1102 my ($self, $stream, $baseline, $pvob) = @_;
1104 return $self->DeleteRecord (
1105 'stream_baseline_xref',
1106 ['stream', 'baseline', 'pvob'],
1107 [$stream, $baseline, $pvob],
1109 } # DeleteStreamBaselineXref
1111 sub UpdateStreamBaselineXref ($$$$) {
1112 my ($self, $stream, $baseline, $pvob, $update) = @_;
1114 return $self->UpdateRecord (
1115 'stream_baseline_xref',
1116 ['stream', 'baseline', 'pvob'],
1117 [$stream, $baseline, $pvob],
1120 } # UpdateStreamBaselineXref
1122 sub GetStreamBaselineXref ($$$) {
1123 my ($self, $stream, $baseline, $pvob) = @_;
1125 return $self->GetRecord (
1126 'stream_baseline_xref',
1127 ['stream', 'baseline', 'pvob'],
1128 [$stream, $baseline, $pvob],
1130 } # GetStreamBaselineXref
1132 sub FindStreamBaselineXref (;$$$) {
1133 my ($self, $stream, $baseline, $pvob) = @_;
1135 return $self->FindRecord (
1136 'stream_baseline_xref',
1137 ['stream', 'baseline', 'pvob'],
1138 [$stream, $baseline, $pvob]
1140 } # FindStreamBaselineXref
1142 sub AddBaselineActivityXref ($) {
1143 my ($self, $data) = @_;
1145 return $self->AddRecord (
1146 'baseline_activity_xref',
1147 ['baseline', 'activity', 'pvob'],
1150 } # AddBaselineActivityXref
1152 sub DeleteBaselineActivityXref ($$$) {
1153 my ($self, $baseline, $activity, $pvob) = @_;
1155 return $self->DeleteRecord (
1156 'baseline_activity_xref',
1157 ['baseline', 'activity', 'pvob'],
1158 [$baseline, $activity, $pvob],
1160 } # DeleteBaselineActivityXref
1162 sub UpdateBaselineActivityXref ($$$$) {
1163 my ($self, $baseline, $activity, $pvob, $update) = @_;
1165 return $self->UpdateRecord (
1166 'baseline_activity_xref',
1167 ['baseline', 'activity', 'pvob'],
1168 [$baseline, $activity, $pvob],
1171 } # UpdateBaselineActivityXref
1173 sub GetBaselineActivityXref ($$$$) {
1174 my ($self, $baseline, $activity, $pvob) = @_;
1176 return $self->GetRecord (
1177 'baseline_activity_xref',
1178 ['baseline', 'activity', 'pvob'],
1179 [$baseline, $activity, $pvob],
1181 } # GetBaselineActivityXref
1183 sub FindBaselineActivityXref (;$$$$) {
1184 my ($self, $baseline, $activity, $pvob) = @_;
1186 return $self->FindRecord (
1187 'baseline_activity_xref',
1188 ['baseline', 'activity', 'pvob'],
1189 [$baseline, $activity, $pvob]
1191 } # FindBaselineActivityXref
1193 sub FindActivities ($$$) {
1194 my ($self, $pvob, $stream, $element) = @_;
1196 my $statement = <<"END";
1201 stream_activity_xref as sax
1203 cs.pvob = sax.pvob and
1204 cs.activity = sax.activity and
1205 cs.pvob = '$pvob' and
1206 sax.stream = '$stream' and
1207 cs.element like '$element%'
1212 my $sth = $self->{db}->prepare ($statement);
1217 ($err, $msg) = $self->_dberror ('Unable to prepare statement', $statement);
1222 my $status = $sth->execute;
1225 ($err, $msg) = $self->_dberror ('Unable to execute statement', $statement);
1232 while (my $row = $sth->fetchrow_hashref) {
1233 push @records, $row;
1243 =head1 CONFIGURATION AND ENVIRONMENT
1245 DEBUG: If set then $debug is set to this level.
1247 VERBOSE: If set then $verbose is set to this level.
1249 TRACE: If set then $trace is set to this level.
1263 =head2 ClearSCM Perl Modules
1276 <a href="http://clearscm.com/php/cvs_man.php?file=lib/DateUtils.pm">DateUtils</a><br>
1277 <a href="http://clearscm.com/php/cvs_man.php?file=lib/Display.pm">Display</a><br>
1278 <a href="http://clearscm.com/php/cvs_man.php?file=lib/GetConfig.pm">GetConfig</a><br>
1283 =head1 BUGS AND LIMITATIONS
1285 There are no known bugs in this module
1287 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
1289 =head1 LICENSE AND COPYRIGHT
1291 Copyright (c) 2011, ClearSCM, Inc. All rights reserved.