source3/printing/nt_printing_tdb: convert to dbwrap.
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 21 Jun 2012 13:16:56 +0000 (22:46 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 21 Jun 2012 13:16:56 +0000 (22:46 +0930)
I removed the version 3 upgrade: I didn't want to change it to a
traverse without testing, and dbwrap doesn't support firstkey/nextkey
traversal.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
source3/printing/nt_printing_tdb.c

index 028dc0b1da9321844c1f4c34ad0fffa81bd1c0de..64e5c6eb007dd9c12e34a64a063bbbbe37e6f260 100644 (file)
@@ -27,6 +27,8 @@
 #include "librpc/gen_ndr/ndr_security.h"
 #include "libcli/security/security.h"
 #include "util_tdb.h"
+#include "dbwrap/dbwrap.h"
+#include "dbwrap/dbwrap_open.h"
 
 #define FORMS_PREFIX "FORMS/"
 #define DRIVERS_PREFIX "DRIVERS/"
@@ -39,9 +41,9 @@
 #define NTDRIVERS_DATABASE_VERSION_4 4 /* fix generic bits in security descriptors */
 #define NTDRIVERS_DATABASE_VERSION_5 5 /* normalize keys in ntprinters.tdb */
 
-static TDB_CONTEXT *tdb_forms; /* used for forms files */
-static TDB_CONTEXT *tdb_drivers; /* used for driver files */
-static TDB_CONTEXT *tdb_printers; /* used for printers files */
+static struct db_context *db_forms; /* used for forms files */
+static struct db_context *db_drivers; /* used for driver files */
+static struct db_context *db_printers; /* used for printers files */
 
 /****************************************************************************
  generate a new TDB_DATA key for storing a printer
@@ -88,61 +90,8 @@ static TDB_DATA make_printers_secdesc_tdbkey(TALLOC_CTX *ctx,
 
 static bool upgrade_to_version_3(void)
 {
-       TDB_DATA kbuf, dbuf;
-
        DEBUG(0,("upgrade_to_version_3: upgrading print tdb's to version 3\n"));
-
-       for (kbuf = tdb_firstkey_compat(tdb_drivers); kbuf.dptr;
-                       kbuf = tdb_nextkey_compat(tdb_drivers, kbuf)) {
-
-               dbuf = tdb_fetch_compat(tdb_drivers, kbuf);
-
-               if (strncmp((const char *)kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) {
-                       DEBUG(0,("upgrade_to_version_3:moving form\n"));
-                       if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to move form. Error (%s).\n", tdb_errorstr_compat(tdb_forms)));
-                               return False;
-                       }
-                       if (tdb_delete(tdb_drivers, kbuf) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to delete form. Error (%s)\n", tdb_errorstr_compat(tdb_drivers)));
-                               return False;
-                       }
-               }
-
-               if (strncmp((const char *)kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
-                       DEBUG(0,("upgrade_to_version_3:moving printer\n"));
-                       if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to move printer. Error (%s)\n", tdb_errorstr_compat(tdb_printers)));
-                               return False;
-                       }
-                       if (tdb_delete(tdb_drivers, kbuf) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to delete printer. Error (%s)\n", tdb_errorstr_compat(tdb_drivers)));
-                               return False;
-                       }
-               }
-
-               if (strncmp((const char *)kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) {
-                       DEBUG(0,("upgrade_to_version_3:moving secdesc\n"));
-                       if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to move secdesc. Error (%s)\n", tdb_errorstr_compat(tdb_printers)));
-                               return False;
-                       }
-                       if (tdb_delete(tdb_drivers, kbuf) != 0) {
-                               SAFE_FREE(dbuf.dptr);
-                               DEBUG(0,("upgrade_to_version_3: failed to delete secdesc. Error (%s)\n", tdb_errorstr_compat(tdb_drivers)));
-                               return False;
-                       }
-               }
-
-               SAFE_FREE(dbuf.dptr);
-       }
-
-       return True;
+       return False;
 }
 
 /*******************************************************************
@@ -153,16 +102,19 @@ static bool upgrade_to_version_3(void)
  host using printmig.exe will not be accessible.
 *******************************************************************/
 
-static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
-                            TDB_DATA data, void *state )
+static int sec_desc_upg_fn(struct db_record *rec, void *state )
 {
        NTSTATUS status;
        struct sec_desc_buf *sd_orig = NULL;
        struct sec_desc_buf *sd_new, *sd_store;
        struct security_descriptor *sec, *new_sec;
        TALLOC_CTX *ctx = state;
-       int result, i;
+       int i;
        size_t size_new_sec;
+       TDB_DATA key, data;
+
+       key = dbwrap_record_get_key(rec);
+       data = dbwrap_record_get_value(rec);
 
        if (!data.dptr || data.dsize == 0) {
                return 0;
@@ -179,7 +131,7 @@ static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
                /* delete bad entries */
                DEBUG(0,("sec_desc_upg_fn: Failed to parse original sec_desc for %si.  Deleting....\n",
                        (const char *)key.dptr ));
-               tdb_delete( tdb_printers, key );
+               dbwrap_delete(db_printers, key);
                return 0;
        }
 
@@ -241,11 +193,10 @@ static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
                return 0;
        }
 
-       result = tdb_store( tdb_printers, key, data, TDB_REPLACE );
+       status = dbwrap_store(db_printers, key, data, TDB_REPLACE);
 
        /* 0 to continue and non-zero to stop traversal */
-
-       return (result != 0);
+       return !NT_STATUS_IS_OK(status);
 }
 
 /*******************************************************************
@@ -255,18 +206,18 @@ static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
 static bool upgrade_to_version_4(void)
 {
        TALLOC_CTX *ctx;
-       int result;
+       NTSTATUS status;
 
        DEBUG(0,("upgrade_to_version_4: upgrading printer security descriptors\n"));
 
        if ( !(ctx = talloc_init( "upgrade_to_version_4" )) )
                return False;
 
-       result = tdb_traverse( tdb_printers, sec_desc_upg_fn, ctx );
+       status = dbwrap_traverse( db_printers, sec_desc_upg_fn, ctx, NULL );
 
        talloc_destroy( ctx );
 
-       return ( result >= 0 );
+       return NT_STATUS_IS_OK(status);
 }
 
 /*******************************************************************
@@ -277,11 +228,13 @@ static bool upgrade_to_version_4(void)
  host using printmig.exe will not be accessible.
 *******************************************************************/
 
-static int normalize_printers_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
-                                  TDB_DATA data, void *state )
+static int normalize_printers_fn(struct db_record *rec, void *state )
 {
        TALLOC_CTX *ctx = talloc_tos();
-       TDB_DATA new_key;
+       TDB_DATA key, data, new_key;
+
+       key = dbwrap_record_get_key(rec);
+       data = dbwrap_record_get_value(rec);
 
        if (!data.dptr || data.dsize == 0)
                return 0;
@@ -301,13 +254,14 @@ static int normalize_printers_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
 
        /* delete the original record and store under the normalized key */
 
-       if ( tdb_delete( the_tdb, key ) != 0 ) {
+       if (!NT_STATUS_IS_OK(dbwrap_record_delete(rec))) {
                DEBUG(0,("normalize_printers_fn: tdb_delete for [%s] failed!\n",
                        key.dptr));
                return 1;
        }
 
-       if ( tdb_store( the_tdb, new_key, data, TDB_REPLACE) != 0 ) {
+       if (!NT_STATUS_IS_OK(dbwrap_store(dbwrap_record_get_db(rec),
+                                         new_key, data, TDB_REPLACE))) {
                DEBUG(0,("normalize_printers_fn: failed to store new record for [%s]!\n",
                        key.dptr));
                return 1;
@@ -317,24 +271,25 @@ static int normalize_printers_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,
 }
 
 /*******************************************************************
- Upgrade the tdb files to version 5
+ Upgrade the db files to version 5
 *******************************************************************/
 
 static bool upgrade_to_version_5(void)
 {
        TALLOC_CTX *ctx;
-       int result;
+       NTSTATUS status;
 
        DEBUG(0,("upgrade_to_version_5: normalizing printer keys\n"));
 
        if ( !(ctx = talloc_init( "upgrade_to_version_5" )) )
                return False;
 
-       result = tdb_traverse( tdb_printers, normalize_printers_fn, NULL );
+       status = dbwrap_traverse(db_printers, normalize_printers_fn, NULL,
+                                NULL);
 
        talloc_destroy( ctx );
 
-       return ( result >= 0 );
+       return NT_STATUS_IS_OK(status);
 }
 
 bool nt_printing_tdb_upgrade(void)
@@ -352,36 +307,39 @@ bool nt_printing_tdb_upgrade(void)
                return true;
        }
 
-       tdb_drivers = tdb_open_log(drivers_path,
-                                  0,
-                                  TDB_DEFAULT,
-                                  O_RDWR|O_CREAT,
-                                  0600);
-       if (tdb_drivers == NULL) {
+       db_drivers = db_s3open(NULL,
+                              drivers_path,
+                              0,
+                              TDB_DEFAULT,
+                              O_RDWR|O_CREAT,
+                              0600);
+       if (db_drivers == NULL) {
                DEBUG(0,("nt_printing_init: Failed to open nt drivers "
                         "database %s (%s)\n",
                         drivers_path, strerror(errno)));
                return false;
        }
 
-       tdb_printers = tdb_open_log(printers_path,
-                                   0,
-                                   TDB_DEFAULT,
-                                   O_RDWR|O_CREAT,
-                                   0600);
-       if (tdb_printers == NULL) {
+       db_printers = db_s3open(NULL,
+                               printers_path,
+                               0,
+                               TDB_DEFAULT,
+                               O_RDWR|O_CREAT,
+                               0600);
+       if (db_printers == NULL) {
                DEBUG(0,("nt_printing_init: Failed to open nt printers "
                         "database %s (%s)\n",
                         printers_path, strerror(errno)));
                return false;
        }
 
-       tdb_forms = tdb_open_log(forms_path,
-                                0,
-                                TDB_DEFAULT,
-                                O_RDWR|O_CREAT,
-                                0600);
-       if (tdb_forms == NULL) {
+       db_forms = db_s3open(NULL,
+                            forms_path,
+                            0,
+                            TDB_DEFAULT,
+                            O_RDWR|O_CREAT,
+                            0600);
+       if (db_forms == NULL) {
                DEBUG(0,("nt_printing_init: Failed to open nt forms "
                         "database %s (%s)\n",
                         forms_path, strerror(errno)));
@@ -389,10 +347,11 @@ bool nt_printing_tdb_upgrade(void)
        }
 
        /* Samba upgrade */
-       vers_id = tdb_fetch_int32(tdb_drivers, vstring);
-       if (vers_id == -1) {
+       if (!NT_STATUS_IS_OK(dbwrap_fetch_int32_bystring(db_drivers, vstring,
+                                                        &vers_id))) {
                DEBUG(10, ("Fresh database\n"));
-               tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_5);
+               dbwrap_store_int32_bystring(db_drivers, vstring,
+                                           NTDRIVERS_DATABASE_VERSION_5);
                vers_id = NTDRIVERS_DATABASE_VERSION_5;
        }
 
@@ -403,7 +362,8 @@ bool nt_printing_tdb_upgrade(void)
                                return false;
                        }
 
-                       tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_3);
+                       dbwrap_store_int32_bystring(db_drivers, vstring,
+                                                   NTDRIVERS_DATABASE_VERSION_3);
                        vers_id = NTDRIVERS_DATABASE_VERSION_3;
                }
 
@@ -414,7 +374,8 @@ bool nt_printing_tdb_upgrade(void)
                         * code. Save as le. The only upgrade between V2 and V3
                         * is to save the version in little-endian.
                         */
-                       tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_3);
+                       dbwrap_store_int32_bystring(db_drivers, vstring,
+                                                   NTDRIVERS_DATABASE_VERSION_3);
                        vers_id = NTDRIVERS_DATABASE_VERSION_3;
                }
 
@@ -422,7 +383,8 @@ bool nt_printing_tdb_upgrade(void)
                        if (!upgrade_to_version_4()) {
                                return false;
                        }
-                       tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_4);
+                       dbwrap_store_int32_bystring(db_drivers, vstring,
+                                                   NTDRIVERS_DATABASE_VERSION_4);
                        vers_id = NTDRIVERS_DATABASE_VERSION_4;
                }
 
@@ -430,7 +392,8 @@ bool nt_printing_tdb_upgrade(void)
                        if (!upgrade_to_version_5()) {
                                return false;
                        }
-                       tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_5);
+                       dbwrap_store_int32_bystring(db_drivers, vstring,
+                                                   NTDRIVERS_DATABASE_VERSION_5);
                        vers_id = NTDRIVERS_DATABASE_VERSION_5;
                }
 
@@ -440,20 +403,9 @@ bool nt_printing_tdb_upgrade(void)
                }
        }
 
-       if (tdb_drivers) {
-               tdb_close(tdb_drivers);
-               tdb_drivers = NULL;
-       }
-
-       if (tdb_printers) {
-               tdb_close(tdb_printers);
-               tdb_printers = NULL;
-       }
-
-       if (tdb_forms) {
-               tdb_close(tdb_forms);
-               tdb_forms = NULL;
-       }
+       TALLOC_FREE(db_drivers);
+       TALLOC_FREE(db_printers);
+       TALLOC_FREE(db_forms);
 
        return true;
 }