r9391: Convert all the code to use struct ldb_dn to ohandle ldap like distinguished...
[kamenim/samba.git] / source4 / lib / ldb / tools / ldbdel.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 2 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, write to the Free Software
22    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25 /*
26  *  Name: ldb
27  *
28  *  Component: ldbdel
29  *
30  *  Description: utility to delete records - modelled on ldapdelete
31  *
32  *  Author: Andrew Tridgell
33  */
34
35 #include "includes.h"
36 #include "ldb/include/ldb.h"
37 #include "ldb/include/ldb_private.h"
38 #include "ldb/tools/cmdline.h"
39
40 #ifdef _SAMBA_BUILD_
41 #include "system/filesys.h"
42 #endif
43
44 static int ldb_delete_recursive(struct ldb_context *ldb, const struct ldb_dn *dn)
45 {
46         int ret, i, total=0;
47         const char *attrs[] = { "dn", NULL };
48         struct ldb_message **res;
49         
50         ret = ldb_search(ldb, dn, LDB_SCOPE_SUBTREE, "dn=*", attrs, &res);
51         if (ret <= 0) return -1;
52
53         for (i=0;i<ret;i++) {
54                 if (ldb_delete(ldb, res[i]->dn) == 0) {
55                         total++;
56                 }
57         }
58
59         talloc_free(res);
60
61         if (total == 0) {
62                 return -1;
63         }
64         printf("Deleted %d records\n", total);
65         return 0;
66 }
67
68 static void usage(void)
69 {
70         printf("Usage: ldbdel <options> <DN...>\n");
71         printf("Options:\n");
72         printf("  -r               recursively delete the given subtree\n");
73         printf("  -H ldb_url       choose the database (or $LDB_URL)\n");
74         printf("  -o options       pass options like modules to activate\n");
75         printf("              e.g: -o modules:timestamps\n");
76         printf("\n");
77         printf("Deletes records from a ldb\n\n");
78         exit(1);
79 }
80
81  int main(int argc, const char **argv)
82 {
83         struct ldb_context *ldb;
84         int ret, i;
85         struct ldb_cmdline *options;
86
87         ldb = ldb_init(NULL);
88
89         options = ldb_cmdline_process(ldb, argc, argv, usage);
90
91         if (options->argc < 1) {
92                 usage();
93                 exit(1);
94         }
95
96         for (i=0;i<options->argc;i++) {
97                 const struct ldb_dn *dn;
98
99                 dn = ldb_dn_explode(ldb, options->argv[i]);
100                 if (dn == NULL) {
101                         printf("Invalid DN format\n");
102                         exit(1);
103                 }
104                 if (options->recursive) {
105                         ret = ldb_delete_recursive(ldb, dn);
106                 } else {
107                         ret = ldb_delete(ldb, dn);
108                         if (ret == 0) {
109                                 printf("Deleted 1 record\n");
110                         }
111                 }
112                 if (ret != 0) {
113                         printf("delete of '%s' failed - %s\n",
114                                 ldb_dn_linearize(ldb, dn),
115                                 ldb_errstring(ldb));
116                 }
117         }
118
119         talloc_free(ldb);
120
121         return 0;
122 }