]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/util.c
ITS#5892 return -1 from ldif_read_record on error
[openldap] / servers / slapd / back-sql / util.c
index ab4042e9264ca79e6a4bcf400ba32c9299f63b3c..f0569bf2d044133ac89b4631f354e353b2161c65 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2005 The OpenLDAP Foundation.
+ * Copyright 1999-2009 The OpenLDAP Foundation.
  * Portions Copyright 1999 Dmitry Kovalev.
  * Portions Copyright 2002 Pierangelo Masarati.
  * All rights reserved.
 
 #define BACKSQL_STR_GROW 256
 
-char backsql_def_oc_query[] = 
+const char backsql_def_oc_query[] = 
        "SELECT id,name,keytbl,keycol,create_proc,delete_proc,expect_return "
        "FROM ldap_oc_mappings";
-char backsql_def_needs_select_oc_query[] = 
+const char backsql_def_needs_select_oc_query[] = 
        "SELECT id,name,keytbl,keycol,create_proc,create_keyval,delete_proc,"
        "expect_return FROM ldap_oc_mappings";
-char backsql_def_at_query[] = 
+const char backsql_def_at_query[] = 
        "SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,"
        "param_order,expect_return,sel_expr_u FROM ldap_attr_mappings "
        "WHERE oc_map_id=?";
-char backsql_def_delentry_stmt[] = "DELETE FROM ldap_entries WHERE id=?";
-char backsql_def_renentry_stmt[] =
+const char backsql_def_delentry_stmt[] = "DELETE FROM ldap_entries WHERE id=?";
+const char backsql_def_renentry_stmt[] =
        "UPDATE ldap_entries SET dn=?,parent=?,keyval=? WHERE id=?";
-char backsql_def_insentry_stmt[] = 
+const char backsql_def_insentry_stmt[] = 
        "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) "
        "VALUES (?,?,?,?)";
-char backsql_def_delobjclasses_stmt[] = "DELETE FROM ldap_entry_objclasses "
+const char backsql_def_delobjclasses_stmt[] = "DELETE FROM ldap_entry_objclasses "
        "WHERE entry_id=?";
-char backsql_def_subtree_cond[] = "ldap_entries.dn LIKE CONCAT('%',?)";
-char backsql_def_upper_subtree_cond[] = "(ldap_entries.dn) LIKE CONCAT('%',?)";
-char backsql_id_query[] = "SELECT id,keyval,oc_map_id,dn FROM ldap_entries WHERE ";
+const char backsql_def_subtree_cond[] = "ldap_entries.dn LIKE CONCAT('%',?)";
+const char backsql_def_upper_subtree_cond[] = "(ldap_entries.dn) LIKE CONCAT('%',?)";
+const char backsql_id_query[] = "SELECT id,keyval,oc_map_id,dn FROM ldap_entries WHERE ";
 /* better ?||? or cast(?||? as varchar) */ 
-char backsql_def_concat_func[] = "CONCAT(?,?)";
+const char backsql_def_concat_func[] = "CONCAT(?,?)";
 
 /* TimesTen */
-char backsql_check_dn_ru_query[] = "SELECT dn_ru FROM ldap_entries";
+const char backsql_check_dn_ru_query[] = "SELECT dn_ru FROM ldap_entries";
 
 struct berbuf *
-backsql_strcat( struct berbuf *dest, ... )
+backsql_strcat_x( struct berbuf *dest, void *memctx, ... )
 {
        va_list         strs;
        ber_len_t       cdlen, cslen, grow;
        char            *cstr;
 
-       assert( dest );
+       assert( dest != NULL );
        assert( dest->bb_val.bv_val == NULL 
                        || dest->bb_val.bv_len == strlen( dest->bb_val.bv_val ) );
  
@@ -79,10 +79,9 @@ backsql_strcat( struct berbuf *dest, ... )
        Debug( LDAP_DEBUG_TRACE, "==>backsql_strcat()\n", 0, 0, 0 );
 #endif /* BACKSQL_TRACE */
 
-       va_start( strs, dest );
+       va_start( strs, memctx );
        if ( dest->bb_val.bv_val == NULL || dest->bb_len == 0 ) {
-               dest->bb_val.bv_val = (char *)ch_calloc( BACKSQL_STR_GROW, 
-                               sizeof( char ) );
+               dest->bb_val.bv_val = (char *)ber_memalloc_x( BACKSQL_STR_GROW * sizeof( char ), memctx );
                dest->bb_val.bv_len = 0;
                dest->bb_len = BACKSQL_STR_GROW;
        }
@@ -100,8 +99,8 @@ backsql_strcat( struct berbuf *dest, ... )
                                dest->bb_len, cdlen + 1, cslen );
 #endif /* BACKSQL_TRACE */
 
-                       tmp_dest = (char *)ch_realloc( dest->bb_val.bv_val,
-                                       ( dest->bb_len ) + grow * sizeof( char ) );
+                       tmp_dest = (char *)ber_memrealloc_x( dest->bb_val.bv_val,
+                                       dest->bb_len + grow * sizeof( char ), memctx );
                        if ( tmp_dest == NULL ) {
                                Debug( LDAP_DEBUG_ANY, "backsql_strcat(): "
                                        "could not reallocate string buffer.\n",
@@ -133,13 +132,13 @@ backsql_strcat( struct berbuf *dest, ... )
 } 
 
 struct berbuf *
-backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
+backsql_strfcat_x( struct berbuf *dest, void *memctx, const char *fmt, ... )
 {
        va_list         strs;
        ber_len_t       cdlen;
 
-       assert( dest );
-       assert( fmt );
+       assert( dest != NULL );
+       assert( fmt != NULL );
        assert( dest->bb_len == 0 || dest->bb_len > dest->bb_val.bv_len );
        assert( dest->bb_val.bv_val == NULL 
                        || dest->bb_val.bv_len == strlen( dest->bb_val.bv_val ) );
@@ -150,8 +149,7 @@ backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
 
        va_start( strs, fmt );
        if ( dest->bb_val.bv_val == NULL || dest->bb_len == 0 ) {
-               dest->bb_val.bv_val = (char *)ch_calloc( BACKSQL_STR_GROW, 
-                               sizeof( char ) );
+               dest->bb_val.bv_val = (char *)ber_memalloc_x( BACKSQL_STR_GROW * sizeof( char ), memctx );
                dest->bb_val.bv_len = 0;
                dest->bb_len = BACKSQL_STR_GROW;
        }
@@ -208,8 +206,8 @@ backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
                                dest->bb_len, cdlen + 1, cslen );
 #endif /* BACKSQL_TRACE */
 
-                       tmp_dest = (char *)ch_realloc( dest->bb_val.bv_val,
-                                       ( dest->bb_len ) + grow * sizeof( char ) );
+                       tmp_dest = (char *)ber_memrealloc_x( dest->bb_val.bv_val,
+                                       ( dest->bb_len ) + grow * sizeof( char ), memctx );
                        if ( tmp_dest == NULL ) {
                                Debug( LDAP_DEBUG_ANY, "backsql_strfcat(): "
                                        "could not reallocate string buffer.\n",
@@ -225,7 +223,7 @@ backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
 #endif /* BACKSQL_TRACE */
                }
 
-               assert( cstr );
+               assert( cstr != NULL );
                
                AC_MEMCPY( dest->bb_val.bv_val + cdlen, cstr, cslen + 1 );
                cdlen += cslen;
@@ -254,7 +252,7 @@ backsql_entry_addattr(
 
 #ifdef BACKSQL_TRACE
        Debug( LDAP_DEBUG_TRACE, "backsql_entry_addattr(\"%s\"): %s=%s\n", 
-               e->e_name.bv_val, ad->ad_cname->bv_val, val->bv_val );
+               e->e_name.bv_val, ad->ad_cname.bv_val, val->bv_val );
 #endif /* BACKSQL_TRACE */
 
        rc = attr_merge_normalize_one( e, ad, val, memctx );
@@ -275,13 +273,13 @@ backsql_entry_addattr(
 }
 
 static char *
-backsql_get_table_spec( char **p )
+backsql_get_table_spec( backsql_info *bi, char **p )
 {
        char            *s, *q;
        struct berbuf   res = BB_NULL;
 
-       assert( p );
-       assert( *p );
+       assert( p != NULL );
+       assert( *p != NULL );
 
        s = *p;
        while ( **p && **p != ',' ) {
@@ -302,7 +300,7 @@ backsql_get_table_spec( char **p )
 
        BACKSQL_NEXT_WORD;
        /* table name */
-       backsql_strcat( &res, s, NULL );
+       backsql_strcat_x( &res, NULL, s, NULL );
        s = q;
 
        BACKSQL_NEXT_WORD;
@@ -312,13 +310,19 @@ backsql_get_table_spec( char **p )
        }
 
        /* oracle doesn't understand "AS" :( and other RDBMSes don't need it */
-       backsql_strcat( &res, " " BACKSQL_ALIASING BACKSQL_ALIASING_QUOTE, s, BACKSQL_ALIASING_QUOTE, NULL );
+       backsql_strfcat_x( &res, NULL, "lbbsb",
+                       STRLENOF( " " ), " ",
+                       &bi->sql_aliasing,
+                       &bi->sql_aliasing_quote,
+                       s,
+                       &bi->sql_aliasing_quote );
 
        return res.bb_val.bv_val;
 }
 
 int
 backsql_merge_from_clause( 
+       backsql_info    *bi,
        struct berbuf   *dest_from,
        struct berval   *src_from )
 {
@@ -340,20 +344,20 @@ backsql_merge_from_clause(
        }
        
        while ( *p ) {
-               s = backsql_get_table_spec( &p );
+               s = backsql_get_table_spec( bi, &p );
 
 #ifdef BACKSQL_TRACE
                Debug( LDAP_DEBUG_TRACE, "backsql_merge_from_clause(): "
                        "p=\"%s\" s=\"%s\"\n", p, s, 0 );
 #endif /* BACKSQL_TRACE */
 
-               if ( res.bb_val.bv_val == NULL ) {
-                       backsql_strcat( &res, s, NULL );
+               if ( BER_BVISNULL( &res.bb_val ) ) {
+                       backsql_strcat_x( &res, NULL, s, NULL );
 
                } else {
                        pos = strstr( res.bb_val.bv_val, s );
                        if ( pos == NULL || ( ( e = pos[ strlen( s ) ] ) != '\0' && e != ',' ) ) {
-                               backsql_strfcat( &res, "cs", ',', s );
+                               backsql_strfcat_x( &res, NULL, "cs", ',', s );
                        }
                }
                
@@ -391,8 +395,8 @@ backsql_split_pattern(
 
 #define SPLIT_CHAR     '?'
        
-       assert( _pattern );
-       assert( split_pattern );
+       assert( _pattern != NULL );
+       assert( split_pattern != NULL );
 
        pattern = ch_strdup( _pattern );
 
@@ -451,15 +455,15 @@ backsql_prepare_pattern(
        int             i;
        struct berbuf   bb = BB_NULL;
 
-       assert( res );
+       assert( res != NULL );
 
        for ( i = 0; values[i].bv_val; i++ ) {
                if ( split_pattern[i].bv_val == NULL ) {
                        ch_free( bb.bb_val.bv_val );
                        return -1;
                }
-               backsql_strfcat( &bb, "b", &split_pattern[ i ] );
-               backsql_strfcat( &bb, "b", &values[ i ] );
+               backsql_strfcat_x( &bb, NULL, "b", &split_pattern[ i ] );
+               backsql_strfcat_x( &bb, NULL, "b", &values[ i ] );
        }
 
        if ( split_pattern[ i ].bv_val == NULL ) {
@@ -467,7 +471,7 @@ backsql_prepare_pattern(
                return -1;
        }
 
-       backsql_strfcat( &bb, "b", &split_pattern[ i ] );
+       backsql_strfcat_x( &bb, NULL, "b", &split_pattern[ i ] );
 
        *res = bb.bb_val;
 
@@ -490,9 +494,9 @@ backsql_entryUUID(
 
        /* entryUUID is generated as "%08x-%04x-%04x-0000-eaddrXXX"
         * with eid_oc_id as %08x and hi and lo eid_id as %04x-%04x */
-       assert( bi );
-       assert( id );
-       assert( entryUUID );
+       assert( bi != NULL );
+       assert( id != NULL );
+       assert( entryUUID != NULL );
 
 #ifdef BACKSQL_ARBITRARY_KEY
        snprintf( uuidbuf, sizeof( uuidbuf ),
@@ -516,9 +520,9 @@ backsql_entryUUID(
        /* note: works only with 32 bit architectures... */
        snprintf( uuidbuf, sizeof( uuidbuf ),
                        "%08x-%04x-%04x-0000-000000000000",
-                       ( id->eid_oc_id & 0xFFFFFFFF ),
-                       ( ( id->eid_keyval & 0xFFFF0000 ) >> 020 /* 16 */ ),
-                       ( id->eid_keyval & 0xFFFF ) );
+                       ( (unsigned)id->eid_oc_id & 0xFFFFFFFF ),
+                       ( ( (unsigned)id->eid_keyval & 0xFFFF0000 ) >> 020 /* 16 */ ),
+                       ( (unsigned)id->eid_keyval & 0xFFFF ) );
 #endif /* ! BACKSQL_ARBITRARY_KEY */
 
        uuid.bv_val = uuidbuf;
@@ -540,7 +544,9 @@ backsql_entryUUID_decode(
 #endif /* ! BACKSQL_ARBITRARY_KEY */
        )
 {
+#if 0
        fprintf( stderr, "==> backsql_entryUUID_decode()\n" );
+#endif
 
        *oc_id = ( entryUUID->bv_val[0] << 030 /* 24 */ )
                + ( entryUUID->bv_val[1] << 020 /* 16 */ )
@@ -556,8 +562,10 @@ backsql_entryUUID_decode(
                + entryUUID->bv_val[7];
 #endif /* ! BACKSQL_ARBITRARY_KEY */
 
+#if 0
        fprintf( stderr, "<== backsql_entryUUID_decode(): oc=%lu id=%lu\n",
                        *oc_id, *keyval );
+#endif
 
        return LDAP_SUCCESS;
 }