X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-mdb%2Fidl.c;h=2cba7c27590745a9fc66f457589d53eb558c5ede;hb=8102d9d2df0d97b70f9d5d9e54e7a171975a6fee;hp=67d77bd5bfcda5e4a51408a3585251fb007441ef;hpb=c8c34cdd43d3603f3b64a56841b4425379c98f45;p=openldap diff --git a/servers/slapd/back-mdb/idl.c b/servers/slapd/back-mdb/idl.c index 67d77bd5bf..2cba7c2759 100644 --- a/servers/slapd/back-mdb/idl.c +++ b/servers/slapd/back-mdb/idl.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2011 The OpenLDAP Foundation. + * Copyright 2000-2013 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -391,14 +391,20 @@ mdb_idl_fetch_key( int mdb_idl_insert_keys( + BackendDB *be, MDB_cursor *cursor, struct berval *keys, ID id ) { + struct mdb_info *mdb = be->be_private; MDB_val key, data; ID lo, hi, *i; char *err; - int rc, k; + int rc = 0, k; + unsigned int flag = MDB_NODUPDATA; +#ifndef MISALIGNED_OK + int kbuf[2]; +#endif { char buf[16]; @@ -409,12 +415,25 @@ mdb_idl_insert_keys( assert( id != NOID ); +#ifndef MISALIGNED_OK + if (keys[0].bv_len & ALIGNER) + kbuf[1] = 0; +#endif for ( k=0; keys[k].bv_val; k++ ) { /* Fetch the first data item for this key, to see if it * exists and if it's a range. */ - key.mv_size = keys[k].bv_len; - key.mv_data = keys[k].bv_val; +#ifndef MISALIGNED_OK + if (keys[k].bv_len & ALIGNER) { + key.mv_size = sizeof(kbuf); + key.mv_data = kbuf; + memcpy(key.mv_data, keys[k].bv_val, keys[k].bv_len); + } else +#endif + { + key.mv_size = keys[k].bv_len; + key.mv_data = keys[k].bv_val; + } rc = mdb_cursor_get( cursor, &key, &data, MDB_SET ); err = "c_get"; if ( rc == 0 ) { @@ -473,6 +492,8 @@ mdb_idl_insert_keys( } } else { /* There's room, just store it */ + if (id == mdb->mi_nextid) + flag |= MDB_APPENDDUP; goto put1; } } else { @@ -499,9 +520,10 @@ mdb_idl_insert_keys( } } } else if ( rc == MDB_NOTFOUND ) { + flag &= ~MDB_APPENDDUP; put1: data.mv_data = &id; data.mv_size = sizeof(ID); - rc = mdb_cursor_put( cursor, &key, &data, MDB_NODUPDATA ); + rc = mdb_cursor_put( cursor, &key, &data, flag ); /* Don't worry if it's already there */ if ( rc == MDB_KEYEXIST ) rc = 0; @@ -522,14 +544,18 @@ fail: int mdb_idl_delete_keys( + BackendDB *be, MDB_cursor *cursor, struct berval *keys, ID id ) { - int rc, k; + int rc = 0, k; MDB_val key, data; ID lo, hi, tmp, *i; char *err; +#ifndef MISALIGNED_OK + int kbuf[2]; +#endif { char buf[16]; @@ -539,12 +565,25 @@ mdb_idl_delete_keys( } assert( id != NOID ); +#ifndef MISALIGNED_OK + if (keys[0].bv_len & ALIGNER) + kbuf[1] = 0; +#endif for ( k=0; keys[k].bv_val; k++) { /* Fetch the first data item for this key, to see if it * exists and if it's a range. */ - key.mv_size = keys[k].bv_len; - key.mv_data = keys[k].bv_val; +#ifndef MISALIGNED_OK + if (keys[k].bv_len & ALIGNER) { + key.mv_size = sizeof(kbuf); + key.mv_data = kbuf; + memcpy(key.mv_data, keys[k].bv_val, keys[k].bv_len); + } else +#endif + { + key.mv_size = keys[k].bv_len; + key.mv_data = keys[k].bv_val; + } rc = mdb_cursor_get( cursor, &key, &data, MDB_SET ); err = "c_get"; if ( rc == 0 ) { @@ -1045,7 +1084,7 @@ mdb_idl_sort( ID *ids, ID *tmp ) /* 8 bit Radix sort + insertion sort * * based on code from http://www.cubic.org/docs/radix.htm - * with improvements by mbackes@symas.com and hyc@symas.com + * with improvements by ebackes@symas.com and hyc@symas.com * * This code is O(n) but has a relatively high constant factor. For lists * up to ~50 Quicksort is slightly faster; up to ~100 they are even.