1.0.6
This commit is contained in:
parent
bb7d7af45e
commit
43f82c2b22
5 changed files with 238 additions and 7 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -8,3 +8,5 @@ venv/**
|
||||||
replit*txt
|
replit*txt
|
||||||
.config/**
|
.config/**
|
||||||
.replit
|
.replit
|
||||||
|
**/dist/**
|
||||||
|
**/.env
|
||||||
|
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Firepup Sixfifty
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -1,6 +1,8 @@
|
||||||
# FPSQL
|
# FPSQL
|
||||||
An easy to use SQLite package
|
An easy to use SQLite package
|
||||||
#### Change log:
|
#### Change log:
|
||||||
|
###### v.1.0.6:
|
||||||
|
Add AsyncSql, start working on dict actions
|
||||||
###### v.1.0.5:
|
###### v.1.0.5:
|
||||||
Double check mypy problems and resolve them
|
Double check mypy problems and resolve them
|
||||||
###### v.1.0.4:
|
###### v.1.0.4:
|
||||||
|
@ -14,4 +16,4 @@ Actual release
|
||||||
###### v.1.0.0:
|
###### v.1.0.0:
|
||||||
Initial Release!
|
Initial Release!
|
||||||
###### v.1.0.26:
|
###### v.1.0.26:
|
||||||
Mistake release :facepalm:
|
Mistake release :facepalm:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "fpsql"
|
name = "fpsql"
|
||||||
version = "1.0.5"
|
version = "1.0.6"
|
||||||
authors = ["Firepup650 <firepyp650@gmail.com>"]
|
authors = ["Firepup650 <firepyp650@gmail.com>"]
|
||||||
description = "An easy to use SQLite package"
|
description = "An easy to use SQLite package"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -27,4 +27,4 @@ python = "^3.8"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
"""Firepup650's SQL Package"""
|
"""Firepup650's SQL Package"""
|
||||||
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
import sqlite3, ast, pydoc
|
import sqlite3, aiosqlite, ast, pydoc
|
||||||
|
from asyncio import run as aRun
|
||||||
|
|
||||||
|
|
||||||
def alias(Function):
|
def alias(Function):
|
||||||
|
@ -15,8 +16,8 @@ def alias(Function):
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
__VERSION__ = "1.0.5"
|
__VERSION__ = "1.0.6"
|
||||||
__NEW__ = "Double check mypy problems and resolve them"
|
__NEW__ = "Add AsyncSql, start working on dict actions"
|
||||||
__LICENSE__ = "MIT"
|
__LICENSE__ = "MIT"
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,6 +112,20 @@ class sql:
|
||||||
return data[0]
|
return data[0]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def __setitem__(self, name: str, value: object) -> int:
|
||||||
|
"""# Function: sql.__getitem__
|
||||||
|
Sets the value of a key
|
||||||
|
# Inputs:
|
||||||
|
name: str - The name of the key to set
|
||||||
|
value: object - The value of the key
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
int - `1` if the key was created, `2` if it was updated
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
return set(name)
|
||||||
|
|
||||||
def set(self, name: str, value: object) -> int:
|
def set(self, name: str, value: object) -> int:
|
||||||
"""# Function: sql.set
|
"""# Function: sql.set
|
||||||
Sets the value of a key
|
Sets the value of a key
|
||||||
|
@ -125,7 +140,7 @@ class sql:
|
||||||
AttributeError - If the table is unset"""
|
AttributeError - If the table is unset"""
|
||||||
if not self.__table:
|
if not self.__table:
|
||||||
raise AttributeError("Attempted to write to unset table")
|
raise AttributeError("Attempted to write to unset table")
|
||||||
if self.get(name):
|
if self.get(name) != None:
|
||||||
self.__con.execute(
|
self.__con.execute(
|
||||||
f"""UPDATE "{self.__table}" SET value = ? WHERE name = ?""",
|
f"""UPDATE "{self.__table}" SET value = ? WHERE name = ?""",
|
||||||
(str(value), name),
|
(str(value), name),
|
||||||
|
@ -190,3 +205,194 @@ class sql:
|
||||||
self.__con = None # type: ignore[assignment]
|
self.__con = None # type: ignore[assignment]
|
||||||
self.__db = ""
|
self.__db = ""
|
||||||
self.__table = ""
|
self.__table = ""
|
||||||
|
|
||||||
|
|
||||||
|
class asyncSql:
|
||||||
|
async def addTable(self, tableName: str, mode: int = 0, address: str = "") -> None:
|
||||||
|
"""# Function: sql.addTable
|
||||||
|
Adds a table to the database
|
||||||
|
# Inputs:
|
||||||
|
tableName: str - The name of the table to create
|
||||||
|
mode: int - Not yet implemented
|
||||||
|
address: str - Not yet implemented
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
None"""
|
||||||
|
async with aiosqlite.connect(self.__db) as con:
|
||||||
|
await con.execute(
|
||||||
|
f"""CREATE TABLE IF NOT EXISTS "{tableName}"
|
||||||
|
(id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
value TEXT NOT NULL)"""
|
||||||
|
)
|
||||||
|
await con.commit()
|
||||||
|
self.__table = tableName
|
||||||
|
|
||||||
|
def __init__(self, filename: str):
|
||||||
|
"""# Function: sql.__init__
|
||||||
|
Constructs an SQL instance
|
||||||
|
# Inputs:
|
||||||
|
filename: str - The name of the database file to connect to
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
ValueError - If the filename is `:memory:`, because the memory table doesn't work with how I've setup my async logic
|
||||||
|
"""
|
||||||
|
if filename == ":memory:":
|
||||||
|
raise ValueError("Cannot use `:memory:` table with async code")
|
||||||
|
if filename.endswith(".db"):
|
||||||
|
self.__db = filename
|
||||||
|
else:
|
||||||
|
self.__db = filename + ".db"
|
||||||
|
aRun(self.addTable("default"))
|
||||||
|
|
||||||
|
async def setTable(self, tableName: str) -> None:
|
||||||
|
"""# Function: sql.setTable
|
||||||
|
Sets the currently active table
|
||||||
|
# Inputs:
|
||||||
|
tableName: str - The name of the table to use
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
None"""
|
||||||
|
self.__table = tableName
|
||||||
|
|
||||||
|
async def __getitem__(self, name: str) -> Any:
|
||||||
|
"""# Function: sql.__getitem__
|
||||||
|
Gets the value of a key
|
||||||
|
# Inputs:
|
||||||
|
name: str - The name of the key to retrieve
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
Any - If the key exists, return it's value (casted), otherwise, return `None`
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
return await get(name)
|
||||||
|
|
||||||
|
async def get(self, name: str) -> Any:
|
||||||
|
"""# Function: sql.get
|
||||||
|
Gets the value of a key
|
||||||
|
# Inputs:
|
||||||
|
name: str - The name of the key to retrieve
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
Any - If the key exists, return it's value (casted), otherwise, return `None`
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
if not self.__table:
|
||||||
|
raise AttributeError("Attempted to read from unset table")
|
||||||
|
async with aiosqlite.connect(self.__db) as con:
|
||||||
|
cur = await con.execute(
|
||||||
|
f"""SELECT value FROM "{self.__table}" WHERE name = ?""", (name,)
|
||||||
|
)
|
||||||
|
data = await cur.fetchone()
|
||||||
|
if data:
|
||||||
|
try:
|
||||||
|
return ast.literal_eval(data[0])
|
||||||
|
except:
|
||||||
|
return data[0]
|
||||||
|
return None
|
||||||
|
|
||||||
|
async def __setitem__(self, name: str, value: object) -> int:
|
||||||
|
"""# Function: sql.__setitem__
|
||||||
|
Sets the value of a key
|
||||||
|
name: str - The name of the key to set
|
||||||
|
value: object - The value of the key
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
int - `1` if the key was created, `2` if it was updated
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
return await set()
|
||||||
|
|
||||||
|
async def set(self, name: str, value: object) -> int:
|
||||||
|
"""# Function: sql.set
|
||||||
|
Sets the value of a key
|
||||||
|
# Inputs:
|
||||||
|
name: str - The name of the key to set
|
||||||
|
value: object - The value of the key
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
int - `1` if the key was created, `2` if it was updated
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
async with aiosqlite.connect(self.__db) as con:
|
||||||
|
if not self.__table:
|
||||||
|
raise AttributeError("Attempted to write to unset table")
|
||||||
|
if await self.get(name) != None:
|
||||||
|
await con.execute(
|
||||||
|
f"""UPDATE "{self.__table}" SET value = ? WHERE name = ?""",
|
||||||
|
(str(value), name),
|
||||||
|
)
|
||||||
|
await con.commit()
|
||||||
|
return 2
|
||||||
|
else:
|
||||||
|
await con.execute(
|
||||||
|
f"""INSERT INTO "{self.__table}" (name, value) VALUES (?, ?)""",
|
||||||
|
(name, str(value)),
|
||||||
|
)
|
||||||
|
await con.commit()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
async def delete(self, name: str) -> None:
|
||||||
|
"""# Function: sql.delete
|
||||||
|
Deletes a key from the table
|
||||||
|
# Inputs:
|
||||||
|
name: str - The name of the key to delete
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
async with aiosqlite.connect(self.__db) as con:
|
||||||
|
if not self.__table:
|
||||||
|
raise AttributeError("Attempted to delete from unset table")
|
||||||
|
if await self.get(name):
|
||||||
|
await con.execute(
|
||||||
|
f"""DELETE FROM "{self.__table}" WHERE name = ?""", (name,)
|
||||||
|
)
|
||||||
|
await con.commit()
|
||||||
|
|
||||||
|
async def deleteAll(self) -> None:
|
||||||
|
"""# Function: sql.delete_all
|
||||||
|
Deletes all keys from the table
|
||||||
|
# Inputs:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
AttributeError - If the table is unset"""
|
||||||
|
async with aiosqlite.connect(self.__db) as con:
|
||||||
|
if not self.__table:
|
||||||
|
raise AttributeError("Attempted to delete from unset table")
|
||||||
|
await con.execute(f"""DELETE FROM "{self.__table}" """)
|
||||||
|
await con.commit()
|
||||||
|
|
||||||
|
async def close(self) -> None:
|
||||||
|
"""# Function: sql.close
|
||||||
|
Closes the database connection
|
||||||
|
# Inputs:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
None
|
||||||
|
|
||||||
|
# Raises:
|
||||||
|
None"""
|
||||||
|
self.__con = None # type: ignore[assignment]
|
||||||
|
self.__db = ""
|
||||||
|
self.__table = ""
|
||||||
|
|
Loading…
Add table
Reference in a new issue