mugunthjhs commited on
Commit
c0e720c
·
verified ·
1 Parent(s): 8215b2d

Update database.py

Browse files
Files changed (1) hide show
  1. database.py +99 -94
database.py CHANGED
@@ -1,95 +1,100 @@
1
- import sqlite3
2
- from langchain_community.utilities.sql_database import SQLDatabase
3
-
4
- DB_FILENAME = "tasks.db"
5
- DB_PATH_URI = f"sqlite:///{DB_FILENAME}"
6
-
7
- def create_db_and_table():
8
- conn = sqlite3.connect(DB_FILENAME)
9
- cursor = conn.cursor()
10
- cursor.execute("""
11
- CREATE TABLE IF NOT EXISTS tasks (
12
- id INTEGER PRIMARY KEY AUTOINCREMENT,
13
- user_name TEXT,
14
- user_email TEXT,
15
- task_name TEXT NOT NULL,
16
- status TEXT DEFAULT 'pending',
17
- category TEXT,
18
- created_at TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')),
19
- due_date TEXT,
20
- due_time TEXT
21
- )
22
- """)
23
- try:
24
- cursor.execute("""
25
- CREATE UNIQUE INDEX IF NOT EXISTS idx_unq_user_task
26
- ON tasks (user_email, task_name, due_date, COALESCE(due_time, ''));
27
- """)
28
- except sqlite3.OperationalError as e:
29
- print(f"Warning: Could not create unique index idx_unq_user_task, it might exist or conflict: {e}")
30
- conn.commit()
31
- conn.close()
32
-
33
- def get_db_info():
34
- db = SQLDatabase.from_uri(DB_PATH_URI, include_tables=['tasks'])
35
- return db.get_table_info()
36
-
37
- def get_task_by_id(task_id: int, user_email: str):
38
- query = "SELECT id, task_name, status, category, due_date, due_time, created_at FROM tasks WHERE id = ? AND user_email = ?"
39
- conn = sqlite3.connect(DB_FILENAME)
40
- cursor = conn.cursor()
41
- try:
42
- cursor.execute(query, (task_id, user_email))
43
- data = cursor.fetchone()
44
- if data:
45
- columns = [description[0] for description in cursor.description]
46
- return dict(zip(columns, data))
47
- return None
48
- except sqlite3.Error as e:
49
- print(f"Error fetching task by ID {task_id}: {e}")
50
- return None
51
- finally:
52
- conn.close()
53
-
54
- def execute_select_query(query: str, params: tuple = None):
55
- conn = sqlite3.connect(DB_FILENAME)
56
- cursor = conn.cursor()
57
- try:
58
- cursor.execute(query, params or ())
59
- data = cursor.fetchall()
60
- columns = [description[0] for description in cursor.description] if cursor.description else []
61
- return data, columns
62
- except sqlite3.Error as e:
63
- print(f"Error executing SELECT query: {query}\n{e}")
64
- raise
65
- finally:
66
- conn.close()
67
-
68
- def execute_dml_query(query: str, params: tuple = None):
69
- conn = sqlite3.connect(DB_FILENAME)
70
- cursor = conn.cursor()
71
- is_insert = query.strip().upper().startswith("INSERT")
72
- try:
73
- cursor.execute(query, params or ())
74
- conn.commit()
75
- if is_insert:
76
- return cursor.lastrowid
77
- return cursor.rowcount
78
-
79
- except sqlite3.IntegrityError as e:
80
- error_code = getattr(e, 'sqlite_errorcode', None)
81
- if not error_code and hasattr(e, 'args') and len(e.args) > 0:
82
- if "UNIQUE constraint failed" in str(e.args[0]).upper():
83
- error_code = 2067
84
- if error_code == 2067 or error_code == 1555 or \
85
- (isinstance(e, sqlite3.IntegrityError) and "UNIQUE constraint failed" in str(e).upper()):
86
- raise ValueError(f"Task likely already exists with the same name, due date, and time. (Details: {e})")
87
- else:
88
- print(f"Unhandled IntegrityError executing DML query: {query}\nCode: {error_code}, Error: {e}")
89
- raise
90
-
91
- except sqlite3.Error as e:
92
- print(f"General SQLite error executing DML query: {query}\n{e}")
93
- raise
94
- finally:
 
 
 
 
 
95
  conn.close()
 
1
+ import sqlite3
2
+ import os
3
+ from langchain_community.utilities.sql_database import SQLDatabase
4
+
5
+ APP_DIR = "/app"
6
+ DB_FILENAME = os.path.join(APP_DIR, "tasks.db")
7
+ DB_PATH_URI = f"sqlite:///{DB_FILENAME}"
8
+
9
+
10
+ def create_db_and_table():
11
+ """Creates the SQLite database and tasks table if they don't exist."""
12
+
13
+ conn = sqlite3.connect(DB_FILENAME) # Uses the absolute path
14
+ cursor = conn.cursor()
15
+ cursor.execute("""
16
+ CREATE TABLE IF NOT EXISTS tasks (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ user_name TEXT,
19
+ user_email TEXT,
20
+ task_name TEXT NOT NULL,
21
+ status TEXT DEFAULT 'pending',
22
+ category TEXT,
23
+ created_at TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')),
24
+ due_date TEXT,
25
+ due_time TEXT
26
+ )
27
+ """)
28
+ try:
29
+ cursor.execute("""
30
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_unq_user_task
31
+ ON tasks (user_email, task_name, due_date, COALESCE(due_time, ''));
32
+ """)
33
+ except sqlite3.OperationalError as e:
34
+ print(f"Warning: Could not create unique index idx_unq_user_task, it might exist or conflict: {e}")
35
+ conn.commit()
36
+ conn.close()
37
+
38
+ def get_db_info():
39
+ db = SQLDatabase.from_uri(DB_PATH_URI, include_tables=['tasks'])
40
+ return db.get_table_info()
41
+
42
+ def get_task_by_id(task_id: int, user_email: str):
43
+ query = "SELECT id, task_name, status, category, due_date, due_time, created_at FROM tasks WHERE id = ? AND user_email = ?"
44
+ conn = sqlite3.connect(DB_FILENAME)
45
+ cursor = conn.cursor()
46
+ try:
47
+ cursor.execute(query, (task_id, user_email))
48
+ data = cursor.fetchone()
49
+ if data:
50
+ columns = [description[0] for description in cursor.description]
51
+ return dict(zip(columns, data))
52
+ return None
53
+ except sqlite3.Error as e:
54
+ print(f"Error fetching task by ID {task_id}: {e}")
55
+ return None
56
+ finally:
57
+ conn.close()
58
+
59
+ def execute_select_query(query: str, params: tuple = None):
60
+ conn = sqlite3.connect(DB_FILENAME)
61
+ cursor = conn.cursor()
62
+ try:
63
+ cursor.execute(query, params or ())
64
+ data = cursor.fetchall()
65
+ columns = [description[0] for description in cursor.description] if cursor.description else []
66
+ return data, columns
67
+ except sqlite3.Error as e:
68
+ print(f"Error executing SELECT query: {query}\n{e}")
69
+ raise
70
+ finally:
71
+ conn.close()
72
+
73
+ def execute_dml_query(query: str, params: tuple = None):
74
+ conn = sqlite3.connect(DB_FILENAME)
75
+ cursor = conn.cursor()
76
+ is_insert = query.strip().upper().startswith("INSERT")
77
+ try:
78
+ cursor.execute(query, params or ())
79
+ conn.commit()
80
+ if is_insert:
81
+ return cursor.lastrowid
82
+ return cursor.rowcount
83
+
84
+ except sqlite3.IntegrityError as e:
85
+ error_code = getattr(e, 'sqlite_errorcode', None)
86
+ if not error_code and hasattr(e, 'args') and len(e.args) > 0:
87
+ if "UNIQUE constraint failed" in str(e.args[0]).upper():
88
+ error_code = 2067
89
+ if error_code == 2067 or error_code == 1555 or \
90
+ (isinstance(e, sqlite3.IntegrityError) and "UNIQUE constraint failed" in str(e).upper()):
91
+ raise ValueError(f"Task likely already exists with the same name, due date, and time. (Details: {e})")
92
+ else:
93
+ print(f"Unhandled IntegrityError executing DML query: {query}\nCode: {error_code}, Error: {e}")
94
+ raise
95
+
96
+ except sqlite3.Error as e:
97
+ print(f"General SQLite error executing DML query: {query}\n{e}")
98
+ raise
99
+ finally:
100
  conn.close()