2 * Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
4 * Redistribution and use in source and binary forms are permitted only
5 * as authorized by the OpenLDAP Public License. A copy of this
6 * license is available at http://www.OpenLDAP.org/license.html or
7 * in file LICENSE in the top-level directory of the distribution.
15 #include <sys/types.h>
16 #include "ac/string.h"
18 #include "ac/stdarg.h"
21 #include "schema-map.h"
25 char backsql_def_oc_query[] =
26 "SELECT id,name,keytbl,keycol,create_proc,delete_proc,expect_return "
27 "FROM ldap_oc_mappings";
28 char backsql_def_at_query[] =
29 "SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,"
30 "param_order,expect_return,sel_expr_u FROM ldap_attr_mappings "
32 char backsql_def_delentry_query[] = "DELETE FROM ldap_entries WHERE id=?";
33 char backsql_def_insentry_query[] =
34 "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) "
36 char backsql_def_subtree_cond[] = "ldap_entries.dn LIKE CONCAT('%',?)";
37 char backsql_def_upper_subtree_cond[] = "(ldap_entries.dn) LIKE CONCAT('%',?)";
38 char backsql_id_query[] = "SELECT id,keyval,oc_map_id FROM ldap_entries WHERE ";
41 char backsql_check_dn_ru_query[] = "SELECT dn_ru from ldap_entries";
44 backsql_strcat( struct berval *dest, int *buflen, ... )
47 int cdlen, cslen, grow;
51 assert( dest->bv_val == NULL
52 || dest->bv_len == strlen( dest->bv_val ) );
55 Debug( LDAP_DEBUG_TRACE, "==>backsql_strcat()\n" );
58 va_start( strs, buflen );
59 if ( dest->bv_val == NULL || *buflen <= 0 ) {
60 dest->bv_val = (char *)ch_calloc( BACKSQL_STR_GROW,
63 *buflen = BACKSQL_STR_GROW;
66 while ( ( cstr = va_arg( strs, char * ) ) != NULL ) {
67 cslen = strlen( cstr );
68 grow = BACKSQL_MAX( BACKSQL_STR_GROW, cslen );
69 if ( *buflen - cdlen <= cslen ) {
73 Debug( LDAP_DEBUG_TRACE, "backsql_strcat(): "
74 "buflen=%d, cdlen=%d, cslen=%d "
75 "-- reallocating dest\n",
76 *buflen, cdlen + 1, cslen );
78 tmp_dest = (char *)ch_realloc( dest->bv_val,
79 ( *buflen ) + grow * sizeof( char ) );
80 if ( tmp_dest == NULL ) {
81 Debug( LDAP_DEBUG_ANY, "backsql_strcat(): "
82 "could not reallocate string buffer.\n",
86 dest->bv_val = tmp_dest;
89 Debug( LDAP_DEBUG_TRACE, "backsql_strcat(): "
90 "new buflen=%d, dest=%p\n", *buflen, dest, 0 );
93 AC_MEMCPY( dest->bv_val + cdlen, cstr, cslen + 1 );
99 Debug( LDAP_DEBUG_TRACE, "<==backsql_strcat() (dest='%s')\n",
103 dest->bv_len = cdlen;
109 backsql_entry_addattr(
113 unsigned int at_val_len )
115 struct berval add_val[ 2 ];
116 AttributeDescription *ad;
120 Debug( LDAP_DEBUG_TRACE, "backsql_entry_addattr(): "
121 "at_name='%s', at_val='%s'\n", at_name, at_val, 0 );
122 add_val[ 0 ].bv_val = at_val;
123 add_val[ 0 ].bv_len = at_val_len;
124 add_val[ 1 ].bv_val = NULL;
125 add_val[ 1 ].bv_len = 0;
128 rc = slap_str2ad( at_name, &ad, &text );
129 if ( rc != LDAP_SUCCESS ) {
130 Debug( LDAP_DEBUG_TRACE, "backsql_entry_addattr(): "
131 "failed to find AttributeDescription for '%s'\n",
136 rc = attr_merge( e, ad, add_val );
139 Debug( LDAP_DEBUG_TRACE, "backsql_entry_addattr(): "
140 "failed to merge value '%s' for attribute '%s'\n",
141 at_val, at_name, 0 );
145 Debug( LDAP_DEBUG_TRACE, "<==backsql_query_addattr()\n", 0, 0, 0 );
150 backsql_get_table_spec( char **p )
153 struct berval res = { 0, NULL };
157 while ( **p && **p != ',' ) {
165 #define BACKSQL_NEXT_WORD { \
166 while ( *s && isspace( (unsigned char)*s ) ) s++; \
167 if ( !*s ) return res.bv_val; \
169 while ( *q && !isspace( (unsigned char)*q ) ) q++; \
170 if ( *q ) *q++='\0'; \
175 backsql_strcat( &res, &res_len, s, NULL );
179 if ( !strcasecmp( s, "as" ) ) {
184 backsql_strcat( &res, &res_len, " AS ", s, NULL );
185 /* oracle doesn't understand AS :( */
188 backsql_strcat( &res, &res_len, " ", s, NULL);
193 backsql_merge_from_clause( char **dest_from, int *dest_len, char *src_from )
195 char *s, *p, *srcc, *pos, e;
196 struct berval res = { 0 , NULL };
199 Debug( LDAP_DEBUG_TRACE, "==>backsql_merge_from_clause(): "
200 "dest_from='%s',src_from='%s'\n",
201 dest_from, src_from, 0 );
203 srcc = ch_strdup( src_from );
206 if ( *dest_from != NULL ) {
207 res.bv_val = *dest_from;
208 res.bv_len = strlen( *dest_from );
212 s = backsql_get_table_spec( &p );
214 Debug( LDAP_DEBUG_TRACE, "backsql_merge_from_clause(): "
215 "p='%s' s='%s'\n", p, s, 0 );
217 if ( res.bv_val == NULL ) {
218 backsql_strcat( &res, dest_len, s, NULL );
221 pos = strstr( res.bv_val, s );
223 backsql_strcat( &res, dest_len, ",", s, NULL );
224 } else if ( ( e = pos[ strlen( s ) ] ) != '\0' && e != ',' ) {
225 backsql_strcat( &res, dest_len, ",", s, NULL );
234 Debug( LDAP_DEBUG_TRACE, "<==backsql_merge_from_clause()\n", 0, 0, 0 );
237 *dest_from = res.bv_val;
242 #endif /* SLAPD_SQL */