Digital Library Management System - Source Code\n\n
"""Digital Library Management System (DLMS)
Console-based admin and user interfaces using SQLite backend.
Saved and generated by ChatGPT for practical submission.
"""
import sqlite3
from datetime import datetime, timedelta
DB_PATH = r"/mnt/data/[Link]"
class DigitalLibrary:
def __init__(self, db_path=DB_PATH):
[Link] = [Link](db_path, check_same_thread=False)
[Link].row_factory = [Link]
[Link] = [Link]()
self._init_db()
def _init_db(self):
[Link]("""
CREATE TABLE IF NOT EXISTS admins (
admin_id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE,
password TEXT
);
CREATE TABLE IF NOT EXISTS books (
book_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
isbn TEXT UNIQUE,
copies INTEGER NOT NULL DEFAULT 1,
added_on TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS members (
member_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
phone TEXT,
joined_on TEXT NOT NULL,
password TEXT
);
CREATE TABLE IF NOT EXISTS loans (
loan_id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id INTEGER NOT NULL,
member_id INTEGER NOT NULL,
issue_date TEXT NOT NULL,
due_date TEXT NOT NULL,
return_date TEXT,
FOREIGN KEY(book_id) REFERENCES books(book_id),
FOREIGN KEY(member_id) REFERENCES members(member_id)
);
""")
# ensure a default admin exists
[Link]("SELECT COUNT(*) as c FROM admins")
if [Link]()['c'] == 0:
[Link]("INSERT INTO admins (username, password) VALUES (?,?)", ("admin", "admin123"))
[Link]()
# Admin methods
def admin_authenticate(self, username, password):
[Link]("SELECT * FROM admins WHERE username=? AND password=?", (username, password))
return [Link]() is not None
def add_book(self, title, author=None, isbn=None, copies=1):
now = [Link]().isoformat(timespec='seconds')
try:
[Link]("INSERT INTO books (title, author, isbn, copies, added_on) VALUES (?,?,?,?,?)", (
title, author, isbn, copies, now))
[Link]()
return [Link]
except Exception as e:
return str(e)
def add_member(self, name, email=None, phone=None, password="password"):
now = [Link]().isoformat(timespec='seconds')
try:
[Link]("INSERT INTO members (name, email, phone, joined_on, password) VALUES (?,?,?,?,?)
", (name, email, phone, now, password))
[Link]()
return [Link]
except Exception as e:
return str(e)
def list_books(self):
[Link]("SELECT * FROM books ORDER BY title")
return [dict(r) for r in [Link]()]
def list_members(self):
[Link]("SELECT member_id, name, email, phone, joined_on FROM members ORDER BY name")
return [dict(r) for r in [Link]()]
# User methods
def user_register(self, name, email, phone=None, password="password"):
return self.add_member(name, email, phone, password)
def user_authenticate(self, email, password):
[Link]("SELECT * FROM members WHERE email=? AND password=?", (email, password))
row = [Link]()
return dict(row) if row else None
def search_books(self, q):
qlike = f"%{q}%"
[Link]("SELECT * FROM books WHERE title LIKE ? OR author LIKE ? OR isbn LIKE ?", (qlike, qli
ke, qlike))
return [dict(r) for r in [Link]()]
def available_copies(self, book_id):
[Link]("SELECT copies FROM books WHERE book_id=?", (book_id,))
row = [Link]()
if not row:
return 0
total = row['copies']
[Link]("SELECT COUNT(*) as c FROM loans WHERE book_id=? AND return_date IS NULL", (book_id,)
)
active = [Link]()['c']
return total - active
def issue_book(self, book_id, member_id, days=14):
avail = self.available_copies(book_id)
if avail <= 0:
return {"ok": False, "msg": "No copies available"}
issue_date = [Link]()
due_date = issue_date + timedelta(days=days)
[Link]("INSERT INTO loans (book_id, member_id, issue_date, due_date) VALUES (?,?,?,?)", (boo
k_id, member_id, issue_date.isoformat(timespec='seconds'), due_date.isoformat(timespec='seconds')))
[Link]()
return {"ok": True, "loan_id": [Link], "due_date": due_date.isoformat(timespec='seconds')}
def return_book(self, loan_id):
return_date = [Link]().isoformat(timespec='seconds')
[Link]("UPDATE loans SET return_date=? WHERE loan_id=? AND return_date IS NULL", (return_dat
e, loan_id))
if [Link] == 0:
return {"ok": False, "msg": "Loan not found or already returned"}
[Link]()
return {"ok": True, "return_date": return_date}
def member_loans(self, member_id, active_only=True):
if active_only:
[Link]("SELECT loans.*, [Link] FROM loans JOIN books ON loans.book_id=books.book_id
WHERE member_id=? AND return_date IS NULL", (member_id,))
else:
[Link]("SELECT loans.*, [Link] FROM loans JOIN books ON loans.book_id=books.book_id
WHERE member_id=?", (member_id,))
return [dict(r) for r in [Link]()]
def list_loans(self, active_only=True):
if active_only:
[Link]("SELECT loans.*, [Link], [Link] as member FROM loans JOIN books ON loa
ns.book_id=books.book_id JOIN members ON loans.member_id=members.member_id WHERE return_date IS NULL")
else:
[Link]("SELECT loans.*, [Link], [Link] as member FROM loans JOIN books ON loa
ns.book_id=books.book_id JOIN members ON loans.member_id=members.member_id")
return [dict(r) for r in [Link]()]
def close(self):
[Link]()
# A small "demo run" function to show interactions and produce sample output for submission
def demo_run():
out = []
lib = DigitalLibrary()
[Link]("--- DLMS Demo Run Started ---")
[Link]("\\n[Admin login attempt with default admin/admin123]")
ok = lib.admin_authenticate('admin','admin123')
[Link](f"Admin authenticated: {ok}")
[Link]("\\n[Admin adds books]")
b1 = lib.add_book('Introduction to Algorithms', 'Cormen et al', '9780262033848', copies=2)
b2 = lib.add_book('Clean Code', 'Robert C. Martin', '9780132350884', copies=1)
b3 = lib.add_book('Learning Python', 'Mark Lutz', '9781449355739', copies=3)
[Link](f"Added book ids: {b1}, {b2}, {b3}")
[Link]("\\n[Admin registers members]")
m1 = lib.add_member('Aisha Khan', 'aisha@[Link]', '9876543210', password='aisha123')
m2 = lib.add_member('Rahul Sharma', 'rahul@[Link]', '9123456780', password='rahul123')
[Link](f"Added member ids: {m1}, {m2}")
[Link]("\\n[User search: 'Python']")
s = lib.search_books('Python')
[Link](f"Search results: {[ (x['book_id'], x['title']) for x in s ]}")
[Link]("\\n[User Rahul logs in and issues 'Clean Code']")
user = lib.user_authenticate('rahul@[Link]','rahul123')
[Link](f"Rahul auth success: {bool(user)}")
if user:
issue = lib.issue_book(b2, user['member_id'], days=7)
[Link](f"Issue result: {issue}")
[Link]("\\n[User Aisha issues 'Introduction to Algorithms']")
user2 = lib.user_authenticate('aisha@[Link]','aisha123')
[Link](f"Aisha auth success: {bool(user2)}")
if user2:
issue2 = lib.issue_book(b1, user2['member_id'], days=21)
[Link](f"Issue result: {issue2}")
[Link]("\\n[Attempt to issue more copies than available]")
# issue second copy of Intro to Algorithms to Rahul
issue3 = lib.issue_book(b1, user['member_id'], days=14)
[Link](f"Second issue of same book: {issue3}")
# try third (should fail if copies exhausted)
issue4 = lib.issue_book(b1, user2['member_id'], days=14)
[Link](f"Third issue attempt (expected fail if no copies): {issue4}")
[Link]("\\n[Active loans]")
loans = lib.list_loans(active_only=True)
[Link](f"Active loans count: {len(loans)}")
for ln in loans:
[Link](f"Loan {ln['loan_id']}: {ln['title']} -> {ln['member']} (due: {ln['due_date']})")
[Link]("\\n[Return a book (Rahul returns Clean Code)]")
# find loan id
loan_to_return = None
for ln in loans:
if ln['title'] == 'Clean Code' and ln['member'].lower().startswith('rahul'):
loan_to_return = ln['loan_id']
if loan_to_return:
ret = lib.return_book(loan_to_return)
[Link](f"Return result: {ret}")
else:
[Link]("Clean Code loan not found to return in demo")
[Link]("\\n[Member loans for Rahul]")
rl = lib.member_loans(user['member_id'], active_only=False)
[Link](f"Rahul loans: {[(r['loan_id'], r['title'], r['return_date']) for r in rl]}")
[Link]("\\n--- DLMS Demo Run Finished ---")
[Link]()
return "\\n".join(out)
if __name__ == '__main__':
print(demo_run())
\n\n--- DEMO OUTPUT ---\n\n--- DLMS Demo Run Started ---\n\n[Admin login attempt with default admin/admin123]\
nAdmin authenticated: True\n\n[Admin adds books]\nAdded book ids: 1, 2, 3\n\n[Admin registers members]\nAdded
member ids: 1, 2\n\n[User search: 'Python']\nSearch results: [(3, 'Learning Python')]\n\n[User Rahul logs in a
nd issues 'Clean Code']\nRahul auth success: True\nIssue result: {'ok': True, 'loan_id': 1, 'due_date': '2025-
11-07T10:06:25'}\n\n[User Aisha issues 'Introduction to Algorithms']\nAisha auth success: True\nIssue result:
{'ok': True, 'loan_id': 2, 'due_date': '2025-11-21T10:06:25'}\n\n[Attempt to issue more copies than available]
\nSecond issue of same book: {'ok': True, 'loan_id': 3, 'due_date': '2025-11-14T10:06:25'}\nThird issue attemp
t (expected fail if no copies): {'ok': False, 'msg': 'No copies available'}\n\n[Active loans]\nActive loans co
unt: 3\nLoan 1: Clean Code -> Rahul Sharma (due: 2025-11-07T10:06:25)\nLoan 2: Introduction to Algorithms -> A
isha Khan (due: 2025-11-21T10:06:25)\nLoan 3: Introduction to Algorithms -> Rahul Sharma (due: 2025-11-14T10:0
6:25)\n\n[Return a book (Rahul returns Clean Code)]\nReturn result: {'ok': True, 'return_date': '2025-10-31T10
:06:25'}\n\n[Member loans for Rahul]\nRahul loans: [(1, 'Clean Code', '2025-10-31T10:06:25'), (3, 'Introductio
n to Algorithms', None)]\n\n--- DLMS Demo Run Finished ---