From eecf4ef13cb5138cea62c90b9371183af7c7b733 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Mon, 14 Dec 2020 20:08:01 +0100
Subject: [PATCH] add getting current value for VarlenSeries

---
 tempsdb/database.pyx   |  8 ++++++--
 tempsdb/varlen.pxd     |  3 ++-
 tempsdb/varlen.pyx     | 20 ++++++++++++++++++++
 tests/test_database.py |  2 ++
 4 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/tempsdb/database.pyx b/tempsdb/database.pyx
index 5ddaaf4..1689a24 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 e792533..1657ccc 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 3131c53..99d252c 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 2d1686d..24ab246 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()
 
-- 
GitLab