From 5512332cdb87a0ae503f916a499bef90ca8d74dc Mon Sep 17 00:00:00 2001 From: Jean-François Micouleau Date: Mon, 9 Jul 2001 18:19:04 +0000 Subject: split the nt_drivers.tdb in 3 separate tdb files. Should speed-up lookups J.F. (This used to be commit c08e22713ea4ddbc4951dc8dcc40609eb0039ddb) --- source3/printing/nt_printing.c | 146 ++++++++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 32 deletions(-) (limited to 'source3/printing') diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index d742773d27..bd1ab085f7 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -26,13 +26,21 @@ extern int DEBUGLEVEL; extern pstring global_myname; extern DOM_SID global_sid_World; -static TDB_CONTEXT *tdb; /* used for driver files */ +/*static TDB_CONTEXT *tdb; *//* used for driver files */ + +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 */ #define FORMS_PREFIX "FORMS/" #define DRIVERS_PREFIX "DRIVERS/" #define PRINTERS_PREFIX "PRINTERS/" +#define SECDESC_PREFIX "SECDESC/" + +#define NTDRIVERS_DATABASE_VERSION_1 1 +#define NTDRIVERS_DATABASE_VERSION_2 2 -#define NTDRIVERS_DATABASE_VERSION 1 +#define NTDRIVERS_DATABASE_VERSION NTDRIVERS_DATABASE_VERSION_2 /* Map generic permissions to printer object specific permissions */ @@ -170,6 +178,46 @@ static nt_forms_struct default_forms[] = { {"PRC Envelope #10 Rotated",0x1,0x6fd10,0x4f1a0,0x0,0x0,0x6fd10,0x4f1a0} }; +static void upgrade_to_version_2(void) +{ + TDB_DATA kbuf, newkey, dbuf; + nt_forms_struct form; + int ret; + int i; + int n = 0; + + DEBUG(0,("upgrade_to_version_2:upgrading to version 2\n")); + + for (kbuf = tdb_firstkey(tdb_drivers); + kbuf.dptr; + newkey = tdb_nextkey(tdb_drivers, kbuf), safe_free(kbuf.dptr), kbuf=newkey) { + dbuf = tdb_fetch(tdb_drivers, kbuf); + + if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) { + DEBUG(0,("upgrade_to_version_2:moving form\n")); + if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) break; + tdb_delete(tdb_drivers, kbuf); + } + + if (strncmp(kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) { + DEBUG(0,("upgrade_to_version_2:moving printer\n")); + if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) break; + tdb_delete(tdb_drivers, kbuf); + } + + if (strncmp(kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) { + DEBUG(0,("upgrade_to_version_2:moving secdesc\n")); + if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) break; + tdb_delete(tdb_drivers, kbuf); + } + + safe_free(dbuf.dptr); + } + + + +} + /**************************************************************************** open the NT printing tdb @@ -179,24 +227,58 @@ BOOL nt_printing_init(void) static pid_t local_pid; char *vstring = "INFO/version"; - if (tdb && local_pid == sys_getpid()) return True; - tdb = tdb_open_log(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); - if (!tdb) { + fstring *list=NULL; + int count; + int i; + + if (tdb_drivers && tdb_printers && tdb_forms && local_pid == sys_getpid()) return True; + + tdb_drivers = tdb_open_log(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); + if (!tdb_drivers) { DEBUG(0,("Failed to open nt drivers database %s (%s)\n", lock_path("ntdrivers.tdb"), strerror(errno) )); return False; } + tdb_printers = tdb_open_log(lock_path("ntprinters.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); + if (!tdb_printers) { + DEBUG(0,("Failed to open nt printers database %s (%s)\n", + lock_path("ntprinters.tdb"), strerror(errno) )); + return False; + } + + tdb_forms = tdb_open_log(lock_path("ntforms.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); + if (!tdb_forms) { + DEBUG(0,("Failed to open nt forms database %s (%s)\n", + lock_path("ntforms.tdb"), strerror(errno) )); + return False; + } + local_pid = sys_getpid(); /* handle a Samba upgrade */ - tdb_lock_bystring(tdb, vstring); - if (tdb_fetch_int(tdb, vstring) != NTDRIVERS_DATABASE_VERSION) { - tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL); - tdb_store_int(tdb, vstring, NTDRIVERS_DATABASE_VERSION); + tdb_lock_bystring(tdb_drivers, vstring); + if (tdb_fetch_int(tdb_drivers, vstring) != NTDRIVERS_DATABASE_VERSION) { + + if (tdb_fetch_int(tdb_drivers, vstring) == NTDRIVERS_DATABASE_VERSION_1) + upgrade_to_version_2(); + else + tdb_traverse(tdb_drivers, (tdb_traverse_func)tdb_delete, NULL); + + tdb_store_int(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION); } - tdb_unlock_bystring(tdb, vstring); + tdb_unlock_bystring(tdb_drivers, vstring); +/* + tdb_create_index(tdb, "DRIVERS/"); + + tdb_lookup_index(tdb, "DRIVERS/", &list, &count); + + DEBUG(0,("nt_printing_init: got %d drivers\n", count)); + + for (i=0;i