hivemind-sqlite-database 0.4.0a4__tar.gz → 0.4.0a5__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.

Potentially problematic release.


This version of hivemind-sqlite-database might be problematic. Click here for more details.

Files changed (14) hide show
  1. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/PKG-INFO +1 -1
  2. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database/__init__.py +20 -0
  3. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database/version.py +1 -1
  4. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/PKG-INFO +1 -1
  5. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/tests/test_sqlitedb.py +16 -0
  6. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/LICENSE.md +0 -0
  7. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/README.md +0 -0
  8. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/SOURCES.txt +0 -0
  9. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/dependency_links.txt +0 -0
  10. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/entry_points.txt +0 -0
  11. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/requires.txt +0 -0
  12. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/hivemind_sqlite_database.egg-info/top_level.txt +0 -0
  13. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/pyproject.toml +0 -0
  14. {hivemind_sqlite_database-0.4.0a4 → hivemind_sqlite_database-0.4.0a5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hivemind-sqlite-database
3
- Version: 0.4.0a4
3
+ Version: 0.4.0a5
4
4
  Summary: sqlite database plugin for hivemind-core
5
5
  Author-email: jarbasAi <jarbasai@mailfence.com>
6
6
  License: Apache-2.0
@@ -215,6 +215,26 @@ class SQLiteDB(AbstractDB):
215
215
  LOG.error(f"Failed to add client to SQLite: {e}")
216
216
  return False
217
217
 
218
+ def update_last_seen(self, api_key: str, seen_at: float) -> bool:
219
+ """Atomically advance ``last_seen`` for the matching API key."""
220
+ try:
221
+ with self._write_lock, self.conn:
222
+ cursor = self.conn.execute(
223
+ """
224
+ UPDATE clients
225
+ SET last_seen = CASE
226
+ WHEN last_seen IS NULL OR last_seen < ? THEN ?
227
+ ELSE last_seen
228
+ END
229
+ WHERE api_key = ?
230
+ """,
231
+ (seen_at, seen_at, api_key),
232
+ )
233
+ return cursor.rowcount > 0
234
+ except sqlite3.Error as e:
235
+ LOG.error(f"Failed to update last_seen in SQLite: {e}")
236
+ return False
237
+
218
238
  def search_by_value(self, key: str, val: Union[str, bool, int, float]) -> List[Client]:
219
239
  """
220
240
  Search for clients by a specific key-value pair in the SQLite database.
@@ -2,7 +2,7 @@
2
2
  VERSION_MAJOR = 0
3
3
  VERSION_MINOR = 4
4
4
  VERSION_BUILD = 0
5
- VERSION_ALPHA = 4
5
+ VERSION_ALPHA = 5
6
6
  # END_VERSION_BLOCK
7
7
 
8
8
  __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hivemind-sqlite-database
3
- Version: 0.4.0a4
3
+ Version: 0.4.0a5
4
4
  Summary: sqlite database plugin for hivemind-core
5
5
  Author-email: jarbasAi <jarbasai@mailfence.com>
6
6
  License: Apache-2.0
@@ -189,6 +189,22 @@ class TestSQLiteDBSearchByValue(unittest.TestCase):
189
189
  self.assertEqual(results, [])
190
190
 
191
191
 
192
+ class TestSQLiteDBLastSeen(unittest.TestCase):
193
+ def test_update_last_seen_never_moves_timestamp_backward(self):
194
+ db = make_db()
195
+ db.add_item(make_client(1, "key", last_seen=200.0))
196
+
197
+ self.assertTrue(db.update_last_seen("key", 100.0))
198
+ self.assertEqual(db.search_by_value("api_key", "key")[0].last_seen, 200.0)
199
+
200
+ self.assertTrue(db.update_last_seen("key", 300.0))
201
+ self.assertEqual(db.search_by_value("api_key", "key")[0].last_seen, 300.0)
202
+
203
+ def test_update_last_seen_returns_false_for_missing_key(self):
204
+ db = make_db()
205
+ self.assertFalse(db.update_last_seen("missing", 100.0))
206
+
207
+
192
208
  class TestSQLiteDBIter(unittest.TestCase):
193
209
  def test_iter_yields_all_rows(self):
194
210
  db = make_db()