import sqlite3 import pandas as pd import json import numpy as np def generate_sqlite_dump(): # Connect to in-memory SQLite database conn = sqlite3.connect(':memory:') cursor = conn.cursor() # 1. Create SQLite Schema for metadata schema = """ CREATE TABLE IF NOT EXISTS authors ( author_id INTEGER PRIMARY KEY, name_ar TEXT, death_hijri INTEGER, death_hijri_text TEXT, alpha_sort TEXT, biography TEXT ); CREATE TABLE IF NOT EXISTS categories ( category_id INTEGER PRIMARY KEY, category_name_ar TEXT, name_en TEXT, sort_order INTEGER ); CREATE TABLE IF NOT EXISTS books ( book_id INTEGER PRIMARY KEY, shamela_id INTEGER, title_ar TEXT, book_type INTEGER, book_type_label TEXT, category_id INTEGER REFERENCES categories(category_id), main_author_id INTEGER REFERENCES authors(author_id), main_author_name_ar TEXT, main_author_death_hijri INTEGER, main_author_death_hijri_text TEXT, authors_text TEXT, hijri_era TEXT, printed BOOLEAN, is_hidden BOOLEAN, parent_id INTEGER, group_id INTEGER, version_major INTEGER, version_minor INTEGER, betaka_text TEXT, meta TEXT, volume_count_observed INTEGER, has_multi_part BOOLEAN, authors_json TEXT ); CREATE TABLE IF NOT EXISTS book_authors ( book_id INTEGER REFERENCES books(book_id), author_id INTEGER REFERENCES authors(author_id), role TEXT, name_ar TEXT, death_hijri INTEGER, PRIMARY KEY (book_id, author_id) ); CREATE TABLE IF NOT EXISTS pages ( page_id INTEGER PRIMARY KEY, book_id INTEGER REFERENCES books(book_id), shamela_page_id INTEGER, part TEXT, page_num INTEGER, sequence_num INTEGER, body TEXT, footnotes TEXT, hints TEXT, services_raw TEXT ); CREATE INDEX IF NOT EXISTS pages_body_idx ON pages (body); CREATE TABLE IF NOT EXISTS toc ( title_id INTEGER PRIMARY KEY, book_id INTEGER REFERENCES books(book_id), page_id INTEGER REFERENCES pages(page_id), parent_id INTEGER REFERENCES toc(title_id), shamela_title_id INTEGER, title_text TEXT ); CREATE TABLE IF NOT EXISTS quran_verses ( verse_id INTEGER PRIMARY KEY, surah_id INTEGER, ayah_id INTEGER, text_ar TEXT, data TEXT ); CREATE TABLE IF NOT EXISTS narrators ( narrator_id INTEGER PRIMARY KEY, name_ar TEXT, data TEXT ); CREATE TABLE IF NOT EXISTS root_dictionary ( root_id INTEGER PRIMARY KEY, token TEXT, data TEXT ); CREATE TABLE IF NOT EXISTS hadith_xrefs ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_id INTEGER REFERENCES books(book_id), page_id INTEGER REFERENCES pages(page_id), data TEXT ); CREATE TABLE IF NOT EXISTS tafsir_xrefs ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_id INTEGER REFERENCES books(book_id), page_id INTEGER REFERENCES pages(page_id), data TEXT ); CREATE TABLE IF NOT EXISTS page_isnads ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_id INTEGER REFERENCES books(book_id), page_id INTEGER REFERENCES pages(page_id), narrator_id INTEGER REFERENCES narrators(narrator_id), data TEXT ); """ cursor.executescript(schema) # 2. Download and insert metadata print("Downloading Categories...") df_cat = pd.read_parquet("https://huggingface.co/datasets/AuthenticIlm/Shamela4_Full_DB/resolve/main/_meta/categories.parquet") if 'id' in df_cat.columns: df_cat.rename(columns={'id': 'category_id'}, inplace=True) if 'name_ar' in df_cat.columns and 'category_name_ar' not in df_cat.columns: df_cat.rename(columns={'name_ar': 'category_name_ar'}, inplace=True) if 'category_name' in df_cat.columns and 'category_name_ar' not in df_cat.columns: df_cat.rename(columns={'category_name': 'category_name_ar'}, inplace=True) cols_cat = ['category_id', 'category_name_ar', 'name_en', 'sort_order'] df_cat = df_cat[[c for c in cols_cat if c in df_cat.columns]] df_cat.to_sql("categories", conn, if_exists="append", index=False) print("Downloading Authors...") df_auth = pd.read_parquet("https://huggingface.co/datasets/AuthenticIlm/Shamela4_Full_DB/resolve/main/_meta/authors.parquet") if 'id' in df_auth.columns: df_auth.rename(columns={'id': 'author_id'}, inplace=True) cols_auth = ['author_id', 'name_ar', 'death_hijri', 'death_hijri_text', 'alpha_sort', 'biography'] df_auth = df_auth[[c for c in cols_auth if c in df_auth.columns]] df_auth.to_sql("authors", conn, if_exists="append", index=False) print("Downloading Books Metadata...") df_books = pd.read_parquet("https://huggingface.co/datasets/AuthenticIlm/Shamela4_Full_DB/resolve/main/_meta/book_metadata.parquet") cols_books = ['book_id', 'shamela_id', 'title_ar', 'book_type', 'book_type_label', 'category_id', 'main_author_id', 'main_author_name_ar', 'main_author_death_hijri', 'main_author_death_hijri_text', 'authors_text', 'hijri_era', 'printed', 'is_hidden', 'parent_id', 'group_id', 'version_major', 'version_minor', 'betaka_text', 'meta', 'volume_count_observed', 'has_multi_part', 'authors_json'] df_books = df_books[[c for c in cols_books if c in df_books.columns]] if 'meta' in df_books.columns: df_books['meta'] = df_books['meta'].apply(lambda x: json.dumps(x.tolist()) if isinstance(x, np.ndarray) else (json.dumps(x) if isinstance(x, dict) else (x if pd.isna(x) else json.dumps(x)))) if 'authors_json' in df_books.columns: df_books['authors_json'] = df_books['authors_json'].apply(lambda x: json.dumps(x.tolist()) if isinstance(x, np.ndarray) else (json.dumps(x) if isinstance(x, dict) else (x if pd.isna(x) else json.dumps(x)))) df_books.to_sql("books", conn, if_exists="append", index=False) # 3. Dump to .sql file output_filename = 'metadata_dump.sql' print(f"Dumping to {output_filename}...") with open(output_filename, 'w', encoding='utf-8') as f: for line in conn.iterdump(): # Include only schemas and INSERTs for metadata tables. # conn.iterdump() does a full backup of the schema and inserts for tables in memory. f.write('%s\n' % line) print(f"Done! The SQL dump is ready at: {output_filename}") conn.close() if __name__ == "__main__": generate_sqlite_dump()