2004-04-03 16:29:21 +04:00
/*
ldb database library
Copyright ( C ) Andrew Tridgell 2004
* * NOTE ! The following LGPL license applies to the ldb
* * library . This does NOT imply that all of Samba is released
* * under the LGPL
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 2 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
/*
* Name : ldb
*
* Component : ldbmodify
*
* Description : utility to modify records - modelled on ldapmodify
*
* Author : Andrew Tridgell
*/
# include "includes.h"
2004-04-11 00:18:22 +04:00
static int failures ;
2004-04-03 16:29:21 +04:00
2004-04-11 00:18:22 +04:00
static void usage ( void )
{
printf ( " Usage: ldbmodify <options> <ldif...> \n " ) ;
printf ( " Options: \n " ) ;
printf ( " -H ldb_url choose the database (or $LDB_URL) \n " ) ;
printf ( " \n " ) ;
printf ( " Modifies a ldb based upon ldif change records \n \n " ) ;
exit ( 1 ) ;
}
2004-04-03 16:29:21 +04:00
2004-04-11 00:18:22 +04:00
/*
process modifies for one file
*/
static int process_file ( struct ldb_context * ldb , FILE * f )
{
struct ldb_ldif * ldif ;
2004-05-02 09:16:15 +04:00
int ret = - 1 , count = 0 ;
2004-04-11 00:18:22 +04:00
2004-05-06 08:40:15 +04:00
while ( ( ldif = ldif_read_file ( ldb , f ) ) ) {
2004-04-03 16:29:21 +04:00
switch ( ldif - > changetype ) {
case LDB_CHANGETYPE_NONE :
case LDB_CHANGETYPE_ADD :
ret = ldb_add ( ldb , & ldif - > msg ) ;
break ;
case LDB_CHANGETYPE_DELETE :
ret = ldb_delete ( ldb , ldif - > msg . dn ) ;
break ;
case LDB_CHANGETYPE_MODIFY :
ret = ldb_modify ( ldb , & ldif - > msg ) ;
break ;
}
if ( ret ! = 0 ) {
fprintf ( stderr , " ERR: \" %s \" on DN %s \n " ,
ldb_errstring ( ldb ) , ldif - > msg . dn ) ;
failures + + ;
} else {
count + + ;
}
2004-05-06 08:40:15 +04:00
ldif_read_free ( ldb , ldif ) ;
2004-04-03 16:29:21 +04:00
}
2004-04-11 00:18:22 +04:00
return count ;
}
int main ( int argc , char * const argv [ ] )
{
struct ldb_context * ldb ;
int count = 0 ;
const char * ldb_url ;
int opt , i ;
ldb_url = getenv ( " LDB_URL " ) ;
while ( ( opt = getopt ( argc , argv , " hH: " ) ) ! = EOF ) {
switch ( opt ) {
case ' H ' :
ldb_url = optarg ;
break ;
case ' h ' :
default :
usage ( ) ;
break ;
}
}
if ( ! ldb_url ) {
2004-04-11 05:27:33 +04:00
fprintf ( stderr , " You must specify a ldb URL \n \n " ) ;
usage ( ) ;
2004-04-11 00:18:22 +04:00
}
argc - = optind ;
argv + = optind ;
ldb = ldb_connect ( ldb_url , 0 , NULL ) ;
if ( ! ldb ) {
perror ( " ldb_connect " ) ;
exit ( 1 ) ;
}
2004-05-06 13:55:05 +04:00
ldb_set_debug_stderr ( ldb ) ;
2004-04-11 00:18:22 +04:00
if ( argc = = 0 ) {
usage ( ) ;
exit ( 1 ) ;
}
for ( i = 0 ; i < argc ; i + + ) {
FILE * f ;
if ( strcmp ( argv [ i ] , " - " ) = = 0 ) {
f = stdin ;
} else {
f = fopen ( argv [ i ] , " r " ) ;
}
if ( ! f ) {
perror ( argv [ i ] ) ;
exit ( 1 ) ;
}
count + = process_file ( ldb , f ) ;
if ( f ! = stdin ) {
fclose ( f ) ;
}
}
2004-04-03 16:29:21 +04:00
ldb_close ( ldb ) ;
printf ( " Modified %d records with %d failures \n " , count , failures ) ;
2004-05-08 03:54:41 +04:00
if ( failures ! = 0 ) {
return - 1 ;
}
2004-04-03 16:29:21 +04:00
return 0 ;
}