Mercurial > moin > 1.9
annotate MoinMoin/logfile/__init__.py @ 3469:94a6f5fbf8b7
stats.hitcounts: fixes multiple call of Hits (MoinMoinBugs/ClickOnNavibarIncreasesHitsByMultiplicator)
author  Reimar Bauer <rb.proj AT googlemail DOT com> 

date  Fri, 04 Apr 2008 23:48:41 +0200 
parents  a48929a5036c 
children  af3460a4cb79 
rev  line source 

0
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

1 # * coding: iso88591 * 
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

2 """ 
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

3 MoinMoin  LogFile package 
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

4 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

5 This module supports buffered log reads, iterating forward and backward linebyline, etc. 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

6 
1918
bb2e053067fb
fixing copyright headers: remove umlauts (encoding troubles), make epydoc compatible, reformat
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1856
diff
changeset

7 @copyright: 20052007 MoinMoin:ThomasWaldmann 
0
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

8 @license: GNU GPL, see COPYING for details. 
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

9 """ 
3107
c6e39279f83b
refactor logging usage
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
3098
diff
changeset

10 
3110
a48929a5036c
logging: make it work correctly by doing logging configuration very early
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
3107
diff
changeset

11 from MoinMoin import log 
a48929a5036c
logging: make it work correctly by doing logging configuration very early
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
3107
diff
changeset

12 logging = log.getLogger(__name__) 
0
77665d8e2254
tag of nonpublic@localhostarchive/moinenterprise1.5base0
Thomas Waldmann <twpublic@gmx.de>
parents:
diff
changeset

13 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

14 import os, codecs, errno 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

15 from MoinMoin import config, wikiutil 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

16 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

17 class LogError(Exception): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

18 """ Base class for log errors """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

19 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

20 class LogMissing(LogError): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

21 """ Raised when the log is missing """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

22 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

23 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

24 class LineBuffer: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

25 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

26 Reads lines from a file 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

27 self.len number of lines in self.lines 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

28 self.lines list of lines (unicode) 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

29 self.offsets list of file offsets for each line. additionally the position 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

30 after the last read line is stored into self.offsets[1] 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

31 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

32 def __init__(self, file, offset, size, forward=True): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

33 """ 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

34 
1986
3475126f78c6
fix some builtin names used as attribute names
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1920
diff
changeset

35 TODO: when this gets refactored, don't use "file" (is a builtin) 
3475126f78c6
fix some builtin names used as attribute names
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1920
diff
changeset

36 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

37 @param file: open file object 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

38 @param offset: position in file to start from 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

39 @param size: aproximate number of bytes to read 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

40 @param forward : read from offset on or from offsetsize to offset 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

41 @type forward: boolean 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

42 """ 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

43 self.loglevel = logging.NOTSET 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

44 if forward: 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

45 begin = offset 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

46 logging.log(self.loglevel, "LineBuffer.init: forward seek %d read %d" % (begin, size)) 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

47 file.seek(begin) 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

48 lines = file.readlines(size) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

49 else: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

50 if offset < 2 * size: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

51 begin = 0 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

52 size = offset 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

53 else: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

54 begin = offset  size 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

55 logging.log(self.loglevel, "LineBuffer.init: backward seek %d read %d" % (begin, size)) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

56 file.seek(begin) 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

57 lines = file.read(size).splitlines(True) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

58 if begin != 0: 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

59 # remove potentially incomplete first line 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

60 begin += len(lines[0]) 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

61 lines = lines[1:] 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

62 # XXX check for min one line read 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

63 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

64 linecount = len(lines) 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

65 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

66 # now calculate the file offsets of all read lines 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

67 offsets = [len(line) for line in lines] 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

68 offsets.append(0) # later this element will have the file offset after the last read line 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

69 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

70 lengthpreviousline = 0 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

71 offset = begin 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

72 for i in xrange(linecount+1): 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

73 offset += lengthpreviousline 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

74 lengthpreviousline = offsets[i] 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

75 offsets[i] = offset 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

76 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

77 self.offsets = offsets 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

78 self.len = linecount 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

79 # Decode lines after offset in file is calculated 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

80 self.lines = [unicode(line, config.charset) for line in lines] 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

81 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

82 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

83 class LogFile: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

84 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

85 .filter: function that gets the values from .parser. 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

86 must return True to keep it or False to remove it 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

87 Overwrite .parser() and .add() to customize this class to special log files 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

88 """ 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

89 
1838
e1d4cc010dec
Reduced log file buffer to 4 kB.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
1825
diff
changeset

90 def __init__(self, filename, buffer_size=4096): 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

91 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

92 @param filename: name of the log file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

93 @param buffer_size: approx. size of one buffer in bytes 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

94 """ 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

95 self.loglevel = logging.NOTSET 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

96 self.__filename = filename 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

97 self.__buffer = None # currently used buffer, points to one of the following: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

98 self.__buffer1 = None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

99 self.__buffer2 = None 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

100 self.buffer_size = buffer_size 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

101 self.__lineno = 0 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

102 self.filter = None 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

103 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

104 def __iter__(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

105 return self 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

106 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

107 def reverse(self): 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

108 """ yield log entries in reverse direction starting from last one 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

109 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

110 @rtype: iterator 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

111 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

112 self.to_end() 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

113 while 1: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

114 try: 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

115 logging.log(self.loglevel, "LogFile.reverse %s" % self.__filename) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

116 result = self.previous() 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

117 except StopIteration: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

118 return 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

119 yield result 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

120 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

121 def sanityCheck(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

122 """ Check for log file write access. 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

123 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

124 @rtype: string (error message) or None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

125 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

126 if not os.access(self.__filename, os.W_OK): 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

127 return "The log '%s' is not writable!" % (self.__filename, ) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

128 return None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

129 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

130 def __getattr__(self, name): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

131 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

132 generate some attributes when needed 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

133 """ 
1825
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

134 if name == "_LogFile__rel_index": # Python black magic: this is the real name of the __rel_index attribute 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

135 # starting iteration from begin 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

136 self.__buffer1 = LineBuffer(self._input, 0, self.buffer_size) 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

137 self.__buffer2 = LineBuffer(self._input, 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

138 self.__buffer1.offsets[1], 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

139 self.buffer_size) 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

140 self.__buffer = self.__buffer1 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

141 self.__rel_index = 0 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

142 return 0 
738bb2ec6b7f
partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1820
diff
changeset

143 elif name == "_input": 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

144 try: 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

145 # Open the file (NOT using codecs.open, it breaks our offset calculation. We decode it later.). 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

146 # Use binary mode in order to retain \r  otherwise the offset calculation would fail. 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

147 self._input = file(self.__filename, "rb", ) 
2044
967d529b31e9
workaround for initially nonexisting editlog, remove editlog from repo
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1986
diff
changeset

148 except IOError, err: 
3098
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

149 if err.errno == errno.ENOENT: # "file not found" 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

150 # XXX workaround if editlog does not exist: just create it empty 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

151 # if this workaround raises another error, we don't catch 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

152 # it, so the admin will see it. 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

153 f = file(self.__filename, "ab") 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

154 f.write('') 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

155 f.close() 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

156 self._input = file(self.__filename, "rb", ) 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

157 else: 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

158 logging.error("logfile: %r IOERROR errno %d (%s)" % (self.__filename, err.errno, os.strerror(err.errno))) 
a67e104828d1
fix logfile code for EACCESS errors (does not hide them, just logs and reraises now)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2286
diff
changeset

159 raise 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

160 return self._input 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

161 elif name == "_output": 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

162 self._output = codecs.open(self.__filename, 'a', config.charset) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

163 return self._output 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

164 else: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

165 raise AttributeError(name) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

166 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

167 def size(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

168 """ Return log size in bytes 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

169 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

170 Return 0 if the file does not exists. Raises other OSError. 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

171 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

172 @return: size of log file in bytes 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

173 @rtype: Int 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

174 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

175 try: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

176 return os.path.getsize(self.__filename) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

177 except OSError, err: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

178 if err.errno == errno.ENOENT: 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

179 return 0 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

180 raise 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

181 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

182 def lines(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

183 """ Return number of lines in the log file 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

184 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

185 Return 0 if the file does not exists. Raises other OSError. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

186 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

187 Expensive for big log files  O(n) 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

188 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

189 @return: size of log file in lines 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

190 @rtype: Int 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

191 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

192 try: 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

193 f = file(self.__filename, 'r') 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

194 try: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

195 count = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

196 for line in f: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

197 count += 1 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

198 return count 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

199 finally: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

200 f.close() 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

201 except (OSError, IOError), err: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

202 if err.errno == errno.ENOENT: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

203 return 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

204 raise 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

205 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

206 def date(self): 
3469
94a6f5fbf8b7
stats.hitcounts: fixes multiple call of Hits (MoinMoinBugs/ClickOnNavibarIncreasesHitsByMultiplicator)
Reimar Bauer <rb.proj AT googlemail DOT com>
parents:
3110
diff
changeset

207 # ToDo check if we need this method 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

208 """ Return timestamp of log file in usecs """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

209 try: 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

210 mtime = os.path.getmtime(self.__filename) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

211 except OSError, err: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

212 if err.errno == errno.ENOENT: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

213 # This can happen on fresh wiki when building the index 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

214 # Usually the first request will create an event log 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

215 raise LogMissing(str(err)) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

216 raise 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

217 return wikiutil.timestamp2version(mtime) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

218 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

219 def peek(self, lines): 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

220 """ Move position in file forward or backwards by "lines" count 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

221 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

222 It adjusts .__lineno if set. 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

223 This function is not aware of filters! 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

224 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

225 @param lines: number of lines, may be negative to move backward 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

226 @rtype: boolean 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

227 @return: True if moving more than to the beginning and moving 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

228 to the end or beyond 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

229 """ 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

230 logging.log(self.loglevel, "LogFile.peek %s" % self.__filename) 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

231 self.__rel_index += lines 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

232 while self.__rel_index < 0: 
1646
2fbb179f3518
use filepos in (not mtime of) editlog for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1317
diff
changeset

233 if self.__buffer is self.__buffer2: 
1856
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

234 if self.__buffer.offsets[0] == 0: 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

235 # already at the beginning of the file 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

236 self.__rel_index = 0 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

237 self.__lineno = 0 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

238 return True 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

239 else: 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

240 # change to buffer 1 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

241 self.__buffer = self.__buffer1 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

242 self.__rel_index += self.__buffer.len 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

243 else: # self.__buffer is self.__buffer1 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

244 if self.__buffer.offsets[0] == 0: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

245 # already at the beginning of the file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

246 self.__rel_index = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

247 self.__lineno = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

248 return True 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

249 else: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

250 # load previous lines 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

251 self.__buffer2 = self.__buffer1 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

252 self.__buffer1 = LineBuffer(self._input, 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

253 self.__buffer.offsets[0], 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

254 self.buffer_size, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

255 forward=False) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

256 self.__buffer = self.__buffer1 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

257 self.__rel_index += self.__buffer.len 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

258 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

259 while self.__rel_index >= self.__buffer.len: 
1646
2fbb179f3518
use filepos in (not mtime of) editlog for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1317
diff
changeset

260 if self.__buffer is self.__buffer1: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

261 # change to buffer 2 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

262 self.__rel_index = self.__buffer.len 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

263 self.__buffer = self.__buffer2 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

264 else: # self.__buffer is self.__buffer2 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

265 # try to load next buffer 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

266 tmpbuff = LineBuffer(self._input, 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

267 self.__buffer.offsets[1], 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

268 self.buffer_size) 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

269 if tmpbuff.len == 0: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

270 # end of file 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

271 if self.__lineno is not None: 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

272 self.__lineno += (lines  
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

273 (self.__rel_index  self.__buffer.len)) 
1646
2fbb179f3518
use filepos in (not mtime of) editlog for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1317
diff
changeset

274 self.__rel_index = self.__buffer.len # point to after last read line 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

275 return True 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

276 # shift buffers 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

277 self.__rel_index = self.__buffer.len 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

278 self.__buffer1 = self.__buffer2 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

279 self.__buffer2 = tmpbuff 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

280 self.__buffer = self.__buffer2 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

281 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

282 if self.__lineno is not None: 
1920
b06ef2a53efa
'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1918
diff
changeset

283 self.__lineno += lines 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

284 return False 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

285 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

286 def __next(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

287 """get next line already parsed""" 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

288 if self.peek(0): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

289 raise StopIteration 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

290 result = self.parser(self.__buffer.lines[self.__rel_index]) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

291 self.peek(1) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

292 return result 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

293 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

294 def next(self): 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

295 """get next line that passes through the filter 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

296 @return: next entry 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

297 raises StopIteration at file end 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

298 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

299 result = None 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

300 while result is None: 
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

301 while result is None: 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

302 logging.log(self.loglevel, "LogFile.next %s" % self.__filename) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

303 result = self.__next() 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

304 if self.filter and not self.filter(result): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

305 result = None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

306 return result 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

307 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

308 def __previous(self): 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

309 """get previous line already parsed""" 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

310 if self.peek(1): 
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

311 raise StopIteration 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

312 return self.parser(self.__buffer.lines[self.__rel_index]) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

313 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

314 def previous(self): 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

315 """get previous line that passes through the filter 
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

316 @return: previous entry 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

317 raises StopIteration at file begin 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

318 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

319 result = None 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

320 while result is None: 
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

321 while result is None: 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

322 logging.log(self.loglevel, "LogFile.previous %s" % self.__filename) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

323 result = self.__previous() 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

324 if self.filter and not self.filter(result): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

325 result = None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

326 return result 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

327 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

328 def to_begin(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

329 """moves file position to the begin""" 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

330 logging.log(self.loglevel, "LogFile.to_begin %s" % self.__filename) 
1820
9595d9d5e5ae
logfile: removed some unused code, added some checks
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1818
diff
changeset

331 if self.__buffer1 is None or self.__buffer1.offsets[0] != 0: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

332 self.__buffer1 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

333 0, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

334 self.buffer_size) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

335 self.__buffer2 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

336 self.__buffer1.offsets[1], 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

337 self.buffer_size) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

338 self.__buffer = self.__buffer1 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

339 self.__rel_index = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

340 self.__lineno = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

341 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

342 def to_end(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

343 """moves file position to the end""" 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

344 logging.log(self.loglevel, "LogFile.to_end %s" % self.__filename) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

345 self._input.seek(0, 2) # to end of file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

346 size = self._input.tell() 
1820
9595d9d5e5ae
logfile: removed some unused code, added some checks
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1818
diff
changeset

347 if self.__buffer2 is None or size > self.__buffer2.offsets[1]: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

348 self.__buffer2 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

349 size, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

350 self.buffer_size, 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

351 forward=False) 
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

352 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

353 self.__buffer1 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

354 self.__buffer2.offsets[0], 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

355 self.buffer_size, 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

356 forward=False) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

357 self.__buffer = self.__buffer2 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

358 self.__rel_index = self.__buffer2.len 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

359 self.__lineno = None 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

360 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

361 def position(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

362 """ Return the current file position 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

363 
1818
df984fe11783
logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1646
diff
changeset

364 This can be converted into a String using backticks and then be rebuild. 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

365 For this plain file implementation position is an Integer. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

366 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

367 return self.__buffer.offsets[self.__rel_index] 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

368 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

369 def seek(self, position, line_no=None): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

370 """ moves file position to an value formerly gotten from .position(). 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

371 To enable line counting line_no must be provided. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

372 .seek is much more efficient for moving long distances than .peek. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

373 raises ValueError if position is invalid 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

374 """ 
1855
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

375 logging.log(self.loglevel, "LogFile.seek %s pos %d" % (self.__filename, position)) 
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

376 if self.__buffer1: 
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

377 logging.log(self.loglevel, "b1 %r %r" % (self.__buffer1.offsets[0], self.__buffer1.offsets[1])) 
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

378 if self.__buffer2: 
472566340cd8
logfile: more flexible logging
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1838
diff
changeset

379 logging.log(self.loglevel, "b2 %r %r" % (self.__buffer2.offsets[0], self.__buffer2.offsets[1])) 
1646
2fbb179f3518
use filepos in (not mtime of) editlog for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1317
diff
changeset

380 if self.__buffer1 and self.__buffer1.offsets[0] <= position < self.__buffer1.offsets[1]: 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

381 # position is in .__buffer1 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

382 self.__rel_index = self.__buffer1.offsets.index(position) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

383 self.__buffer = self.__buffer1 
1646
2fbb179f3518
use filepos in (not mtime of) editlog for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1317
diff
changeset

384 elif self.__buffer2 and self.__buffer2.offsets[0] <= position < self.__buffer2.offsets[1]: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

385 # position is in .__buffer2 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

386 self.__rel_index = self.__buffer2.offsets.index(position) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

387 self.__buffer = self.__buffer2 
1856
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

388 elif self.__buffer1 and self.__buffer1.offsets[1] == position: 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

389 # we already have one buffer directly before where we want to go 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

390 self.__buffer2 = LineBuffer(self._input, 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

391 position, 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

392 self.buffer_size) 
1856
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

393 self.__buffer = self.__buffer2 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

394 self.__rel_index = 0 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

395 elif self.__buffer2 and self.__buffer2.offsets[1] == position: 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

396 # we already have one buffer directly before where we want to go 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

397 self.__buffer1 = self.__buffer2 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

398 self.__buffer2 = LineBuffer(self._input, 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

399 position, 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

400 self.buffer_size) 
1856
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

401 self.__buffer = self.__buffer2 
72ef28ba79b1
logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
1855
diff
changeset

402 self.__rel_index = 0 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

403 else: 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

404 # load buffers around position 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

405 self.__buffer1 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

406 position, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

407 self.buffer_size, 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

408 forward=False) 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

409 self.__buffer2 = LineBuffer(self._input, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

410 position, 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

411 self.buffer_size) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

412 self.__buffer = self.__buffer2 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

413 self.__rel_index = 0 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

414 # XXX test for valid position 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

415 self.__lineno = line_no 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

416 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

417 def line_no(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

418 """@return: the current line number or None if line number is unknown""" 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

419 return self.__lineno 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

420 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

421 def calculate_line_no(self): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

422 """ Calculate the current line number from buffer offsets 
2286
01f05e74aa9c
Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2049
diff
changeset

423 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

424 If line number is unknown it is calculated by parsing the whole file. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

425 This may be expensive. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

426 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

427 self._input.seek(0, 0) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

428 lines = self._input.read(self.__buffer.offsets[self.__rel_index]) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

429 self.__lineno = len(lines.splitlines()) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

430 return self.__lineno 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

431 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

432 def parser(self, line): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

433 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

434 @param line: line as read from file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

435 @return: parsed line or None on error 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

436 Converts the line from file to program representation 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

437 This implementation uses TAB separated strings. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

438 This method should be overwritten by the sub classes. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

439 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

440 return line.split("\t") 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

441 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

442 def add(self, *data): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

443 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

444 add line to log file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

445 This implementation save the values as TAB separated strings. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

446 This method should be overwritten by the sub classes. 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

447 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

448 line = "\t".join(data) 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

449 self._add(line) 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

450 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

451 def _add(self, line): 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

452 """ 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

453 @param line: flat line 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

454 @type line: String 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

455 write on entry in the log file 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

456 """ 
1000
6f6fcbe200b5
whitespaceonly cleanup and minor style changes
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
749
diff
changeset

457 if line is not None: 
749
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

458 if line[1] != '\n': 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

459 line += '\n' 
3dba26fcfde0
moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
0
diff
changeset

460 self._output.write(line) 
2049
94af8c2afeb0
make logfile damage happen less often
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2044
diff
changeset

461 self._output.close() # does this maybe help against the sporadic fedora wikis 160 \0 bytes in the editlog? 
94af8c2afeb0
make logfile damage happen less often
Thomas Waldmann <tw AT waldmannedv DOT de>
parents:
2044
diff
changeset

462 del self._output # reopen the output file automagically 