log_source.py
changeset 111 95c0c49d76aa
parent 106 0690d715385d
child 112 090192b64d7e
--- a/log_source.py	Wed Feb 11 22:01:53 2009 +0200
+++ b/log_source.py	Wed Feb 11 22:24:55 2009 +0200
@@ -8,6 +8,9 @@
 
 import config, utils
 
+# a timedelta that represents one day
+ONE_DAY = datetime.timedelta(days=1)
+
 class LogSourceDecoder (object) :
     """
         Handles decoding of LogSource lines
@@ -157,7 +160,7 @@
 
     def get_month_days (self, dt) :
         """
-            Return a sequence of dates, telling which days in the given month (as a datetime) have logs available
+            Return an ordered sequence of dates, telling which days in the given month (as a datetime) have logs available.
         """
 
         abstract
@@ -175,6 +178,20 @@
         """
 
         abstract
+    
+    def get_prev_date (self, dt) :
+        """
+            Get the next distinct date of logs available preceeding the given date, or None
+        """
+
+        abstract
+
+    def get_next_date (self, dt) :
+        """
+            Get the next distinct date of logs following the given date, or None.
+        """
+        
+        abstract
 
 class LogFile (object) :
     """
@@ -416,21 +433,21 @@
             else :
                 raise
     
-    def _iter_logfile_dates (self, after=None, until=None) :
+    def _iter_logfile_dates (self, after=None, until=None, reverse=False) :
         """
             Yields a series of naive datetime objects representing the logfiles that are available, in time order.
-
-            If after is given, only dates from said date onwards will be returned
-            If until is given, only dates up to and including said date will be returned
+            
+            Parameters :
+                after   only dates from said date onwards will be returned
+                until   only dates up to and including said date will be returned
+                reverse the dates are returned in reverse order instead. Note that the meaning of after/until doesn't change
         """
 
         # listdir
         filenames = os.listdir(self.path)
 
         # sort
-        filenames.sort()
-
-        
+        filenames.sort(reverse=reverse)
 
         # iter files
         for filename in filenames :
@@ -443,13 +460,16 @@
                 continue
 
             else :
-                if (not after or date >= after) and (not until or date <= until) :
+                if (after and date < after) or (until and date > until) :
+                    # ignore
+                    continue
+                
+                else :
+#                    print
+#                    print "iter_logfile_dates: after=%s, until=%s, reverse=%s -> %s" % (after, until, reverse, date)
+
                     # yield
                     yield date
-                
-                else :
-                    # ignore
-                    continue
             
     def _iter_date_reverse (self, dt=None) :
         """
@@ -465,9 +485,6 @@
             # convert to target timezone
             dtz = dt.astimezone(self.tz)
 
-        # our timedelta
-        ONE_DAY = datetime.timedelta(1)
-        
         # iterate unto infinity
         while True :
             # yield
@@ -526,7 +543,7 @@
 
     def get_latest (self, count) :
         """
-            Uses _iter_backwards + _get_logfile_date to read the yield the given lines from as many logfiles as needed
+            Uses _logfile_reverse to read the yield the given lines from as many logfiles as needed
         """
 
         # read the events into here
@@ -645,3 +662,27 @@
             for line in logfile.read_full() :
                 yield line
 
+    def get_prev_date (self, dt) :
+        """
+            Just use _iter_logfile_dates
+        """
+        
+        # use for to "iter" once
+        for log_date in self._iter_logfile_dates(until=dt - ONE_DAY, reverse=True) :
+            return log_date
+        
+        else :
+            return None
+
+    def get_next_date (self, dt) :
+        """
+            Just use _iter_logfile_dates
+        """
+        
+        # use for to "iter" once
+        for log_date in self._iter_logfile_dates(after=dt + ONE_DAY) :
+            return log_date
+        
+        else :
+            return None
+