Opera8 commited on
Commit
635ad1b
·
verified ·
1 Parent(s): bc58925

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +34 -21
main.py CHANGED
@@ -93,7 +93,7 @@ def gregorian_to_jalali(gy, gm, gd):
93
  return jy, jm, jd
94
 
95
  # ==============================================================================
96
- # 🟢 پارت 4: دیتابیس SQLite (نسخه فوق‌هوشمند با استخراج خط‌به‌خط و بدون باگ ابری)
97
  # ==============================================================================
98
  import os
99
  import sqlite3
@@ -101,8 +101,8 @@ import json
101
  import copy
102
  import threading
103
 
104
- # 🚀 انتقال نهایی به v5 برای داشتن یک دیتابیس ۱۰۰٪ سالم و بدون سابقه خرابی
105
- DB_FILE = "/data/users_v5.db"
106
  OLD_DB_V3 = "/data/users_v3.db"
107
 
108
  last_saved_state = {}
@@ -121,49 +121,62 @@ def init_sqlite_db():
121
  conn.execute('PRAGMA journal_mode=TRUNCATE;')
122
  conn.execute('PRAGMA synchronous=FULL;')
123
 
124
- # ایجاد جدول کاربران (هیچ اثری از جدول پیام‌های قدیمی نیست)
125
  conn.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
126
  conn.commit()
127
 
128
  if is_first_run:
129
- print("🚨 عملیات استخراج از فایل v3 آغاز شد...")
130
- robust_salvage(OLD_DB_V3, conn)
131
 
132
  conn.close()
133
  except Exception as e:
134
  print(f"❌ خطا در راه اندازی دیتابیس: {e}")
135
 
136
- # 🧲 تابع فوق‌هوشمند استخراج خط به خط بور از بخش‌های خراب دیتابیس)
137
- def robust_salvage(old_file, new_conn):
138
  if not os.path.exists(old_file):
139
  print(f"⚠️ فایل قدیمی {old_file} یافت نشد.")
140
  return
141
 
142
- print(f"🔍 در حال استخراج اطلاعات کاربران از {old_file} ...")
143
  extracted_count = 0
 
144
  try:
145
  old_conn = sqlite3.connect(old_file, timeout=20.0)
146
  cursor = old_conn.cursor()
147
 
148
- cursor.execute("SELECT chat_id, user_data FROM users")
 
 
 
 
 
 
 
 
149
 
150
- # استخراج دانه به دانه برای جلوگیری از ارور malformed
151
- while True:
152
  try:
 
153
  row = cursor.fetchone()
154
- if row is None:
155
- break
156
- new_conn.execute("INSERT OR IGNORE INTO users VALUES (?, ?)", row)
157
- extracted_count += 1
158
- except sqlite3.DatabaseError as db_err:
159
- print(f"⚠️ خرابی در بخشی از فایل قدیمی شناسایی شد. عملیات در همین نقطه متوقف شد.")
160
- break # خروج امن از حلقه در صورت برخورد به بخش خراب فایل
 
 
 
161
 
162
  new_conn.commit()
163
  old_conn.close()
164
- print(f"✅ موفقیت! اطلاعات {extracted_count} کاربر سالم استخراج و به دیتابیس v5 منتقل شد.")
165
  except Exception as e:
166
- print(f"⚠️ توقف کامل استخراج: {e} | تعداد نجات‌یافته تا این لحظه: {extracted_count}")
167
 
168
  def load_db():
169
  global last_saved_state, recent_messages_dict
 
93
  return jy, jm, jd
94
 
95
  # ==============================================================================
96
+ # 🟢 پارت 4: دیتابیس SQLite (نسخه نجات جراحی - پریدن از روی سکتورهای خراب)
97
  # ==============================================================================
98
  import os
99
  import sqlite3
 
101
  import copy
102
  import threading
103
 
104
+ # 🚀 انتقال به v6 برای انجام مجدد عملیات نجات (این بار به صورت خط‌بهخط جراحی)
105
+ DB_FILE = "/data/users_v6.db"
106
  OLD_DB_V3 = "/data/users_v3.db"
107
 
108
  last_saved_state = {}
 
121
  conn.execute('PRAGMA journal_mode=TRUNCATE;')
122
  conn.execute('PRAGMA synchronous=FULL;')
123
 
124
+ # ایجاد جدول کاربران
125
  conn.execute('CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, user_data TEXT)')
126
  conn.commit()
127
 
128
  if is_first_run:
129
+ print("🚨 عملیات نجات جراحی (دور زدن خرابی‌ها) از فایل v3 آغاز شد...")
130
+ surgical_salvage(OLD_DB_V3, conn)
131
 
132
  conn.close()
133
  except Exception as e:
134
  print(f"❌ خطا در راه اندازی دیتابیس: {e}")
135
 
136
+ # 🧲 تابع استخراج جراحی (رکورد به رکورد) برای پریدن از روی سکتورهای خراب دیتابیس
137
+ def surgical_salvage(old_file, new_conn):
138
  if not os.path.exists(old_file):
139
  print(f"⚠️ فایل قدیمی {old_file} یافت نشد.")
140
  return
141
 
142
+ print(f"🔍 در حال اسکن عمیق و جراحی رکوردهای {old_file} ...")
143
  extracted_count = 0
144
+ corrupt_count = 0
145
  try:
146
  old_conn = sqlite3.connect(old_file, timeout=20.0)
147
  cursor = old_conn.cursor()
148
 
149
+ # ابتدا بالاترین شماره سطر (ROWID) را پیدا می‌کنیم تا بدانیم چقدر باید بگردیم
150
+ try:
151
+ cursor.execute("SELECT MAX(rowid) FROM users")
152
+ max_id = cursor.fetchone()[0]
153
+ if not max_id: max_id = 150000
154
+ except:
155
+ max_id = 150000 # اگر فایل خیلی خراب بود، تا 150 هزار رکورد را دستی می‌گردیم
156
+
157
+ print(f"تعداد رکوردهای احتمالی جهت اسکن: {max_id}. لطفا چند ثانیه صبر کنید...")
158
 
159
+ # جستجوی دانه به دانه: اگر یکی خراب بود، فقط همون رو رد میکنه و میره بعدی!
160
+ for i in range(1, max_id + 1):
161
  try:
162
+ cursor.execute("SELECT chat_id, user_data FROM users WHERE rowid = ?", (i,))
163
  row = cursor.fetchone()
164
+ if row:
165
+ new_conn.execute("INSERT OR IGNORE INTO users VALUES (?, ?)", row)
166
+ extracted_count += 1
167
+ except sqlite3.DatabaseError:
168
+ # این رکورد روی سکتور خراب هارد افتاده است -> رد میشویم
169
+ corrupt_count += 1
170
+ continue
171
+ except Exception:
172
+ corrupt_count += 1
173
+ continue
174
 
175
  new_conn.commit()
176
  old_conn.close()
177
+ print(f"✅ شاهکار نجات! {extracted_count} کاربر کاملا سالم استخراج شد و از روی {corrupt_count} رکورد خراب با موفقیت پریدیم.")
178
  except Exception as e:
179
+ print(f"⚠️ توقف استخراج: {e} | تعداد نجات‌یافته تا این لحظه: {extracted_count}")
180
 
181
  def load_db():
182
  global last_saved_state, recent_messages_dict