]> git.sur5r.net Git - openldap/blob - servers/slapd/back-sql/util.c
3808de31af939ac72728d0b007962a56c0a893d7
[openldap] / servers / slapd / back-sql / util.c
1 /*
2  *       Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
3  *
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.
8  */
9
10 #include "portable.h"
11
12 #include <stdio.h>
13 #include <sys/types.h>
14 #include <string.h>
15 #include <stdarg.h>
16 #include "slap.h"
17 #include "back-sql.h"
18 #include "util.h"
19
20
21 char backsql_def_oc_query[]="SELECT id,name,keytbl,keycol,create_proc,delete_proc FROM ldap_objclasses";
22 char backsql_def_at_query[]="SELECT name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc FROM ldap_attrs WHERE oc_id=?";
23 char backsql_def_delentry_query[]="DELETE FROM ldap_entries WHERE id=?";
24 char backsql_def_insentry_query[]="INSERT INTO ldap_entries (dn,objclass,parent,keyval) VALUES (?,?,?,?)";
25 char backsql_def_subtree_cond[]="ldap_entries.dn LIKE CONCAT('%',?)";
26
27
28 char* backsql_strcat(char* dest,int *buflen, ...)
29 {
30  va_list strs;
31  int cdlen,cslen,grow;
32  char *cstr;
33  
34  //Debug(LDAP_DEBUG_TRACE,"==>my_strcat()\n");
35  va_start(strs,buflen);
36  if (dest==NULL || *buflen<=0)
37   {
38    dest=(char*)ch_calloc(BACKSQL_STR_GROW,sizeof(char));
39    *buflen=BACKSQL_STR_GROW;
40   }
41  cdlen=strlen(dest)+1;
42  while ((cstr=va_arg(strs,char*)) != NULL)
43   {
44    cslen=strlen(cstr);
45    grow=BACKSQL_MAX(BACKSQL_STR_GROW,cslen);
46    if (*buflen-cdlen < cslen)
47     {
48      //Debug(LDAP_DEBUG_TRACE,"my_strcat(): buflen=%d, cdlen=%d, cslen=%d -- reallocating dest\n",
49      //                     *buflen,cdlen,cslen);
50      dest=(char*)ch_realloc(dest,(*buflen)+grow*sizeof(char));
51      if (dest == NULL)
52       {
53        Debug(LDAP_DEBUG_ANY,"my_strcat(): could not reallocate string buffer.\n",0,0,0);
54       }
55      *buflen+=grow;
56      //Debug(LDAP_DEBUG_TRACE,"my_strcat(): new buflen=%d, dest=%p\n",*buflen,dest,0);
57     }
58    strcat(dest,cstr);
59    cdlen+=cslen;
60   }
61  va_end(strs);
62  //Debug(LDAP_DEBUG_TRACE,"<==my_strcat() (dest='%s')\n",dest,0,0);
63  return dest;
64
65
66 int backsql_entry_addattr(Entry *e,char *at_name,char *at_val,unsigned int at_val_len)
67 {
68  Attribute *c_at=e->e_attrs;
69  struct berval **cval;
70  int nvals;
71  
72  Debug(LDAP_DEBUG_TRACE,"backsql_entry_addattr(): at_name='%s', at_val='%s'\n",at_name,at_val,0);
73  while (c_at!=NULL && strcasecmp(c_at->a_type,at_name))
74   c_at=c_at->a_next;
75  if (c_at == NULL)
76   {
77    //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): creating new attribute\n",0,0,0);
78    c_at=(Attribute *)ch_calloc(sizeof(Attribute),1);
79    c_at->a_type=strdup(at_name);
80    c_at->a_syntax=SYNTAX_CIS;
81    c_at->a_vals=(struct berval**)ch_calloc(sizeof(struct berval *),1);
82    c_at->a_vals[0]=NULL;
83    c_at->a_next=e->e_attrs;
84    e->e_attrs=c_at;
85   }
86  //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): checking attribute values\n",0,0,0);
87  //should use different comparison methods for different attributes
88  //for now, uses memcmp
89  for (cval=c_at->a_vals,nvals=0;*cval != NULL &&
90       memcmp((*cval)->bv_val,at_val,BACKSQL_MIN((*cval)->bv_len,at_val_len));cval++,nvals++);
91      
92  if (*cval==NULL)
93   {
94    //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): nvals=%d; adding new value\n",nvals,0,0);
95    c_at->a_vals=(struct berval **)realloc(c_at->a_vals,sizeof(struct berval *)*(nvals+2));
96    c_at->a_vals[nvals]=(struct berval*)ch_calloc(sizeof(struct berval),1);
97    c_at->a_vals[nvals]->bv_val=(char*)ch_calloc(sizeof(char),at_val_len);
98    strncpy(c_at->a_vals[nvals]->bv_val,at_val,at_val_len);
99    c_at->a_vals[nvals]->bv_len=at_val_len;
100    c_at->a_vals[nvals+1]=NULL;
101   }
102  else
103  {
104   //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): value already exists\n",0,0,0);
105  }
106  Debug(LDAP_DEBUG_TRACE,"<==backsql_query_addattr()\n",0,0,0);
107  return 1;
108 }
109
110 char* backsql_get_table_spec(char **p)
111 {
112  char *s,*q;
113  char *res=NULL;
114  int res_len=0;
115
116  s=*p;
117  while(**p && **p!=',') (*p)++;
118  if (**p)
119   *(*p)++='\0';
120
121 #define BACKSQL_NEXT_WORD  {while (*s && isspace(*s)) s++; if (!*s) return res; q=s; while (*q && !isspace(*q)) q++; if (*q) *q++='\0';}
122  BACKSQL_NEXT_WORD;
123  res=backsql_strcat(res,&res_len,s,NULL);//table name
124  s=q;
125
126  BACKSQL_NEXT_WORD;
127  if (!strcasecmp(s,"as"))
128  {
129   s=q;
130   BACKSQL_NEXT_WORD;
131  }
132  //res=backsql_strcat(res,&res_len," AS ",s,NULL);//table alias
133  //oracle doesn't understand AS :(
134  res=backsql_strcat(res,&res_len," ",s,NULL);//table alias
135  return res;
136 }
137
138 int backsql_merge_from_clause(char **dest_from,int *dest_len,char *src_from)
139 {
140  char *s,*p,*srcc,*pos,e;
141
142  //Debug(LDAP_DEBUG_TRACE,"==>backsql_merge_from_clause(): dest_from='%s',src_from='%s'\n",
143  //                             dest_from,src_from,0);
144  srcc=strdup(src_from);
145  p=srcc;
146  while(*p)
147  {//4832041
148   s=backsql_get_table_spec(&p);
149  // Debug(LDAP_DEBUG_TRACE,"backsql_merge_from_clause(): p='%s' s='%s'\n",p,s,0);  
150   if (*dest_from==NULL)
151    *dest_from=backsql_strcat(*dest_from,dest_len,s,NULL);
152   else
153         if((pos=strstr(*dest_from,s))==NULL)
154      *dest_from=backsql_strcat(*dest_from,dest_len,",",s,NULL);
155     else if((e=pos[strlen(s)])!='\0' && e!=',')
156       *dest_from=backsql_strcat(*dest_from,dest_len,",",s,NULL);
157   if (s)
158         ch_free(s);
159  }
160 // Debug(LDAP_DEBUG_TRACE,"<==backsql_merge_from_clause()\n",0,0,0);
161  free(srcc);
162  return 1;
163 }