tdatabase 1.0.0__py3-none-any.whl → 1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
tdatabase/__init__.py CHANGED
@@ -1 +1 @@
1
- from .core import create_db, append_cell, read_cell, read_all
1
+ from .core import TDatabase
tdatabase/core.py CHANGED
@@ -1,44 +1,138 @@
1
1
  import struct
2
+ import os
3
+ import hashlib
2
4
 
3
5
  MAGIC = b'PXDB'
4
6
 
5
- def create_db(filename, rows, cols):
6
- with open(filename, 'wb') as f:
7
- f.write(MAGIC)
8
- f.write(struct.pack('<HH', rows, cols))
9
-
10
- def append_cell(filename, row, col, text):
11
- data = text.encode('utf-8')
12
- with open(filename, 'ab') as f:
13
- f.write(struct.pack('<HHH', row, col, len(data)))
14
- f.write(data)
15
-
16
- def read_cell(filename, row, col):
17
- with open(filename, 'rb') as f:
18
- magic = f.read(4)
19
- if magic != b'PXDB':
20
- raise Exception("File is not exiting")
21
- rows, cols = struct.unpack('<HH', f.read(4))
22
- while True:
23
- chunk = f.read(6)
24
- if not chunk:
25
- break
26
- r, c, length = struct.unpack('<HHH', chunk)
27
- data = f.read(length).decode('utf-8')
28
- if r == row and c == col:
29
- return data
30
- return None
31
- def read_all(filename):
32
- data = {}
33
- with open(filename, 'rb') as f:
34
- if f.read(4) != MAGIC:
35
- raise Exception("❌ Invalid file")
36
- rows, cols = struct.unpack('<HH', f.read(4))
37
- while True:
38
- chunk = f.read(6)
39
- if not chunk:
7
+ class TDatabase:
8
+ def __init__(self):
9
+ self.filename = None
10
+ self.categories = {}
11
+ self.rows = 0
12
+
13
+ def open(self, filename):
14
+ self.filename = filename
15
+ if not os.path.exists(filename):
16
+ self._create_file()
17
+ self._load()
18
+
19
+ def _create_file(self):
20
+ with open(self.filename, 'wb') as f:
21
+ f.write(MAGIC)
22
+ f.write(struct.pack('<I', 0))
23
+
24
+ def _load(self):
25
+ self.categories = {}
26
+ with open(self.filename, 'rb') as f:
27
+ if f.read(4) != MAGIC:
28
+ raise Exception("Invalid file format")
29
+ self.rows, = struct.unpack('<I', f.read(4))
30
+ for _ in range(self.rows):
31
+ row_id, = struct.unpack('<I', f.read(4))
32
+ cat_len, = struct.unpack('<H', f.read(2))
33
+ category = f.read(cat_len).decode('utf-8')
34
+ data_type = f.read(1).decode('utf-8')
35
+ data_len, = struct.unpack('<H', f.read(2))
36
+ data_bytes = f.read(data_len)
37
+ data = self._deserialize_data(data_bytes, data_type)
38
+ if category not in self.categories:
39
+ self.categories[category] = []
40
+ self.categories[category].append((row_id, data))
41
+
42
+ def _serialize_data(self, data):
43
+ if isinstance(data, int):
44
+ return b'i', struct.pack('<i', data)
45
+ elif isinstance(data, float):
46
+ return b'f', struct.pack('<f', data)
47
+ else:
48
+ encoded = str(data).encode('utf-8')
49
+ return b's', encoded
50
+
51
+ def _deserialize_data(self, data_bytes, data_type):
52
+ if data_type == 'i':
53
+ return struct.unpack('<i', data_bytes)[0]
54
+ elif data_type == 'f':
55
+ return struct.unpack('<f', data_bytes)[0]
56
+ else:
57
+ return data_bytes.decode('utf-8')
58
+
59
+ def append_category(self, category_name):
60
+ if category_name not in self.categories:
61
+ self.categories[category_name] = []
62
+
63
+ def append_cell(self, data, category, password=False):
64
+ if category not in self.categories:
65
+ self.append_category(category)
66
+ if password and isinstance(data, str):
67
+ data = hashlib.sha256(data.encode('utf-8')).hexdigest()
68
+ row_id = self.rows + 1
69
+ self.categories[category].append((row_id, data))
70
+ self._save_cell(row_id, category, data)
71
+ self.rows += 1
72
+ self._update_row_count()
73
+
74
+ def _save_cell(self, row_id, category, data):
75
+ cat_bytes = category.encode('utf-8')
76
+ data_type, data_bytes = self._serialize_data(data)
77
+ with open(self.filename, 'ab') as f:
78
+ f.write(struct.pack('<I', row_id))
79
+ f.write(struct.pack('<H', len(cat_bytes)))
80
+ f.write(cat_bytes)
81
+ f.write(data_type)
82
+ f.write(struct.pack('<H', len(data_bytes)))
83
+ f.write(data_bytes)
84
+
85
+ def _update_row_count(self):
86
+ with open(self.filename, 'r+b') as f:
87
+ f.seek(4)
88
+ f.write(struct.pack('<I', self.rows))
89
+
90
+ def search(self, category, keyword):
91
+ if category not in self.categories:
92
+ return []
93
+ results = []
94
+ for row_id, data in self.categories[category]:
95
+ if isinstance(data, str) and keyword.lower() in data.lower():
96
+ results.append((row_id, data))
97
+ elif str(keyword) == str(data):
98
+ results.append((row_id, data))
99
+ return results
100
+
101
+ def delete_row(self, category, row_id):
102
+ if category not in self.categories:
103
+ return False
104
+ original = len(self.categories[category])
105
+ self.categories[category] = [(r, d) for r, d in self.categories[category] if r != row_id]
106
+ if len(self.categories[category]) < original:
107
+ self._rewrite_file()
108
+ return True
109
+ return False
110
+
111
+ def update_cell(self, category, row_id, new_data):
112
+ if category not in self.categories:
113
+ return False
114
+ updated = False
115
+ for i, (r, d) in enumerate(self.categories[category]):
116
+ if r == row_id:
117
+ self.categories[category][i] = (r, new_data)
118
+ updated = True
40
119
  break
41
- r, c, length = struct.unpack('<HHH', chunk)
42
- text = f.read(length).decode('utf-8')
43
- data[(r, c)] = text
44
- return data, rows, cols
120
+ if updated:
121
+ self._rewrite_file()
122
+ return updated
123
+
124
+ def _rewrite_file(self):
125
+ with open(self.filename, 'wb') as f:
126
+ f.write(MAGIC)
127
+ f.write(struct.pack('<I', 0))
128
+ self.rows = 0
129
+ for category in self.categories:
130
+ for row_id, data in self.categories[category]:
131
+ self._save_cell(row_id, category, data)
132
+ self.rows += 1
133
+ self._update_row_count()
134
+
135
+ def select_all(self, category=None):
136
+ if category:
137
+ return self.categories.get(category, [])
138
+ return self.categories
@@ -0,0 +1,46 @@
1
+ Metadata-Version: 2.1
2
+ Name: tdatabase
3
+ Version: 1.2
4
+ Summary: Data Base Made In iran
5
+ Author: Tahagaga
6
+ License: MIT
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.6
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+
14
+ # TDatabase - اولین دیتابیس ایرانی مستقل 🇮🇷💥
15
+
16
+ **TDatabase** یک دیتابیس ایرانی مستقل است که به شما امکان می‌دهد داده‌ها را **ذخیره، ویرایش، لود و مدیریت** کنید، بدون نیاز به SQL یا دیتابیس‌های خارجی.
17
+ همراه با **GUI حرفه‌ای** و **کتابخانه پایتون** برای کار راحت توسعه‌دهندگان.
18
+
19
+ ## ویژگی‌ها ✨
20
+ - کاملاً مستقل و بومی ✅
21
+ - فایل‌های دیتابیس با پسوند `.pxdb` 📦
22
+ - مدیریت داده‌ها با **GUI زیبا و ساده** 🖥️
23
+ - کتابخانه پایتون برای عملیات CRUD سریع 🐍
24
+ - ایجاد، باز کردن، ذخیره و لود دیتابیس جدید بدون دردسر 💾
25
+ - سبک و سریع ⚡
26
+
27
+ ## تغییرات 🛠
28
+ - اضافه شدن category به دیتا بیس :
29
+ میتوانید یک کتگوری برای username و password بسازید و هر کدام رو به دسته بندی
30
+ مورد نظر ارسال کنید .
31
+ - اضافه شدن open به دیتا بیس
32
+ میتوانید بدون نیاز به هر بار وارد کردن اسم database یک بار اون رو باز کنید
33
+ و تا پایان پروژه از آن استفاده کنید
34
+ - آماده شدن gui برای انتشار
35
+ میتونید یک برنامه exe رو نصب و راه اندازی کنید و فایل ها با پسوند .pxdb رو باز کنید
36
+ میتونید کتگوری ها و موارد آن را مشاهده کنید
37
+ - اضافه شدن گیت هاب
38
+ میتوانید با ادرس زیر وارد سایت گیت هاب ما شوید
39
+ https://github.com/tahagaga/tdatabase
40
+ - اضافه شدن hash به دیتا بیس
41
+ میتوانید گذینه hash رو برای متن های مورد نظر انتخاب کنید و در صورتی که اون متن رو
42
+ خودتون داشته باشید میتونید اون رو باز کنید که جلو گیری میکنه از دزدی password ها
43
+
44
+ ## نصب 🛠️
45
+ ```bash
46
+ pip install tdatabase
@@ -0,0 +1,7 @@
1
+ tdatabase/__init__.py,sha256=86TwpHt1QgomY0zfCNUv5n2vwEM20SOZMn-_vNyqNu4,29
2
+ tdatabase/core.py,sha256=2lhqapTiBUY296ncYSB9Li6J9E2IhNrkb5VjsLiUkT8,5034
3
+ tdatabase-1.2.dist-info/LICENSE,sha256=nvLs3RkjYOu_Pl1RlXLybmEnIMEssQG8h8uSUR7D8iM,1085
4
+ tdatabase-1.2.dist-info/METADATA,sha256=h9ia1Li7gIfZJNNT6fhK0c0x53sMD9a_zAjKYuz9epw,2546
5
+ tdatabase-1.2.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
6
+ tdatabase-1.2.dist-info/top_level.txt,sha256=CXAUQMDT0KdI-SLSkEaxn5JZkRjAbs44qJuT8OB3c8A,10
7
+ tdatabase-1.2.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: tdatabase
3
- Version: 1.0.0
4
- Summary: Data Base Made In iran
5
- Author: Tahagaga
6
- License: MIT
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: License :: OSI Approved :: MIT License
9
- Classifier: Operating System :: OS Independent
10
- Requires-Python: >=3.6
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE
13
-
14
- # TDatabase - اولین دیتابیس ایرانی مستقل 🇮🇷💥
15
-
16
- **TDatabase** یک دیتابیس ایرانی مستقل است که به شما امکان می‌دهد داده‌ها را **ذخیره، ویرایش، لود و مدیریت** کنید، بدون نیاز به SQL یا دیتابیس‌های خارجی.
17
- همراه با **GUI حرفه‌ای** و **کتابخانه پایتون** برای کار راحت توسعه‌دهندگان.
18
-
19
- ## ویژگی‌ها ✨
20
- - کاملاً مستقل و بومی ✅
21
- - فایل‌های دیتابیس با پسوند `.px` 📦
22
- - مدیریت داده‌ها با **GUI زیبا و ساده** 🖥️
23
- - کتابخانه پایتون برای عملیات CRUD سریع 🐍
24
- - ایجاد، باز کردن، ذخیره و لود دیتابیس جدید بدون دردسر 💾
25
- - سبک و سریع ⚡
26
-
27
- ## نصب 🛠️
28
- ```bash
29
- pip install tdatabase
@@ -1,7 +0,0 @@
1
- tdatabase/__init__.py,sha256=hRmgmPGM9_aqh2FNGk2ZzUSa1ddcYLDti8EFnlGMsio,63
2
- tdatabase/core.py,sha256=vwiJ3YxY_pDP3YWGLWBhli87iU2Kvp6bMdOUvMsKrHg,1411
3
- tdatabase-1.0.0.dist-info/LICENSE,sha256=nvLs3RkjYOu_Pl1RlXLybmEnIMEssQG8h8uSUR7D8iM,1085
4
- tdatabase-1.0.0.dist-info/METADATA,sha256=IU_WM279r-SQKfGy-zxXCzpwlLoETsaiES2-9fp6VXg,1302
5
- tdatabase-1.0.0.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
6
- tdatabase-1.0.0.dist-info/top_level.txt,sha256=CXAUQMDT0KdI-SLSkEaxn5JZkRjAbs44qJuT8OB3c8A,10
7
- tdatabase-1.0.0.dist-info/RECORD,,