import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
try:
from mrrc import Record, Field, Leader
except ImportError:
print("Error: mrrc not installed")
print("Install with: pip install mrrc")
sys.exit(1)
def create_authority_record():
print("\n" + "=" * 70)
print("1. AUTHORITY RECORD (Personal Name)")
print("=" * 70 + "\n")
leader = Leader(
record_type='z', bibliographic_level='a', character_coding=' ', )
record = Record(leader)
record.add_control_field('001', 'n79021850')
record.add_control_field('008', '840117n| acannaabn |a ana')
heading = Field('100', '1', ' ')
heading.add_subfield('a', 'Twain, Mark,')
heading.add_subfield('d', '1835-1910.')
heading.add_subfield('e', 'author.')
record.add_field(heading)
variant1 = Field('400', '1', ' ')
variant1.add_subfield('a', 'Clemens, Samuel Langhorne,')
variant1.add_subfield('d', '1835-1910.')
record.add_field(variant1)
variant2 = Field('400', '0', ' ')
variant2.add_subfield('a', 'Samuel Clemens')
record.add_field(variant2)
related = Field('500', '1', ' ')
related.add_subfield('a', 'Twain, Mark,')
related.add_subfield('d', '1835-1910.')
related.add_subfield('x', 'Characters.')
record.add_field(related)
subject = Field('650', ' ', '0')
subject.add_subfield('a', 'American literature')
subject.add_subfield('z', '19th century.')
record.add_field(subject)
print(f"Record Type: {record.leader.record_type} (Authority)")
print(f"Control Number: {record.get_control_field('001')}")
print(f"\nAuthorized Heading (100):")
if '100' in record:
field = record['100']
if field.get_subfield('a'):
print(f" Name: {field.get_subfield('a')}")
if field.get_subfield('d'):
print(f" Dates: {field.get_subfield('d')}")
print(f"\nVariant Names (400 - See from tracings):")
for field in record.get_fields('400'):
name = field.get_subfield('a')
if name:
print(f" - {name}")
print(f"\nRelated Headings (500 - See also tracings):")
for field in record.get_fields('500'):
name = field.get_subfield('a')
if name:
print(f" - {name}")
print()
return record
def create_holdings_record():
print("\n" + "=" * 70)
print("2. HOLDINGS RECORD")
print("=" * 70 + "\n")
leader = Leader(
record_type='x', bibliographic_level='y', character_coding=' ', )
record = Record(leader)
record.add_control_field('001', 'h001234567')
record.add_control_field('004', '004123456789')
holdings = Field('852', ' ', ' ')
holdings.add_subfield('b', 'MAIN') holdings.add_subfield('h', 'PS1305') holdings.add_subfield('i', '.T2') holdings.add_subfield('k', '1998') record.add_field(holdings)
statement = Field('866', '1', ' ')
statement.add_subfield('a', 'v.1 (1999) - v.10 (2008)') record.add_field(statement)
item1 = Field('876', ' ', ' ')
item1.add_subfield('a', '00000001') item1.add_subfield('p', 'PS1305.T2 1998') item1.add_subfield('j', 'IN LIBRARY') record.add_field(item1)
item2 = Field('876', ' ', ' ')
item2.add_subfield('a', '00000002') item2.add_subfield('p', 'PS1305.T2 1998') item2.add_subfield('j', 'CHECKED OUT') record.add_field(item2)
print(f"Record Type: {record.leader.record_type} (Holdings)")
print(f"Holdings Control #: {record.get_control_field('001')}")
print(f"Bibliographic #: {record.get_control_field('004')}")
print(f"\nLocation and Call Number (852):")
if '852' in record:
field = record['852']
location = field.get_subfield('b')
call_num = ''.join([
field.get_subfield('h') or '',
field.get_subfield('i') or '',
field.get_subfield('k') or '',
])
if location:
print(f" Location: {location}")
if call_num:
print(f" Call Number: {call_num}")
print(f"\nItems Held (876):")
for field in record.get_fields('876'):
barcode = field.get_subfield('a')
status = field.get_subfield('j')
if barcode:
print(f" - Barcode: {barcode} ({status or 'Unknown status'})")
print()
return record
def authority_control_example():
print("\n" + "=" * 70)
print("3. AUTHORITY CONTROL IN BIBLIOGRAPHIC RECORDS")
print("=" * 70 + "\n")
leader = Leader(
record_type='a',
bibliographic_level='m',
character_coding=' ',
)
record = Record(leader)
record.add_control_field('001', 'ocm123456789')
record.add_control_field('008', '200101s2020 xxu||||||||||||||||eng||')
title = Field('245', '1', '4')
title.add_subfield('a', 'The adventures of Huckleberry Finn /')
title.add_subfield('c', 'Mark Twain.')
record.add_field(title)
author = Field('100', '1', ' ')
author.add_subfield('a', 'Twain, Mark,') author.add_subfield('d', '1835-1910.')
author.add_subfield('0', 'n79021850') record.add_field(author)
subject1 = Field('650', ' ', '0')
subject1.add_subfield('a', 'American fiction')
subject1.add_subfield('y', '19th century.')
subject1.add_subfield('0', 'sh85004340') record.add_field(subject1)
subject2 = Field('650', ' ', '0')
subject2.add_subfield('a', 'Satire')
subject2.add_subfield('0', 'sh85117911') record.add_field(subject2)
geogr = Field('651', ' ', '0')
geogr.add_subfield('a', 'Mississippi River')
geogr.add_subfield('x', 'History.')
geogr.add_subfield('0', 'sh85088040') record.add_field(geogr)
print("Bibliographic Record with Authority Control")
print(f"Title: {record.title}")
print(f"Author: {record.author}")
print(f"\nAuthority-Controlled Headings:")
print(f" Author authority #: {record['100'].get_subfield('0') if '100' in record else 'N/A'}")
print(f"\nSubject Headings (with LCSH authority numbers):")
for field in record.get_fields('650'):
subject = field.get_subfield('a')
auth_num = field.get_subfield('0')
if subject:
print(f" - {subject}")
if auth_num:
print(f" (Authority: {auth_num})")
print(f"\nGeographic Headings:")
for field in record.get_fields('651'):
geogr_name = field.get_subfield('a')
if geogr_name:
print(f" - {geogr_name}")
print()
def main():
print("\n" + "=" * 70)
print("MRRC: Authority and Holdings Records (Python/pymarc-compatible)")
print("=" * 70)
auth_record = create_authority_record()
holdings_record = create_holdings_record()
authority_control_example()
print("=" * 70)
print("KEY CONCEPTS")
print("=" * 70)
print("""
AUTHORITY RECORDS (Type 'z'):
- Used for maintaining authorized access points
- Contain authorized heading in 1XX field
- Contain variant forms in 4XX fields (see from)
- Contain related headings in 5XX fields (see also)
- Help standardize how names/subjects are used across records
HOLDINGS RECORDS (Types 'x', 'y', 'v', 'u'):
- Contain item-level information (call numbers, locations)
- Point to bibliographic record via 004 field
- Main holdings info in 852 field
- Serial holdings in 866 field
- Individual item data in 876-878 fields
AUTHORITY CONTROL IN BIBLIOGRAPHIC RECORDS:
- $0 subfield contains authority record number
- Ensures consistent use of names, subjects, etc.
- Enables authority-based searching and linking
- Critical for library catalog quality
RECORD TYPE CODES:
- 'a' = Bibliographic (language material)
- 'z' = Authority data
- 'x', 'y', 'v', 'u' = Holdings data
- Others: 'c' (music score), 'e' (cartographic), etc.
COMMON HEADING FIELDS:
- 1XX: Main heading (100 personal, 110 corporate, 111 meeting)
- 2XX: Cross references (not used in authority)
- 4XX: See from tracings (variant forms)
- 5XX: See also tracings (related terms)
- 6XX, 7XX: Subject and name added entries (in bibliographic)
""")
print()
if __name__ == '__main__':
main()