sqlbench 0.1.61__tar.gz → 0.1.62__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.
Files changed (43) hide show
  1. {sqlbench-0.1.61 → sqlbench-0.1.62}/PKG-INFO +1 -1
  2. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/tabs/sql_tab.py +20 -6
  3. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/version.py +1 -1
  4. {sqlbench-0.1.61 → sqlbench-0.1.62}/.github/workflows/pypi-publish.yml +0 -0
  5. {sqlbench-0.1.61 → sqlbench-0.1.62}/.gitignore +0 -0
  6. {sqlbench-0.1.61 → sqlbench-0.1.62}/CLAUDE.md +0 -0
  7. {sqlbench-0.1.61 → sqlbench-0.1.62}/Makefile +0 -0
  8. {sqlbench-0.1.61 → sqlbench-0.1.62}/PYQT_MIGRATION_FEATURES.md +0 -0
  9. {sqlbench-0.1.61 → sqlbench-0.1.62}/README.md +0 -0
  10. {sqlbench-0.1.61 → sqlbench-0.1.62}/pyproject.toml +0 -0
  11. {sqlbench-0.1.61 → sqlbench-0.1.62}/requirements.txt +0 -0
  12. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/__init__.py +0 -0
  13. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/__main__.py +0 -0
  14. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/adapters.py +0 -0
  15. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/app.py +0 -0
  16. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/database.py +0 -0
  17. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/dialogs/__init__.py +0 -0
  18. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/dialogs/connection_dialog.py +0 -0
  19. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/dialogs/regex_builder_dialog.py +0 -0
  20. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/launcher.py +0 -0
  21. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/__init__.py +0 -0
  22. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/connection_tree.py +0 -0
  23. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/__init__.py +0 -0
  24. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/connection_dialog.py +0 -0
  25. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/query_manager_dialog.py +0 -0
  26. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/record_viewer_dialog.py +0 -0
  27. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/regex_builder_dialog.py +0 -0
  28. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/dialogs/settings_dialog.py +0 -0
  29. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/icons.py +0 -0
  30. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/main_window.py +0 -0
  31. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/syntax.py +0 -0
  32. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/tab_widget.py +0 -0
  33. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/tabs/__init__.py +0 -0
  34. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/tabs/spool_tab.py +0 -0
  35. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/qt/theme.py +0 -0
  36. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/resources/db_ibmi.png +0 -0
  37. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/resources/db_mysql.png +0 -0
  38. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/resources/db_postgresql.png +0 -0
  39. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/resources/db_unknown.png +0 -0
  40. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/resources/sqlbench.png +0 -0
  41. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/tabs/__init__.py +0 -0
  42. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/tabs/spool_tab.py +0 -0
  43. {sqlbench-0.1.61 → sqlbench-0.1.62}/sqlbench/tabs/sql_tab.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlbench
3
- Version: 0.1.61
3
+ Version: 0.1.62
4
4
  Summary: A multi-database SQL workbench with support for IBM i, MySQL, and PostgreSQL
5
5
  Project-URL: Homepage, https://github.com/jpsteil/sqlbench
6
6
  Project-URL: Repository, https://github.com/jpsteil/sqlbench
@@ -134,7 +134,7 @@ def _make_icon(shape: str, color: str = "#ddd", size: int = 18) -> QIcon:
134
134
  class QueryWorker(QThread):
135
135
  """Background thread for query execution."""
136
136
 
137
- finished = pyqtSignal(object, object, float, float, int) # results, description, exec_time, fetch_time, total_rows
137
+ finished = pyqtSignal(object, object, float, float, int, int) # results, description, exec_time, fetch_time, total_rows, rowcount
138
138
  error = pyqtSignal(str)
139
139
  row_count = pyqtSignal(int)
140
140
 
@@ -212,16 +212,17 @@ class QueryWorker(QThread):
212
212
  description = cursor.description
213
213
  if total_rows == 0:
214
214
  total_rows = len(rows)
215
+ rowcount = 0
215
216
  else:
216
217
  rows = []
217
218
  description = None
218
- self.row_count.emit(cursor.rowcount)
219
+ rowcount = cursor.rowcount if cursor.rowcount >= 0 else 0
219
220
 
220
221
  fetch_time = time.time() - fetch_start
221
222
  cursor.close()
222
223
 
223
224
  if not self._cancelled:
224
- self.finished.emit(rows, description, exec_time, fetch_time, total_rows)
225
+ self.finished.emit(rows, description, exec_time, fetch_time, total_rows, rowcount)
225
226
 
226
227
  except Exception as e:
227
228
  if not self._cancelled:
@@ -1463,7 +1464,7 @@ class SQLTab(QWidget):
1463
1464
 
1464
1465
  def _on_query_finished(self, rows: List, description: Any,
1465
1466
  exec_time: float, fetch_time: float,
1466
- total_rows: int = 0) -> None:
1467
+ total_rows: int = 0, rowcount: int = 0) -> None:
1467
1468
  """Handle query completion."""
1468
1469
  self._exit_script_mode()
1469
1470
  self._reset_buttons()
@@ -1471,11 +1472,12 @@ class SQLTab(QWidget):
1471
1472
  # Log to database
1472
1473
  try:
1473
1474
  db = _get_db()
1475
+ log_row_count = len(rows) if rows else rowcount
1474
1476
  db.log_query(
1475
1477
  self.connection_name,
1476
1478
  self._last_sql,
1477
1479
  duration=exec_time + fetch_time,
1478
- row_count=len(rows) if rows else 0,
1480
+ row_count=log_row_count,
1479
1481
  status="success"
1480
1482
  )
1481
1483
  except Exception as e:
@@ -1511,6 +1513,18 @@ class SQLTab(QWidget):
1511
1513
  f"Showing {start:,}-{end:,} of {self._total_rows:,} row(s) "
1512
1514
  f"(Page {self._current_page} of {total_pages}){edit_status}"
1513
1515
  )
1516
+ elif description is None and rowcount >= 0:
1517
+ # Non-SELECT statement (UPDATE/DELETE/INSERT)
1518
+ sql_upper = self._last_sql.strip().upper()
1519
+ if sql_upper.startswith("INSERT"):
1520
+ status = f"{rowcount} row(s) inserted"
1521
+ elif sql_upper.startswith("UPDATE"):
1522
+ status = f"{rowcount} row(s) updated"
1523
+ elif sql_upper.startswith("DELETE"):
1524
+ status = f"{rowcount} row(s) deleted"
1525
+ else:
1526
+ status = f"{rowcount} row(s) affected"
1527
+ self.results_status.setText(status)
1514
1528
  else:
1515
1529
  self.results_status.setText("No results")
1516
1530
 
@@ -1655,7 +1669,7 @@ class SQLTab(QWidget):
1655
1669
 
1656
1670
  def _on_page_loaded(self, rows: List, description: Any,
1657
1671
  exec_time: float, fetch_time: float,
1658
- total_rows: int = 0) -> None:
1672
+ total_rows: int = 0, rowcount: int = 0) -> None:
1659
1673
  """Handle page load completion."""
1660
1674
  self._exit_script_mode()
1661
1675
  self._reset_buttons()
@@ -4,7 +4,7 @@ import threading
4
4
  import urllib.request
5
5
  import json
6
6
 
7
- __version__ = "0.1.61"
7
+ __version__ = "0.1.62"
8
8
 
9
9
 
10
10
  def get_installed_version():
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes