Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
orbea -
OpenLDAP
Commits
573e279d
Commit
573e279d
authored
Jul 08, 1999
by
Juan Gomez
Browse files
Initial step of index files fix, more tomorrow.
parent
352e8eba
Changes
3
Hide whitespace changes
Inline
Side-by-side
servers/slapd/back-ldbm/index.c
View file @
573e279d
...
...
@@ -10,7 +10,16 @@
#include
"slap.h"
#include
"back-ldbm.h"
static
int
add_value
(
Backend
*
be
,
struct
dbcache
*
db
,
char
*
type
,
int
indextype
,
char
*
val
,
ID
id
);
/* static int add_value(Backend *be, struct dbcache *db, char *type, int indextype, char *val, ID id);*/
static
int
change_value
(
Backend
*
be
,
struct
dbcache
*
db
,
char
*
type
,
int
indextype
,
char
*
val
,
ID
id
,
int
(
*
idl_func
)(
Backend
*
,
struct
dbcache
*
,
Datum
,
ID
));
static
int
index2prefix
(
int
indextype
);
int
...
...
@@ -40,7 +49,7 @@ index_add_entry(
/* add the dn to the indexes */
{
char
*
dn
=
ch_strdup
(
"dn"
);
index_
add
_values
(
be
,
dn
,
bvals
,
e
->
e_id
);
index_
change
_values
(
be
,
dn
,
bvals
,
e
->
e_id
,
__INDEX_ADD_OP
);
free
(
dn
);
}
...
...
@@ -48,7 +57,8 @@ index_add_entry(
/* add each attribute to the indexes */
for
(
ap
=
e
->
e_attrs
;
ap
!=
NULL
;
ap
=
ap
->
a_next
)
{
index_add_values
(
be
,
ap
->
a_type
,
ap
->
a_vals
,
e
->
e_id
);
index_change_values
(
be
,
ap
->
a_type
,
ap
->
a_vals
,
e
->
e_id
,
__INDEX_ADD_OP
);
}
Debug
(
LDAP_DEBUG_TRACE
,
"<= index_add( %ld,
\"
%s
\"
) 0
\n
"
,
e
->
e_id
,
...
...
@@ -67,15 +77,27 @@ index_add_mods(
for
(
;
mods
!=
NULL
;
mods
=
mods
->
mod_next
)
{
switch
(
mods
->
mod_op
&
~
LDAP_MOD_BVALUES
)
{
case
LDAP_MOD_ADD
:
case
LDAP_MOD_REPLACE
:
rc
=
index_add_values
(
be
,
mods
->
mod_type
,
mods
->
mod_bvalues
,
id
);
/* XXX: Delete old index data==>problem when this
* gets called we lost values already!
*/
case
LDAP_MOD_ADD
:
rc
=
index_change_values
(
be
,
mods
->
mod_type
,
mods
->
mod_bvalues
,
id
,
__INDEX_ADD_OP
);
break
;
case
LDAP_MOD_SOFTADD
:
/* SOFTADD means index was there already */
case
LDAP_MOD_DELETE
:
rc
=
0
;
break
;
case
LDAP_MOD_DELETE
:
rc
=
index_change_values
(
be
,
mods
->
mod_type
,
mods
->
mod_bvalues
,
id
,
__INDEX_DEL_OP
);
break
;
}
if
(
rc
!=
0
)
{
...
...
@@ -157,19 +179,21 @@ index_read(
return
(
idl
);
}
/* Add or remove stuff from index files */
static
int
add
_value
(
change
_value
(
Backend
*
be
,
struct
dbcache
*
db
,
char
*
type
,
int
indextype
,
char
*
val
,
ID
id
ID
id
,
int
(
*
idl_func
)(
Backend
*
,
struct
dbcache
*
,
Datum
,
ID
)
)
{
int
rc
;
Datum
key
;
ID_BLOCK
*
idl
=
NULL
;
char
*
tmpval
=
NULL
;
char
*
realval
=
val
;
char
buf
[
BUFSIZ
];
...
...
@@ -178,21 +202,20 @@ add_value(
ldbm_datum_init
(
key
);
Debug
(
LDAP_DEBUG_TRACE
,
"=> add_value(
\"
%c%s
\"
)
\n
"
,
prefix
,
val
,
0
);
realval
=
val
;
tmpval
=
NULL
;
Debug
(
LDAP_DEBUG_TRACE
,
"=> change_value(
\"
%c%s
\"
, op=%s )
\n
"
,
prefix
,
val
,
(
idl_func
==
idl_insert_key
?
"ADD"
:
"DELETE"
)
);
if
(
prefix
!=
UNKNOWN_PREFIX
)
{
unsigned
int
len
=
strlen
(
val
);
if
(
(
len
+
2
)
<
sizeof
(
buf
)
)
{
realval
=
buf
;
}
else
{
}
else
{
/* value + prefix + null */
tmpval
=
(
char
*
)
ch_malloc
(
len
+
2
);
realval
=
tmpval
;
}
}
realval
[
0
]
=
prefix
;
strcpy
(
&
realval
[
1
],
val
);
}
...
...
@@ -200,28 +223,27 @@ add_value(
key
.
dptr
=
realval
;
key
.
dsize
=
strlen
(
realval
)
+
1
;
rc
=
idl_
insert_key
(
be
,
db
,
key
,
id
);
rc
=
idl_
func
(
be
,
db
,
key
,
id
);
if
(
tmpval
!=
NULL
)
{
free
(
tmpval
);
}
if
(
idl
!=
NULL
)
{
idl_free
(
idl
);
}
ldap_pvt_thread_yield
();
/* Debug( LDAP_DEBUG_TRACE, "<= add_value %d\n", rc, 0, 0 ); */
Debug
(
LDAP_DEBUG_TRACE
,
"<= change_value %d
\n
"
,
rc
,
0
,
0
);
return
(
rc
);
}
}
/* static int change_value() */
int
index_
add
_values
(
index_
change
_values
(
Backend
*
be
,
char
*
type
,
struct
berval
**
vals
,
ID
id
ID
id
,
unsigned
int
op
)
{
char
*
val
,
*
p
,
*
code
,
*
w
;
...
...
@@ -232,19 +254,50 @@ index_add_values(
char
*
bigbuf
;
struct
dbcache
*
db
;
Debug
(
LDAP_DEBUG_TRACE
,
"=> index_add_values(
\"
%s
\"
, %ld )
\n
"
,
type
,
id
,
0
);
int
(
*
idl_funct
)(
Backend
*
,
struct
dbcache
*
,
Datum
,
ID
);
char
*
at_cn
;
/* Attribute canonical name */
int
mode
;
Debug
(
LDAP_DEBUG_TRACE
,
"=> index_change_values(
\"
%s
\"
, %ld, op=%s )
\n
"
,
type
,
id
,
((
op
==
__INDEX_ADD_OP
)
?
"ADD"
:
"DELETE"
)
);
if
(
op
==
__INDEX_ADD_OP
)
{
/* Add values */
idl_funct
=
idl_insert_key
;
mode
=
LDBM_WRCREAT
;
}
else
{
/* Delete values */
idl_funct
=
idl_delete_key
;
mode
=
LDBM_WRITER
;
}
attr_normalize
(
type
);
attr_masks
(
be
->
be_private
,
type
,
&
indexmask
,
&
syntax
);
if
(
indexmask
==
0
)
{
return
(
0
);
}
if
(
(
db
=
ldbm_cache_open
(
be
,
type
,
LDBM_SUFFIX
,
LDBM_WRCREAT
))
==
NULL
)
{
/* at_cn = at_canonical_name( type ); */
at_cn
=
type
;
if
(
(
db
=
ldbm_cache_open
(
be
,
at_cn
,
LDBM_SUFFIX
,
mode
))
==
NULL
)
{
Debug
(
LDAP_DEBUG_ANY
,
"<= index_add_values -1 (could not open/create %s%s)
\n
"
,
type
,
LDBM_SUFFIX
,
0
);
"<= index_change_values (couldn't open(%s%s),md=%s)
\n
"
,
at_cn
,
LDBM_SUFFIX
,
((
mode
==
LDBM_WRCREAT
)
?
"LDBM_WRCREAT"
:
"LDBM_WRITER"
)
);
return
(
-
1
);
}
...
...
@@ -254,14 +307,21 @@ index_add_values(
* presence index entry
*/
if
(
indexmask
&
INDEX_PRESENCE
)
{
add_value
(
be
,
db
,
type
,
INDEX_PRESENCE
,
"*"
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_PRESENCE
,
"*"
,
id
,
idl_funct
);
}
Debug
(
LDAP_DEBUG_TRACE
,
"*** index_add_values syntax 0x%x syntax bin 0x%x
\n
"
,
syntax
,
SYNTAX_BIN
,
0
);
Debug
(
LDAP_DEBUG_TRACE
,
"index_change_values syntax 0x%x syntax bin 0x%x
\n
"
,
syntax
,
SYNTAX_BIN
,
0
);
if
(
syntax
&
SYNTAX_BIN
)
{
ldbm_cache_close
(
be
,
db
);
return
(
0
);
}
bigbuf
=
NULL
;
...
...
@@ -279,14 +339,17 @@ index_add_values(
value_normalize
(
val
,
syntax
);
/* val
length
could change */
/* val
ue_normalize
could change
the length of val
*/
len
=
strlen
(
val
);
/*
* equality index entry
*/
if
(
indexmask
&
INDEX_EQUALITY
)
{
add_value
(
be
,
db
,
type
,
INDEX_EQUALITY
,
val
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_EQUALITY
,
val
,
id
,
idl_funct
);
}
/*
...
...
@@ -296,8 +359,13 @@ index_add_values(
for
(
w
=
first_word
(
val
);
w
!=
NULL
;
w
=
next_word
(
w
)
)
{
if
(
(
code
=
phonetic
(
w
))
!=
NULL
)
{
add_value
(
be
,
db
,
type
,
INDEX_APPROX
,
code
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_APPROX
,
code
,
id
,
idl_funct
);
free
(
code
);
}
}
...
...
@@ -315,7 +383,8 @@ index_add_values(
}
buf
[
SUBLEN
]
=
'\0'
;
add_value
(
be
,
db
,
type
,
INDEX_SUB
,
buf
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_SUB
,
buf
,
id
,
idl_funct
);
p
=
val
+
len
-
SUBLEN
+
1
;
for
(
j
=
0
;
j
<
SUBLEN
-
1
;
j
++
)
{
...
...
@@ -324,7 +393,8 @@ index_add_values(
buf
[
SUBLEN
-
1
]
=
'$'
;
buf
[
SUBLEN
]
=
'\0'
;
add_value
(
be
,
db
,
type
,
INDEX_SUB
,
buf
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_SUB
,
buf
,
id
,
idl_funct
);
}
/* any */
...
...
@@ -334,7 +404,8 @@ index_add_values(
}
buf
[
SUBLEN
]
=
'\0'
;
add_value
(
be
,
db
,
type
,
INDEX_SUB
,
buf
,
id
);
change_value
(
be
,
db
,
at_cn
,
INDEX_SUB
,
buf
,
id
,
idl_funct
);
}
}
...
...
@@ -345,7 +416,8 @@ index_add_values(
ldbm_cache_close
(
be
,
db
);
return
(
0
);
}
}
/* int index_change_values() */
static
int
index2prefix
(
int
indextype
)
...
...
servers/slapd/back-ldbm/proto-back-ldbm.h
View file @
573e279d
...
...
@@ -112,7 +112,23 @@ ID idl_nextid LDAP_P(( ID_BLOCK *idl, ID id ));
int
index_add_entry
LDAP_P
((
Backend
*
be
,
Entry
*
e
));
int
index_add_mods
LDAP_P
((
Backend
*
be
,
LDAPMod
*
mods
,
ID
id
));
ID_BLOCK
*
index_read
LDAP_P
((
Backend
*
be
,
char
*
type
,
int
indextype
,
char
*
val
));
int
index_add_values
LDAP_P
((
Backend
*
be
,
char
*
type
,
struct
berval
**
vals
,
ID
id
));
/* To keep index files up-to-date we needed a index_delete_values() but since
* that function is so similar to index_add_values() I have merged them in one
* called index_change_values(). (gomez 07/07/1999)
*/
/* int index_add_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID id )); */
/* Possible operations supported (op) by index_change_values() */
#define __INDEX_ADD_OP 0x0001
#define __INDEX_DEL_OP 0x0002
int
index_change_values
LDAP_P
((
Backend
*
be
,
char
*
type
,
struct
berval
**
vals
,
ID
id
,
unsigned
int
op
));
/*
* kerberos.c
...
...
servers/slapd/tools/ldif2index.c
View file @
573e279d
...
...
@@ -157,8 +157,11 @@ main( int argc, char **argv )
if
(
strcasecmp
(
type
,
attr
)
==
0
)
{
bv
.
bv_val
=
val
;
bv
.
bv_len
=
vlen
;
index_add_values
(
be
,
attr
,
vals
,
id
);
index_change_values
(
be
,
attr
,
vals
,
id
,
__INDEX_ADD_OP
);
}
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment