~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/lib/ldb/tools/ldbadd.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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: ldbadd
 
28
 *
 
29
 *  Description: utility to add records - modelled on ldapadd
 
30
 *
 
31
 *  Author: Andrew Tridgell
 
32
 */
 
33
 
 
34
#include "ldb.h"
 
35
#include "tools/cmdline.h"
 
36
 
 
37
static int failures;
 
38
 
 
39
static void usage(void)
 
40
{
 
41
        printf("Usage: ldbadd <options> <ldif...>\n");
 
42
        printf("Options:\n");
 
43
        printf("  -H ldb_url       choose the database (or $LDB_URL)\n");
 
44
        printf("  -o options       pass options like modules to activate\n");
 
45
        printf("              e.g: -o modules:timestamps\n");
 
46
        printf("\n");
 
47
        printf("Adds records to a ldb, reading ldif the specified list of files\n\n");
 
48
        exit(1);
 
49
}
 
50
 
 
51
 
 
52
/*
 
53
  add records from an opened file
 
54
*/
 
55
static int process_file(struct ldb_context *ldb, FILE *f, int *count)
 
56
{
 
57
        struct ldb_ldif *ldif;
 
58
        int ret = LDB_SUCCESS;
 
59
 
 
60
        while ((ldif = ldb_ldif_read_file(ldb, f))) {
 
61
                if (ldif->changetype != LDB_CHANGETYPE_ADD &&
 
62
                    ldif->changetype != LDB_CHANGETYPE_NONE) {
 
63
                        fprintf(stderr, "Only CHANGETYPE_ADD records allowed\n");
 
64
                        break;
 
65
                }
 
66
 
 
67
                ldif->msg = ldb_msg_canonicalize(ldb, ldif->msg);
 
68
 
 
69
                ret = ldb_add(ldb, ldif->msg);
 
70
                if (ret != LDB_SUCCESS) {
 
71
                        fprintf(stderr, "ERR: \"%s\" on DN %s\n", 
 
72
                                ldb_errstring(ldb), ldb_dn_get_linearized(ldif->msg->dn));
 
73
                        failures++;
 
74
                } else {
 
75
                        (*count)++;
 
76
                }
 
77
                ldb_ldif_read_free(ldb, ldif);
 
78
        }
 
79
 
 
80
        return ret;
 
81
}
 
82
 
 
83
 
 
84
 
 
85
int main(int argc, const char **argv)
 
86
{
 
87
        struct ldb_context *ldb;
 
88
        int i, ret=0, count=0;
 
89
        struct ldb_cmdline *options;
 
90
 
 
91
        ldb = ldb_init(NULL, NULL);
 
92
 
 
93
        options = ldb_cmdline_process(ldb, argc, argv, usage);
 
94
 
 
95
        if (ldb_transaction_start(ldb) != 0) {
 
96
                printf("Failed to start transaction: %s\n", ldb_errstring(ldb));
 
97
                exit(1);
 
98
        }
 
99
 
 
100
        if (options->argc == 0) {
 
101
                ret = process_file(ldb, stdin, &count);
 
102
        } else {
 
103
                for (i=0;i<options->argc;i++) {
 
104
                        const char *fname = options->argv[i];
 
105
                        FILE *f;
 
106
                        f = fopen(fname, "r");
 
107
                        if (!f) {
 
108
                                perror(fname);
 
109
                                exit(1);
 
110
                        }
 
111
                        ret = process_file(ldb, f, &count);
 
112
                        fclose(f);
 
113
                }
 
114
        }
 
115
 
 
116
        if (count != 0 && ldb_transaction_commit(ldb) != 0) {
 
117
                printf("Failed to commit transaction: %s\n", ldb_errstring(ldb));
 
118
                exit(1);
 
119
        }
 
120
 
 
121
        talloc_free(ldb);
 
122
 
 
123
        printf("Added %d records with %d failures\n", count, failures);
 
124
        
 
125
        return ret;
 
126
}