0%

Eindproject: een uitleenprogramma dat gegevens bewaart · oefening

Leen één voorwerp uit

Een uitleen kan om drie bekende redenen mislukken, en die redenen zijn nuttig voor degene die het programma uitvoert. Het voorwerp kan al actief zijn, het lid kan aan de limiet zitten of de gevraagde ID’s kunnen in strijd zijn met een catalogusregel. checkout_command moet die betekenissen behouden zonder een ander defect te verbergen.

De demo doet deze aanroep:

main([
    "checkout", str(database_path), "501", "1", "17", "2026-08-26"
])

Voeg checkout_command(args) toe. De namespace bevat args.database, args.loan_id, args.item_id, args.member_id en args.checked_out_on. Argparse heeft de drie ID’s al omgezet in positieve gehele getallen. Verwijder de omringende witruimte uit de uitleentekst met trimmed(args.checked_out_on, "CHECKED_OUT_ON"). Datums blijven hier tekst; ze worden niet geparset of aan een kalender getoetst.

Vereis het databasepad voordat validatie iets kan openen. Roep daarna prepare_database aan, open de applicatieverbinding met open_database en doe deze ene functieaanroep:

recorded_id = checkout_item(
    connection, args.loan_id, args.item_id, args.member_id, checked_out_on
)

Sluit de verbinding in finally. checkout_item voert beide applicatiecontroles uit, gebruikt één transactie voor de schrijfopdracht, zet de integriteitsfout van de insert om en laat verbindingen die de aanroeper beheert open. Houd die logica in catalog_db.py.

Vang de gedocumenteerde ValueError-meldingen op bij de CLI-interface. Ze moeten stderr ongewijzigd bereiken na het voorvoegsel Error: :

That item is already checked out.
That member has reached the loan limit.
The checkout conflicts with a catalog rule.

Elke weigering geeft 1 terug, schrijft niets naar stdout en verandert geen uitleenrij. Vang geen OperationalError, ProgrammingError, TypeError of elke Exception op. Een ontbrekende tabel is geen normale uitleenweigering en moet zichtbaar blijven als het defect dat het is.

Druk na een geslaagde commit en sluiting Loan recorded: ID af met het teruggegeven uitleen-ID en geef daarna 0 terug. Voeg de exacte tak if args.command == "checkout": return checkout_command(args) toe aan main.

Druk op Run. De tijdelijke catalogus heeft al drie voorwerpen en lid 17:

== checkout ==
Status: 0
stdout: Loan recorded: 501
stderr: <empty>
Active item IDs after reopening: [1]

Een grondige controle probeert ook een actief voorwerp, een lid precies aan de limiet, verwijzingen naar ontbrekende records, een dubbel uitleen-ID, een lege tekstwaarde en een ontbrekende database. Die opent na elk geval opnieuw, zodat uitvoer en blijvend opgeslagen toestand moeten overeenkomen.

Opdracht

Voeg checkout_command(args) toe of maak die af en zet deze tak in main:

if args.command == "checkout":
    return checkout_command(args)

Weiger een ontbrekende database, verwijder de omringende witruimte uit CHECKED_OUT_ON, bereid de bestaande catalogus voor en open die. Roep checkout_item één keer aan met de vijf geparsete waarden. Sluit de applicatieverbinding in finally. Druk bij succes Loan recorded: ID af en geef 0 terug; verwerk alleen gedocumenteerde ValueError-resultaten via report_error.