summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/generation.c
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /ldap/servers/slapd/generation.c
downloadds-ldapserver7x.tar.gz
ds-ldapserver7x.tar.xz
ds-ldapserver7x.zip
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'ldap/servers/slapd/generation.c')
-rw-r--r--ldap/servers/slapd/generation.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/ldap/servers/slapd/generation.c b/ldap/servers/slapd/generation.c
new file mode 100644
index 00000000..24988493
--- /dev/null
+++ b/ldap/servers/slapd/generation.c
@@ -0,0 +1,140 @@
+/** BEGIN COPYRIGHT BLOCK
+ * Copyright 2001 Sun Microsystems, Inc.
+ * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
+ * All rights reserved.
+ * END COPYRIGHT BLOCK **/
+
+#include <stdio.h>
+#include <time.h>
+
+#include "rwlock.h"
+#include "slap.h"
+
+/*
+ * Create a new data version string.
+ */
+static const char *
+new_dataversion()
+{
+ struct tm t;
+ char* dataversion;
+ time_t curtime= current_time();
+#ifdef _WIN32
+ memcpy (&t, gmtime (&curtime), sizeof(t));
+#else
+ gmtime_r (&curtime, &t);
+#endif
+ dataversion = slapi_ch_malloc(16);
+ sprintf (dataversion, "0%.4li%.2i%.2i%.2i%.2i%.2i", 1900L + t.tm_year, 1 + t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
+ return dataversion;
+}
+
+/* ---------------- Database Data Version ---------------- */
+
+/*
+ * Return the generation ID for the database whose mapping tree node is "dn"
+ */
+char *
+get_database_dataversion(const char *dn)
+{
+ char *dataversion= NULL;
+ int r;
+ Slapi_PBlock *resultpb= NULL;
+ Slapi_Entry** entry = NULL;
+ resultpb= slapi_search_internal( dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, NULL, 1);
+ slapi_pblock_get( resultpb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entry );
+ slapi_pblock_get( resultpb, SLAPI_PLUGIN_INTOP_RESULT, &r );
+ if(r==LDAP_SUCCESS && entry!=NULL && entry[0]!=NULL)
+ {
+ dataversion= slapi_entry_attr_get_charptr( entry[0], "nsslapd-dataversion"); /* JCMREPL - Shouldn't be a Netscape specific attribute name */
+ }
+ slapi_free_search_results_internal(resultpb);
+ slapi_pblock_destroy(resultpb);
+ return dataversion;
+}
+
+void
+set_database_dataversion(const char *dn, const char *dataversion)
+{
+ LDAPMod gen_mod;
+ LDAPMod *mods[2];
+ struct berval* gen_vals[2];
+ struct berval gen_val;
+ Slapi_PBlock *pb;
+
+ memset (&gen_mod, 0, sizeof(gen_mod));
+
+ gen_mod.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;
+ gen_mod.mod_type = "nsslapd-dataversion"; /* JCMREPL - Shouldn't be a Netscape specific attribute name */
+ gen_mod.mod_bvalues = gen_vals;
+ gen_vals[0] = &gen_val;
+ gen_vals[1] = NULL;
+ gen_val.bv_val = (char *)dataversion;
+ gen_val.bv_len = strlen (gen_val.bv_val);
+ mods[0] = &gen_mod;
+ mods[1] = NULL;
+
+ pb = slapi_modify_internal (dn, mods, 0, 0 /* !log_change */);
+ if (NULL != pb)
+ {
+ Slapi_Entry *e;
+ slapi_pblock_get (pb, SLAPI_ENTRY_PRE_OP, &e);
+ slapi_entry_free(e);
+ }
+ slapi_pblock_destroy(pb);
+}
+
+/* ---------------- Server Data Version ---------------- */
+
+static char *server_dataversion_id= NULL;
+
+const char *
+get_server_dataversion()
+{
+ lenstr *l = NULL;
+ Slapi_Backend *be;
+ char *cookie;
+
+ /* we already cached the copy - just return it */
+ if(server_dataversion_id!=NULL)
+ {
+ return server_dataversion_id;
+ }
+
+ l= lenstr_new();
+
+ /* Loop over the backends collecting the backend data versions */
+ /* Combine them into a single blob */
+ be = slapi_get_first_backend(&cookie);
+ while ( be )
+ {
+ /* Don't generate dataversion for remote entries */
+ if((!be->be_private) && !(slapi_be_is_flag_set(be,SLAPI_BE_FLAG_REMOTE_DATA)))
+ {
+ const char * dataversion;
+ Slapi_DN be_configdn;
+ slapi_sdn_init(&be_configdn);
+ (void)be_getconfigdn(be, &be_configdn);
+ dataversion= get_database_dataversion(slapi_sdn_get_ndn(&be_configdn));
+ if(dataversion==NULL)
+ {
+ /* The database either doesn't support the storage of a dataverion, */
+ /* or has just been created, or has been reinitialised */
+ dataversion= new_dataversion();
+ set_database_dataversion(slapi_sdn_get_ndn(&be_configdn), dataversion);
+ }
+ addlenstr(l, dataversion);
+ slapi_ch_free((void**)&dataversion);
+ slapi_sdn_done(&be_configdn);
+ }
+
+ be = slapi_get_next_backend(cookie);
+ }
+ slapi_ch_free ((void **)&cookie);
+ if(l->ls_buf!=NULL)
+ {
+ server_dataversion_id= slapi_ch_strdup(l->ls_buf);
+ }
+ lenstr_free(&l);
+ return server_dataversion_id;
+}