diff --git a/tempsdb/database.pyx b/tempsdb/database.pyx index 5ddaaf4cbb6f2edb73350f152ee3f3be7b1b3cef..1689a24e403a880a8d3d58d1165ffacc2285cc0d 100644 --- a/tempsdb/database.pyx +++ b/tempsdb/database.pyx @@ -56,7 +56,9 @@ cdef class Database: cpdef int delete_series(self, str name) except -1: """ - Deletes a constant-length time series + Deletes a constant-length time series. + + Note that the series must either not be open, or closed. :param name: name of series to delete :raises ValueError: tried to delete "varlen" series @@ -77,7 +79,9 @@ cdef class Database: cpdef int delete_varlen_series(self, str name) except -1: """ - Deletes a variable-length time series + Deletes a variable-length time series. + + Note that the series must either not be open, or closed. :param name: name of series to delete :raises DoesNotExist: series does not exist diff --git a/tempsdb/varlen.pxd b/tempsdb/varlen.pxd index e792533cadb3c89774abdc8e03a460d1686a86c4..1657cccf0e8cdb60dad88af8b784ae60e192489d 100644 --- a/tempsdb/varlen.pxd +++ b/tempsdb/varlen.pxd @@ -1,4 +1,4 @@ -from .series cimport TimeSeries, create_series +from .series cimport TimeSeries cdef class VarlenSeries: @@ -20,6 +20,7 @@ cdef class VarlenSeries: cpdef int mark_synced_up_to(self, unsigned long long timestamp) except -1 cpdef int close(self) except -1 cpdef int delete(self) except -1 + cpdef tuple get_current_value(self) cdef int get_length_for(self, int index) cpdef int trim(self, unsigned long long timestamp) except -1 cdef int add_series(self) except -1 diff --git a/tempsdb/varlen.pyx b/tempsdb/varlen.pyx index 3131c53e4d3b40bd3561decde10abe858241e8fd..99d252cb91faebdfedb93d4c298caa8655730ed0 100644 --- a/tempsdb/varlen.pyx +++ b/tempsdb/varlen.pyx @@ -435,6 +435,26 @@ cdef class VarlenSeries: """ return VarlenIterator(self, start, stop, direct_bytes=direct_bytes) + cpdef tuple get_current_value(self): + """ + Return latest value of this series + + :return: tuple of (timestamp, value) + :rtype: tp.Tuple[int, bytes] + :raises ValueError: series has no data + """ + if self.root_series.last_chunk is None: + raise ValueError('No data in series') + cdef: + VarlenIterator it = self.iterate_range(self.root_series.last_entry_ts, + self.root_series.last_entry_ts) + VarlenEntry et = it.get_next() + try: + return et.timestamp(), et.to_bytes() + finally: + et.close() + it.close() + def __init__(self, path: str, name: str): self.closed = False self.path = path diff --git a/tests/test_database.py b/tests/test_database.py index 2d1686db09cc091e3f8134b0d10f9477b01e8e5c..24ab2462861957af578be56a14c5145613e75d76 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -16,6 +16,7 @@ class TestDatabase(unittest.TestCase): ser.close() ser = self.db.get_series('hello-world') + self.assertEqual(ser.get_current_value(), (20, b'\x00')) self.assertEqual(ser.last_entry_ts, 20) ser.close() @@ -29,6 +30,7 @@ class TestDatabase(unittest.TestCase): ser.close() ser = self.db.get_varlen_series('hello-world') + self.assertEqual(ser.get_current_value(), (20, b'\x00\x00\x00')) self.assertEqual(ser.last_entry_ts, 20) ser.close()