Den zuletzt implementierten Mechanismus entfernt, um $form-Variablen zu überwachen...
[kivitendo-erp.git] / SL / LXDebug.pm
1 package LXDebug;
2
3 use constant NONE   => 0;
4 use constant INFO   => 1;
5 use constant DEBUG1 => 2;
6 use constant DEBUG2 => 4;
7 use constant QUERY  => 8;
8 use constant TRACE  => 16;
9 use constant ALL    => 31;
10
11 use constant FILE_TARGET   => 0;
12 use constant STDERR_TARGET => 1;
13
14 use POSIX qw(strftime);
15
16 my $data_dumper_available;
17
18 our $global_level;
19 our $watch_form;
20
21 BEGIN {
22   eval("use Data::Dumper");
23   $data_dumper_available = $@ ? 0 : 1;
24
25   $global_level      = NONE;
26   $watch_form        = 0;
27 }
28
29 sub new {
30   my $type = shift;
31   my $self = {};
32
33   $self->{"calldepth"}  = 0;
34   $self->{"file"}       = "/tmp/lx-office-debug.log";
35   $self->{"target"}     = FILE_TARGET;
36   $self->{"level"}      = 0;
37
38   while ($_[0]) {
39     $self->{ $_[0] } = $_[1];
40     shift;
41     shift;
42   }
43
44   bless($self, $type);
45 }
46
47 sub set_target {
48   my ($self, $target, $file) = @_;
49
50   if ((FILE_TARGET == $target) && $file) {
51     $self->{"file"}   = $file;
52     $self->{"target"} = FILE_TARGET;
53
54   } elsif (STDERR_TARGET == $target) {
55     $self->{"target"} = STDERR_TARGET;
56   }
57 }
58
59 sub enter_sub {
60   my ($self, $level) = @_;
61   $level *= 1;
62
63   return 1 unless ($global_level & TRACE);          # ignore if traces aren't active
64   return 1 if $level && !($global_level & $level);  # ignore if level of trace isn't active
65
66   my ($package, $filename, $line, $subroutine) = caller(1);
67   my ($dummy1, $self_filename, $self_line) = caller(0);
68
69   my $indent = " " x $self->{"calldepth"}++;
70
71   if (!defined($package)) {
72     $self->_write('sub' . $level, $indent . "\\ top-level?\n");
73   } else {
74     $self->_write('sub' . $level, $indent
75                     . "\\ ${subroutine} in "
76                     . "${self_filename}:${self_line} called from "
77                     . "${filename}:${line}\n");
78   }
79   return 1;
80 }
81
82 sub leave_sub {
83   my ($self, $level) = @_;
84   $level *= 1;
85
86   return 1 unless ($global_level & TRACE);           # ignore if traces aren't active
87   return 1 if $level && !($global_level & $level);   # ignore if level of trace isn't active
88
89   my ($package, $filename, $line, $subroutine) = caller(1);
90   my ($dummy1, $self_filename, $self_line) = caller(0);
91
92   my $indent = " " x --$self->{"calldepth"};
93
94   if (!defined($package)) {
95     $self->_write('sub' . $level, $indent . "/ top-level?\n");
96   } else {
97     $self->_write('sub' . $level, $indent . "/ ${subroutine} in " . "${self_filename}:${self_line}\n");
98   }
99   return 1;
100 }
101
102 sub message {
103   my ($self, $level, $message) = @_;
104
105   $self->_write(level2string($level), $message) if (($self->{"level"} | $global_level) & $level || !$level);
106 }
107
108 sub dump {
109   my ($self, $level, $name, $variable) = @_;
110
111   if ($data_dumper_available) {
112     $self->message($level, "dumping ${name}:\n" . Dumper($variable));
113   } else {
114     $self->message($level,
115                    "dumping ${name}: Data::Dumper not available; "
116                      . "variable cannot be dumped");
117   }
118 }
119
120 sub enable_sub_tracing {
121   my ($self) = @_;
122   $self->{level} | TRACE;
123 }
124
125 sub disable_sub_tracing {
126   my ($self) = @_;
127   $self->{level} & ~ TRACE;
128 }
129
130 sub _write {
131   my ($self, $prefix, $message) = @_;
132   my $date = strftime("%Y-%m-%d %H:%M:%S $$ ${prefix}: ", localtime(time()));
133   local *FILE;
134
135   chomp($message);
136
137   if ((FILE_TARGET == $self->{"target"})
138       && open(FILE, ">>" . $self->{"file"})) {
139     print(FILE "${date}${message}\n");
140     close(FILE);
141
142   } elsif (STDERR_TARGET == $self->{"target"}) {
143     print(STDERR "${date}${message}\n");
144   }
145 }
146
147 sub level2string {
148   # use $_[0] as a bit mask and return levelstrings separated by /
149   join '/', qw(info debug1 debug2 query trace)[ grep { (reverse split //, sprintf "%05b", $_[0])[$_] } 0..4 ]
150 }
151
152 1;