tdatabase 1.2__tar.gz → 2__tar.gz
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-1.2 → tdatabase-2}/LICENSE +1 -1
- tdatabase-2/PKG-INFO +35 -0
- tdatabase-2/README.md +22 -0
- {tdatabase-1.2 → tdatabase-2}/setup.py +2 -2
- tdatabase-2/tdatabase/__init__.py +9 -0
- tdatabase-2/tdatabase/core.py +152 -0
- tdatabase-2/tdatabase.egg-info/PKG-INFO +35 -0
- tdatabase-1.2/PKG-INFO +0 -46
- tdatabase-1.2/README.md +0 -33
- tdatabase-1.2/tdatabase/__init__.py +0 -1
- tdatabase-1.2/tdatabase/core.py +0 -138
- tdatabase-1.2/tdatabase.egg-info/PKG-INFO +0 -46
- {tdatabase-1.2 → tdatabase-2}/setup.cfg +0 -0
- {tdatabase-1.2 → tdatabase-2}/tdatabase.egg-info/SOURCES.txt +0 -0
- {tdatabase-1.2 → tdatabase-2}/tdatabase.egg-info/dependency_links.txt +0 -0
- {tdatabase-1.2 → tdatabase-2}/tdatabase.egg-info/top_level.txt +0 -0
- {tdatabase-1.2 → tdatabase-2}/tests/test_core.py +0 -0
tdatabase-2/PKG-INFO
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: tdatabase
|
|
3
|
+
Version: 2
|
|
4
|
+
Summary: Base Database 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
|
+
**اولین دیتابیس مستقل و بومی ایران**
|
|
17
|
+
|
|
18
|
+
یک کتابخانه سبک، سریع و فایلمحور برای مدیریت دادهها در پایتون، بدون نیاز به نصب سرورهای پیچیده.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## ✨ ویژگیها
|
|
23
|
+
|
|
24
|
+
* 🇮🇷 **بومی و مستقل:** طراحی و توسعه یافته توسط برنامهنویس ایرانی.
|
|
25
|
+
* 📂 **بدون نیاز به سرور:** دادهها در فایلهای متنی با فرمت اختصاصی `.tdb` ذخیره میشوند.
|
|
26
|
+
* 🚀 **نصب آسان:** کافیست پوشه کتابخانه را به پروژه اضافه کنید.
|
|
27
|
+
* 🌍 **چندزبانه:** پشتیبانی از زبان فارسی و انگلیسی در پیامهای سیستم.
|
|
28
|
+
* 🛠️ **مدیریت کامل :** قابلیت ایجاد، خواندن، بروزرسانی و حذف دادهها.
|
|
29
|
+
* 👤 **مدیریت کاربران:** توابع اختصاصی برای جستجو و مدیریت اطلاعات کاربران.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 📦 نصب (Installation)
|
|
34
|
+
|
|
35
|
+
``` pip install tdatabase ```
|
tdatabase-2/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# TDatabase 🇮🇷
|
|
2
|
+
|
|
3
|
+
**اولین دیتابیس مستقل و بومی ایران**
|
|
4
|
+
|
|
5
|
+
یک کتابخانه سبک، سریع و فایلمحور برای مدیریت دادهها در پایتون، بدون نیاز به نصب سرورهای پیچیده.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ✨ ویژگیها
|
|
10
|
+
|
|
11
|
+
* 🇮🇷 **بومی و مستقل:** طراحی و توسعه یافته توسط برنامهنویس ایرانی.
|
|
12
|
+
* 📂 **بدون نیاز به سرور:** دادهها در فایلهای متنی با فرمت اختصاصی `.tdb` ذخیره میشوند.
|
|
13
|
+
* 🚀 **نصب آسان:** کافیست پوشه کتابخانه را به پروژه اضافه کنید.
|
|
14
|
+
* 🌍 **چندزبانه:** پشتیبانی از زبان فارسی و انگلیسی در پیامهای سیستم.
|
|
15
|
+
* 🛠️ **مدیریت کامل :** قابلیت ایجاد، خواندن، بروزرسانی و حذف دادهها.
|
|
16
|
+
* 👤 **مدیریت کاربران:** توابع اختصاصی برای جستجو و مدیریت اطلاعات کاربران.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 📦 نصب (Installation)
|
|
21
|
+
|
|
22
|
+
``` pip install tdatabase ```
|
|
@@ -2,11 +2,11 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name='tdatabase',
|
|
5
|
-
version='
|
|
5
|
+
version='2',
|
|
6
6
|
packages=find_packages(),
|
|
7
7
|
install_requires=[],
|
|
8
8
|
author='Tahagaga',
|
|
9
|
-
description='
|
|
9
|
+
description='Base Database Made In Iran',
|
|
10
10
|
long_description=open('README.md', encoding='utf-8').read(),
|
|
11
11
|
long_description_content_type='text/markdown',
|
|
12
12
|
license='MIT',
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
import getpass
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
username = getpass.getuser()
|
|
6
|
+
address = Path(f"C:/Users/{username}/AppData/Roaming/..Tdatabase/data")
|
|
7
|
+
address.mkdir(parents=True, exist_ok=True)
|
|
8
|
+
|
|
9
|
+
lg = 'en'
|
|
10
|
+
|
|
11
|
+
def set_lang(lang=None):
|
|
12
|
+
global lg
|
|
13
|
+
if lang == 'fa':
|
|
14
|
+
lg = 'fa'
|
|
15
|
+
print('Zaban Farsi Shod.')
|
|
16
|
+
elif lang == 'en':
|
|
17
|
+
lg = 'en'
|
|
18
|
+
print('Language Is English.')
|
|
19
|
+
else:
|
|
20
|
+
if lg == 'en':
|
|
21
|
+
print('Language Is Not Defined \n Languages :\n fa/en')
|
|
22
|
+
if lg == 'fa':
|
|
23
|
+
print('Zaban Mord Nazar Yaft Nashod \n Zaban ha : \n fa/en')
|
|
24
|
+
|
|
25
|
+
class _TDB:
|
|
26
|
+
def __init__(self, file_path, db_name):
|
|
27
|
+
self.path = file_path
|
|
28
|
+
self.name = db_name
|
|
29
|
+
self.lang = lg
|
|
30
|
+
|
|
31
|
+
def _parse(self):
|
|
32
|
+
if not self.path.exists():
|
|
33
|
+
return {}
|
|
34
|
+
with open(self.path, 'r', encoding='utf-8') as f:
|
|
35
|
+
content = f.read()
|
|
36
|
+
|
|
37
|
+
match = re.search(r'DATABASE\s+(\w+)\s*\{([\s\S]*)\}', content)
|
|
38
|
+
if not match:
|
|
39
|
+
return {}
|
|
40
|
+
|
|
41
|
+
body = match.group(2)
|
|
42
|
+
data = {}
|
|
43
|
+
for line in body.split('\n'):
|
|
44
|
+
line = line.strip()
|
|
45
|
+
if not line or line in ['{', '}']:
|
|
46
|
+
continue
|
|
47
|
+
if line.startswith(','):
|
|
48
|
+
line = line[1:]
|
|
49
|
+
|
|
50
|
+
if ':' in line:
|
|
51
|
+
key, values_str = line.split(':', 1)
|
|
52
|
+
key = key.strip()
|
|
53
|
+
values = [v.strip() for v in values_str.split(',') if v.strip()]
|
|
54
|
+
data[key] = values
|
|
55
|
+
return data
|
|
56
|
+
|
|
57
|
+
def _write(self, data):
|
|
58
|
+
lines = [f"DATABASE {self.name} {{"]
|
|
59
|
+
for key, values in data.items():
|
|
60
|
+
val_str = ", ".join(values) + ","
|
|
61
|
+
lines.append(f" {key} : {val_str}")
|
|
62
|
+
lines.append("}")
|
|
63
|
+
|
|
64
|
+
with open(self.path, 'w', encoding='utf-8') as f:
|
|
65
|
+
f.write("\n".join(lines))
|
|
66
|
+
|
|
67
|
+
def add_val(self, key=None, val=None):
|
|
68
|
+
if not key or not val:
|
|
69
|
+
msg = "Error: Key and Value are required!" if self.lang == 'en' else "Khata: Key va Value lazem ast!"
|
|
70
|
+
print(msg)
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
data = self._parse()
|
|
74
|
+
if key not in data:
|
|
75
|
+
data[key] = []
|
|
76
|
+
data[key].append(val)
|
|
77
|
+
self._write(data)
|
|
78
|
+
|
|
79
|
+
msg = f"Value '{val}' added to '{key}'." if self.lang == 'en' else f"Value '{val}' be '{key}' ezafe shod."
|
|
80
|
+
print(msg)
|
|
81
|
+
|
|
82
|
+
def read_cat(self):
|
|
83
|
+
data = self._parse()
|
|
84
|
+
return list(data.keys())
|
|
85
|
+
|
|
86
|
+
def read_content(self, key=None):
|
|
87
|
+
if not key:
|
|
88
|
+
return None
|
|
89
|
+
data = self._parse()
|
|
90
|
+
return data.get(key)
|
|
91
|
+
|
|
92
|
+
def read_user(self, search_key, search_value):
|
|
93
|
+
data = self._parse()
|
|
94
|
+
if search_key not in data:
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
index = data[search_key].index(search_value)
|
|
99
|
+
except ValueError:
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
user_info = {}
|
|
103
|
+
for key, values in data.items():
|
|
104
|
+
if index < len(values):
|
|
105
|
+
user_info[key] = values[index]
|
|
106
|
+
return user_info
|
|
107
|
+
|
|
108
|
+
def del_val(self, key, val):
|
|
109
|
+
data = self._parse()
|
|
110
|
+
if key not in data or val not in data[key]:
|
|
111
|
+
print("Item not found.")
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
index = data[key].index(val)
|
|
115
|
+
for k in data:
|
|
116
|
+
if index < len(data[k]):
|
|
117
|
+
data[k].pop(index)
|
|
118
|
+
|
|
119
|
+
self._write(data)
|
|
120
|
+
print(f"Item '{val}' deleted.")
|
|
121
|
+
|
|
122
|
+
def update_val(self, key, old_val, new_val):
|
|
123
|
+
data = self._parse()
|
|
124
|
+
if key not in data or old_val not in data[key]:
|
|
125
|
+
print("Old value not found.")
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
index = data[key].index(old_val)
|
|
129
|
+
data[key][index] = new_val
|
|
130
|
+
|
|
131
|
+
self._write(data)
|
|
132
|
+
print(f"Updated '{old_val}' to '{new_val}'.")
|
|
133
|
+
|
|
134
|
+
def db_open(filename):
|
|
135
|
+
file_path = address / filename
|
|
136
|
+
db_name = filename.replace(".tdb", "")
|
|
137
|
+
|
|
138
|
+
if file_path.exists():
|
|
139
|
+
if lg == 'en':
|
|
140
|
+
print("Hello , Tdatabase Ready")
|
|
141
|
+
else:
|
|
142
|
+
print('Salam, Tdatabase Amade Ast')
|
|
143
|
+
return _TDB(file_path, db_name)
|
|
144
|
+
else:
|
|
145
|
+
if lg == 'en':
|
|
146
|
+
print("ERROR 404 : Database Not Found")
|
|
147
|
+
else:
|
|
148
|
+
print('Khata 404 : Database Morede Nazar Peida Nashod')
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
def total_db():
|
|
152
|
+
return [file.stem for file in address.glob("*.tdb")]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: tdatabase
|
|
3
|
+
Version: 2
|
|
4
|
+
Summary: Base Database 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
|
+
**اولین دیتابیس مستقل و بومی ایران**
|
|
17
|
+
|
|
18
|
+
یک کتابخانه سبک، سریع و فایلمحور برای مدیریت دادهها در پایتون، بدون نیاز به نصب سرورهای پیچیده.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## ✨ ویژگیها
|
|
23
|
+
|
|
24
|
+
* 🇮🇷 **بومی و مستقل:** طراحی و توسعه یافته توسط برنامهنویس ایرانی.
|
|
25
|
+
* 📂 **بدون نیاز به سرور:** دادهها در فایلهای متنی با فرمت اختصاصی `.tdb` ذخیره میشوند.
|
|
26
|
+
* 🚀 **نصب آسان:** کافیست پوشه کتابخانه را به پروژه اضافه کنید.
|
|
27
|
+
* 🌍 **چندزبانه:** پشتیبانی از زبان فارسی و انگلیسی در پیامهای سیستم.
|
|
28
|
+
* 🛠️ **مدیریت کامل :** قابلیت ایجاد، خواندن، بروزرسانی و حذف دادهها.
|
|
29
|
+
* 👤 **مدیریت کاربران:** توابع اختصاصی برای جستجو و مدیریت اطلاعات کاربران.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 📦 نصب (Installation)
|
|
34
|
+
|
|
35
|
+
``` pip install tdatabase ```
|
tdatabase-1.2/PKG-INFO
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
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
|
tdatabase-1.2/README.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# TDatabase - اولین دیتابیس ایرانی مستقل 🇮🇷💥
|
|
2
|
-
|
|
3
|
-
**TDatabase** یک دیتابیس ایرانی مستقل است که به شما امکان میدهد دادهها را **ذخیره، ویرایش، لود و مدیریت** کنید، بدون نیاز به SQL یا دیتابیسهای خارجی.
|
|
4
|
-
همراه با **GUI حرفهای** و **کتابخانه پایتون** برای کار راحت توسعهدهندگان.
|
|
5
|
-
|
|
6
|
-
## ویژگیها ✨
|
|
7
|
-
- کاملاً مستقل و بومی ✅
|
|
8
|
-
- فایلهای دیتابیس با پسوند `.pxdb` 📦
|
|
9
|
-
- مدیریت دادهها با **GUI زیبا و ساده** 🖥️
|
|
10
|
-
- کتابخانه پایتون برای عملیات CRUD سریع 🐍
|
|
11
|
-
- ایجاد، باز کردن، ذخیره و لود دیتابیس جدید بدون دردسر 💾
|
|
12
|
-
- سبک و سریع ⚡
|
|
13
|
-
|
|
14
|
-
## تغییرات 🛠
|
|
15
|
-
- اضافه شدن category به دیتا بیس :
|
|
16
|
-
میتوانید یک کتگوری برای username و password بسازید و هر کدام رو به دسته بندی
|
|
17
|
-
مورد نظر ارسال کنید .
|
|
18
|
-
- اضافه شدن open به دیتا بیس
|
|
19
|
-
میتوانید بدون نیاز به هر بار وارد کردن اسم database یک بار اون رو باز کنید
|
|
20
|
-
و تا پایان پروژه از آن استفاده کنید
|
|
21
|
-
- آماده شدن gui برای انتشار
|
|
22
|
-
میتونید یک برنامه exe رو نصب و راه اندازی کنید و فایل ها با پسوند .pxdb رو باز کنید
|
|
23
|
-
میتونید کتگوری ها و موارد آن را مشاهده کنید
|
|
24
|
-
- اضافه شدن گیت هاب
|
|
25
|
-
میتوانید با ادرس زیر وارد سایت گیت هاب ما شوید
|
|
26
|
-
https://github.com/tahagaga/tdatabase
|
|
27
|
-
- اضافه شدن hash به دیتا بیس
|
|
28
|
-
میتوانید گذینه hash رو برای متن های مورد نظر انتخاب کنید و در صورتی که اون متن رو
|
|
29
|
-
خودتون داشته باشید میتونید اون رو باز کنید که جلو گیری میکنه از دزدی password ها
|
|
30
|
-
|
|
31
|
-
## نصب 🛠️
|
|
32
|
-
```bash
|
|
33
|
-
pip install tdatabase
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from .core import TDatabase
|
tdatabase-1.2/tdatabase/core.py
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import struct
|
|
2
|
-
import os
|
|
3
|
-
import hashlib
|
|
4
|
-
|
|
5
|
-
MAGIC = b'PXDB'
|
|
6
|
-
|
|
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
|
|
119
|
-
break
|
|
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
|
|
@@ -1,46 +0,0 @@
|
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|