s4-ldb: add a LDB_FLG_ENABLE_TRACING for full ldb tracing
[samba.git] / source4 / lib / ldb / common / ldb_debug.c
1 /* 
2    ldb database library
3
4    Copyright (C) Andrew Tridgell  2004
5
6      ** NOTE! The following LGPL license applies to the ldb
7      ** library. This does NOT imply that all of Samba is released
8      ** under the LGPL
9    
10    This library is free software; you can redistribute it and/or
11    modify it under the terms of the GNU Lesser General Public
12    License as published by the Free Software Foundation; either
13    version 3 of the License, or (at your option) any later version.
14
15    This library is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    Lesser General Public License for more details.
19
20    You should have received a copy of the GNU Lesser General Public
21    License along with this library; if not, see <http://www.gnu.org/licenses/>.
22 */
23
24 /*
25  *  Name: ldb
26  *
27  *  Component: ldb debug
28  *
29  *  Description: functions for printing debug messages
30  *
31  *  Author: Andrew Tridgell
32  */
33
34 #include "ldb_private.h"
35
36 /*
37   this allows the user to choose their own debug function
38 */
39 int ldb_set_debug(struct ldb_context *ldb,
40                   void (*debug)(void *context, enum ldb_debug_level level, 
41                                 const char *fmt, va_list ap),
42                   void *context)
43 {
44         ldb->debug_ops.debug = debug;
45         ldb->debug_ops.context = context;
46         return 0;
47 }
48
49 /*
50   debug function for ldb_set_debug_stderr
51 */
52 static void ldb_debug_stderr(void *context, enum ldb_debug_level level, 
53                              const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
54 static void ldb_debug_stderr(void *context, enum ldb_debug_level level, 
55                              const char *fmt, va_list ap)
56 {
57         if (level <= LDB_DEBUG_WARNING) {
58                 vfprintf(stderr, fmt, ap);
59                 fprintf(stderr, "\n");
60         }
61 }
62
63 static void ldb_debug_stderr_all(void *context, enum ldb_debug_level level, 
64                              const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
65 static void ldb_debug_stderr_all(void *context, enum ldb_debug_level level, 
66                              const char *fmt, va_list ap)
67 {
68         vfprintf(stderr, fmt, ap);
69         fprintf(stderr, "\n");
70 }
71
72 /*
73   convenience function to setup debug messages on stderr
74   messages of level LDB_DEBUG_WARNING and higher are printed
75 */
76 int ldb_set_debug_stderr(struct ldb_context *ldb)
77 {
78         return ldb_set_debug(ldb, ldb_debug_stderr, ldb);
79 }
80
81 /*
82   log a message
83 */
84 void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *fmt, ...)
85 {
86         va_list ap;
87         if (ldb->debug_ops.debug == NULL) {
88                 if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
89                         ldb_set_debug(ldb, ldb_debug_stderr_all, ldb);
90                 } else {
91                         ldb_set_debug_stderr(ldb);
92                 }
93         }
94         va_start(ap, fmt);
95         ldb->debug_ops.debug(ldb->debug_ops.context, level, fmt, ap);
96         va_end(ap);
97 }
98
99
100 /*
101   log a message, and set the ldb error string to the same message
102 */
103 void ldb_debug_set(struct ldb_context *ldb, enum ldb_debug_level level, 
104                    const char *fmt, ...)
105 {
106         va_list ap;
107         char *msg;
108         va_start(ap, fmt);
109         msg = talloc_vasprintf(ldb, fmt, ap);
110         va_end(ap);
111         if (msg != NULL) {
112                 ldb_set_errstring(ldb, msg);
113                 ldb_debug(ldb, level, "%s", msg);
114         }
115         talloc_free(msg);
116 }
117