]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/entry-id.c
Add a safety check to bvcasechr
[openldap] / servers / slapd / back-sql / entry-id.c
index 92cceedd5e68b3e2501741263a7b8e2ab8d5bdd3..73086850f458dfbbb137f956f1bd669028236f6b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *      Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
+ *      Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
  *
  *      Redistribution and use in source and binary forms are permitted only
  *      as authorized by the OpenLDAP Public License.  A copy of this
@@ -30,23 +30,63 @@ backsql_entryID* backsql_free_entryID(backsql_entryID* id)
  return next;
 }
 
-backsql_entryID* backsql_dn2id(backsql_entryID *id,SQLHDBC dbh,char *dn)
+backsql_entryID* backsql_dn2id(backsql_info *bi,backsql_entryID *id,SQLHDBC dbh,char *dn)
 {
- static char id_query[]="SELECT id,keyval,objclass FROM ldap_entries WHERE dn=?";
  SQLHSTMT sth; 
  BACKSQL_ROW_NTS row;
- //SQLINTEGER nrows=0;
+ /*SQLINTEGER nrows=0;*/
  RETCODE rc;
 
+ /* TimesTen */
+ char upperdn[BACKSQL_MAX_DN_LEN+1];
+ char* toBind;
+ int i, j, k;
+
  Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): dn='%s'\n",dn,0,0);
- backsql_Prepare(dbh,&sth,id_query,0);
- if ((rc=backsql_BindParamStr(sth,1,dn,BACKSQL_MAX_DN_LEN)) != SQL_SUCCESS)
-  {
+ /* begin TimesTen */
+ Debug(LDAP_DEBUG_TRACE, "id_query '%s'\n", bi->id_query, 0, 0);
+ rc = backsql_Prepare(dbh,&sth,bi->id_query,0);
+ if (rc != SQL_SUCCESS) {
+   Debug(LDAP_DEBUG_TRACE, "backsql_dn2id(): error preparing SQL:\n", 0, 0, 0);
+   Debug(LDAP_DEBUG_TRACE, "%s\n", bi->id_query, 0, 0);
+   backsql_PrintErrors(SQL_NULL_HENV, dbh, sth, rc);
+   SQLFreeStmt(sth, SQL_DROP);
+   return NULL;
+ }
+
+ if (bi->has_ldapinfo_dn_ru) {
+   /* Prepare an upper cased, byte reversed version that can be
+      searched using indexes */
+
+   for ((i=0, j=strlen(dn)-1); *(dn+i); (i++, j--)) {
+     *(upperdn+i) = toupper(*(dn+j));
+   }   
+   *(upperdn+i) = '\0';
+   Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): upperdn='%s'\n",upperdn,0,0);
+   toBind = upperdn;
+ }
+ else {
+   if (bi->isTimesTen) {
+     for (i = 0; *(dn+i); i++) {
+       *(upperdn+i) = toupper(*(dn+i)); /* Copy while upper casing */
+     }
+     *(upperdn+i) = '\0';
+     Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): upperdn='%s'\n",upperdn,0,0);
+     toBind = upperdn;
+   }
+   else
+     toBind = dn;
+ }
+
+ if ((rc=backsql_BindParamStr(sth,1,toBind,
+                  BACKSQL_MAX_DN_LEN)) != SQL_SUCCESS)
+ /* end TimesTen*/
+ {
    Debug(LDAP_DEBUG_TRACE,"backsql_dn2id(): error binding dn parameter:\n",0,0,0);
    backsql_PrintErrors(SQL_NULL_HENV,dbh,sth,rc);
    SQLFreeStmt(sth,SQL_DROP);
    return NULL;
 }
+ }
  
  if ((rc=SQLExecute(sth)) != SQL_SUCCESS)
   {
@@ -66,7 +106,7 @@ backsql_entryID* backsql_dn2id(backsql_entryID *id,SQLHDBC dbh,char *dn)
    id->id=atoi(row.cols[0]);
    id->keyval=atoi(row.cols[1]);
    id->oc_id=atoi(row.cols[2]);
-   id->dn=strdup(dn);
+   id->dn=ch_strdup(dn);
    id->next=NULL;
   }
  else
@@ -107,7 +147,7 @@ int backsql_get_attr_vals(backsql_at_map_rec *at,backsql_srch_info *bsi)
 
  if ((rc=SQLExecute(sth)) != SQL_SUCCESS && rc!= SQL_SUCCESS_WITH_INFO)
   {
-   Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error executing query\n",0,0,0);
+   Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error executing attribute query '%s'\n",at->query,0,0);
    backsql_PrintErrors(bsi->bi->db_env,bsi->dbh,sth,rc);
    SQLFreeStmt(sth,SQL_DROP);
    return 1;
@@ -122,10 +162,11 @@ int backsql_get_attr_vals(backsql_at_map_rec *at,backsql_srch_info *bsi)
       {
        backsql_entry_addattr(bsi->e,row.col_names[i],row.cols[i],/*row.col_prec[i]*/
                                        strlen(row.cols[i]));
-//       Debug(LDAP_DEBUG_TRACE,"prec=%d\n",(int)row.col_prec[i],0,0);
+/*       Debug(LDAP_DEBUG_TRACE,"prec=%d\n",(int)row.col_prec[i],0,0);*/
       }
-    // else
-    //  Debug(LDAP_DEBUG_TRACE,"NULL value in this row for attribute '%s'\n",row.col_names[i],0,0);
+    /* else
+      Debug(LDAP_DEBUG_TRACE,"NULL value in this row for attribute '%s'\n",row.col_names[i],0,0);
+*/
     }
   }
  backsql_FreeRow(&row);
@@ -146,8 +187,13 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
  bsi->e=e;
  bsi->c_eid=eid;
  e->e_attrs=NULL;
- if (bsi->base_dn != NULL)
-  e->e_dn=strdup(bsi->c_eid->dn);
+ e->e_private=NULL;
+/* if (bsi->base_dn != NULL)???*/
+
+ e->e_id=eid->id;
+ e->e_dn=ch_strdup(bsi->c_eid->dn);
+ e->e_ndn=dn_normalize(ch_strdup(bsi->c_eid->dn));
  
  if (bsi->attrs!=NULL)
  {
@@ -156,7 +202,7 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
   {
    if (!strcasecmp(*c_at_name,"objectclass") || !strcasecmp(*c_at_name,"0.10"))
    {
-       //backsql_entry_addattr(bsi->e,"objectclass",bsi->oc->name,strlen(bsi->oc->name));
+       /*backsql_entry_addattr(bsi->e,"objectclass",bsi->oc->name,strlen(bsi->oc->name));*/
     continue;
    }
    at=backsql_at_with_name(bsi->oc,*c_at_name);
@@ -179,4 +225,4 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
  return e;
 }
 
-#endif /* SLAPD_SQL */
\ No newline at end of file
+#endif /* SLAPD_SQL */