r8734: fixed the wins server for the new ldb DN restrictions.
authorAndrew Tridgell <tridge@samba.org>
Sun, 24 Jul 2005 12:18:11 +0000 (12:18 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:29:59 +0000 (13:29 -0500)
This gets it working, but I'm rather worried about the speed. We used
to get more than 5000 ops/sec, but now we are down to around 15
ops/sec. I suspect a bug in ldb.
(This used to be commit 83727bf72c970effdc5995e2f6e7816a57887b5c)

source4/nbt_server/wins/winsdb.c

index 152338eca64d097f8eaa9daaf5086b9668802804..c46c4c571e4a6af680d5bb0bb93bae9247be1142 100644 (file)
@@ -83,6 +83,31 @@ static void winsdb_remove_version(struct wins_server *winssrv, uint64_t version)
        }
 }
 
+
+/*
+  return a DN for a nbt_name
+*/
+static char *winsdb_dn(TALLOC_CTX *mem_ctx, struct nbt_name *name)
+{
+       char *ret = talloc_asprintf(mem_ctx, "type=%02x", name->type);
+       if (ret == NULL) {
+               return ret;
+       }
+       if (name->name && *name->name) {
+               ret = talloc_asprintf_append(ret, ",name=%s", name->name);
+       }
+       if (ret == NULL) {
+               return ret;
+       }
+       if (name->scope && *name->scope) {
+               ret = talloc_asprintf_append(ret, ",scope=%s", name->scope);
+       }
+       if (ret == NULL) {
+               return ret;
+       }
+       return ret;
+}
+
 /*
   load a WINS entry from the database
 */
@@ -97,7 +122,7 @@ struct winsdb_record *winsdb_load(struct wins_server *winssrv,
        const char *expr;
        int i;
 
-       expr = talloc_asprintf(tmp_ctx, "dn=NAME=%s", nbt_name_string(tmp_ctx, name));
+       expr = talloc_asprintf(tmp_ctx, "dn=%s", winsdb_dn(tmp_ctx, name));
        if (expr == NULL) goto failed;
 
        /* find the record in the WINS database */
@@ -159,8 +184,9 @@ static struct ldb_message *winsdb_message(struct wins_server *winssrv,
        struct ldb_message *msg = ldb_msg_new(mem_ctx);
        if (msg == NULL) goto failed;
 
-       msg->dn = talloc_asprintf(msg, "NAME=%s", nbt_name_string(msg, rec->name));
+       msg->dn = winsdb_dn(msg, rec->name);
        if (msg->dn == NULL) goto failed;
+       ret |= ldb_msg_add_fmt(ldb, msg, "objectClass", "wins");
        ret |= ldb_msg_add_fmt(ldb, msg, "active", "%u", rec->state);
        ret |= ldb_msg_add_fmt(ldb, msg, "nbFlags", "0x%04x", rec->nb_flags);
        ret |= ldb_msg_add_string(ldb, msg, "registeredBy", rec->registered_by);
@@ -250,7 +276,7 @@ uint8_t winsdb_delete(struct wins_server *winssrv, struct winsdb_record *rec)
 
        winsdb_remove_version(winssrv, rec->version);
 
-       dn = talloc_asprintf(tmp_ctx, "NAME=%s", nbt_name_string(tmp_ctx, rec->name));
+       dn = winsdb_dn(tmp_ctx, rec->name);
        if (dn == NULL) goto failed;
 
        ret = ldb_delete(ldb, dn);