Files
epics-base/modules/database/src/tools/DBD/Record.pm
Andrew Johnson 3c99391d93 Added SPDX License ID to all EPICS-original source files
In some cases the license-identification header was missing,
so I added that as well. Replaced the remaining headers that
specifically identified "Versions 3.13.7 and higher".

Makefiles and the build system were deliberately excluded.
2020-08-03 11:53:01 -05:00

130 lines
3.1 KiB
Perl

######################################################################
# SPDX-License-Identifier: EPICS
# EPICS BASE is distributed subject to a Software License Agreement
# found in file LICENSE that is included with this distribution.
######################################################################
package DBD::Record;
use strict;
use warnings;
use DBD::Base;
our @ISA = qw(DBD::Base);
use Carp;
our ($macrosOk);
my $warned;
sub init {
my ($this, $type, $name) = @_;
confess "DBD::Record::init: Not a DBD::Recordtype"
unless $type->isa('DBD::Recordtype');
$this->SUPER::init($name, "record");
$this->{RECORD_TYPE} = $type;
$this->{ALIASES} = [];
$this->{RECFIELD_LIST} = [];
$this->{FIELD_INDEX} = {};
$this->{INFO_LIST} = [];
$this->{INFO_ITEMS} = {};
$this->{COMMENTS} = [];
$this->{POD} = [];
return $this;
}
# Override, record names are not as strict as recordtype and menu names
sub identifier {
my ($this, $id, $what) = @_;
confess "DBD::Record::identifier: $what undefined!"
unless defined $id;
if ($macrosOk) {
# FIXME - Check name with macro
}
elsif ($id !~ m/^$RXname$/) {
my @message;
push @message, "A $what should contain only letters, digits and these",
"special characters: _ - : . [ ] < > ;" unless $warned++;
warnContext("Deprecated $what '$id'", @message);
}
return $id;
}
sub recordtype {
return shift->{RECORD_TYPE};
}
sub add_alias {
my ($this, $alias) = @_;
push @{$this->{ALIASES}}, $this->identifier($alias, "alias name");
}
sub aliases {
return @{shift->{ALIASES}};
}
sub put_field {
my ($this, $field_name, $value) = @_;
my $recfield = $this->{RECORD_TYPE}->field($field_name);
dieContext("No field named '$field_name'")
unless defined $recfield;
dieContext("Can't set $field_name to '$value'")
unless $recfield->legal_value($value);
push @{$this->{RECFIELD_LIST}}, $recfield
unless exists $this->{FIELD_INDEX}->{$field_name};
$this->{FIELD_INDEX}->{$field_name} = $value;
}
sub recfields {
return @{shift->{RECFIELD_LIST}};
}
sub field_names { # In their original order...
return map {$_->name} @{shift->{RECFIELD_LIST}};
}
sub get_field {
my ($this, $field_name) = @_;
return $this->{FIELD_INDEX}->{$field_name}
if exists $this->{FIELD_INDEX}->{$field_name};
my $recfield = $this->{RECORD_TYPE}->field($field_name);
return $recfield->attribute("initial");
}
sub add_info {
my ($this, $info_name, $value) = @_;
push @{$this->{INFO_LIST}}, $info_name
unless exists $this->{INFO_ITEMS}->{$info_name};
$this->{INFO_ITEMS}->{$info_name} = $value;
}
sub info_names {
return @{shift->{INFO_LIST}};
}
sub info_value {
my ($this, $info_name) = @_;
return $this->{INFO_ITEMS}->{$info_name};
}
sub add_comment {
my ($this, $comment) = @_;
push @{$this->{COMMENTS}}, $comment;
}
sub comments {
return @{shift->{COMMENTS}};
}
sub add_pod {
my $this = shift;
push @{$this->{POD}}, @_;
}
sub pod {
return @{shift->{POD}};
}
1;