Back to home page

Enduro/X

 
 

    


0001 /**
0002  * @brief UBF library internals
0003  *
0004  * @file ubf_int.h
0005  */
0006 /* -----------------------------------------------------------------------------
0007  * Enduro/X Middleware Platform for Distributed Transaction Processing
0008  * Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0009  * Copyright (C) 2017-2023, Mavimax, Ltd. All Rights Reserved.
0010  * This software is released under one of the following licenses:
0011  * AGPL (with Java and Go exceptions) or Mavimax's license for commercial use.
0012  * See LICENSE file for full text.
0013  * -----------------------------------------------------------------------------
0014  * AGPL license:
0015  *
0016  * This program is free software; you can redistribute it and/or modify it under
0017  * the terms of the GNU Affero General Public License, version 3 as published
0018  * by the Free Software Foundation;
0019  *
0020  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0021  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0022  * PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0023  * for more details.
0024  *
0025  * You should have received a copy of the GNU Affero General Public License along 
0026  * with this program; if not, write to the Free Software Foundation, Inc.,
0027  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0028  *
0029  * -----------------------------------------------------------------------------
0030  * A commercial use license is available from Mavimax, Ltd
0031  * contact@mavimax.com
0032  * -----------------------------------------------------------------------------
0033  */
0034 #ifndef __UBF_INT_H
0035 #define __UBF_INT_H
0036 
0037 #ifdef  __cplusplus
0038 extern "C" {
0039 #endif
0040 
0041 
0042 /*---------------------------Includes-----------------------------------*/
0043 #include <ubf.h>
0044 #include <string.h>
0045 #include <stdio.h>
0046 #include <exhash.h>
0047 #include <ndrstandard.h>
0048 #include <ndrx_config.h>
0049 #include <fdatatype.h>
0050 #include <nstdutil.h>
0051 
0052 /*---------------------------Externs------------------------------------*/
0053 /*---------------------------Macros-------------------------------------*/
0054 #define UBF_BINARY_SEARCH_OK(bfldid) ((bfldid>>EFFECTIVE_BITS) < BFLD_STRING || (bfldid>>EFFECTIVE_BITS)==BFLD_PTR)
0055     
0056     
0057 #define UBF_BINSRCH_GET_LAST_NONE       0x00
0058 #define UBF_BINSRCH_GET_LAST            0x01
0059 #define UBF_BINSRCH_GET_LAST_CHG        0x02 /**< for change              */
0060     
0061 #define UBF_CMP_MODE_STD          0x00000001 /**< standard compare mode   */
0062 
0063 /* Print some debug out there! */
0064 #define UBFDEBUG(x) do { fprintf(stderr, x); } while(0);
0065     
0066 #define UBFDEBUGLEV "UBF_E_"
0067 
0068 /* #define UBF_16 */
0069 
0070 #ifdef UBF_16
0071 
0072 /* Currently we run in 16 bit mode. */
0073 #define EFFECTIVE_BITS  ((sizeof(_UBF_INT)-2)*8-3)
0074 /* This is ((2^((sizeof(_UBF_INT)-2)*8-3))-1)
0075  * 2^(2*8-3) - 1 = > 8191 = 0x1fff
0076  */
0077 #define EFFECTIVE_BITS_MASK  0x1fff
0078 
0079 #else
0080 
0081 /* 32 bit mode, effective bits - 25. */
0082 /* Max number: */
0083 #define EFFECTIVE_BITS  25
0084 /* Effective bits mask */
0085 #define EFFECTIVE_BITS_MASK  0x1FFFFFF
0086 
0087 #endif
0088 
0089 #define BFLD_SHORT_SIZE sizeof(unsigned short)
0090 #define BFLD_LONG_SIZE  sizeof(long)
0091 #define BFLD_CHAR_SIZE  sizeof(char)
0092 #define BFLD_FLOAT_SIZE sizeof(float)
0093 #define BFLD_DOUBLE_SIZE    sizeof(double)
0094 #define BFLD_STRING_SIZE    0
0095 #define BFLD_CARRAY_SIZE    0
0096 #define BFLD_INT_SIZE       sizeof(int)
0097 #define BFLD_PTR_SIZE       sizeof(char *)
0098 #define BFLD_UBF_SIZE       sizeof(UBF_ubf_t)
0099 /** strip field id & align off */
0100 #define BFLD_VIEW_SIZE      (sizeof(UBF_view_t) - EX_ALIGNMENT_BYTES)
0101 
0102 
0103 /* #define UBF_API_DEBUG   1 *//* Provide lots of debugs from UBF API? */
0104 /* #define BIN_SEARCH_DEBUG        1*/
0105     
0106 #define VALIDATE_MODE_NO_FLD    0x1
0107 
0108 #define IS_TYPE_INVALID(T) (T<BFLD_MIN || T>BFLD_MAX)
0109     
0110 /**
0111  * Check is this complex type, no conversions, etc..
0112  * @param T type to check
0113  */
0114 #define IS_TYPE_COMPLEX(T) (BFLD_UBF==T||BFLD_VIEW==T)
0115 
0116 #define CHECK_ALIGN(p, p_ub, hdr) (((long)p) > ((long)p_ub+hdr->bytes_used))
0117 
0118 /*
0119  * Projection copy internal mode
0120  */
0121 #define PROJ_MODE_PROJ        0
0122 #define PROJ_MODE_DELETE      1
0123 #define PROJ_MODE_DELALL      2
0124 
0125 /**
0126  * Conversation buffer allocation mode
0127  */
0128 #define CB_MODE_DEFAULT        0
0129 #define CB_MODE_TEMPSPACE      1
0130 #define CB_MODE_ALLOC          2
0131 
0132 #define DOUBLE_EQUAL        0.000001
0133 #define FLOAT_EQUAL         0.00001
0134 
0135 #define DOUBLE_RESOLUTION   6
0136 #define FLOAT_RESOLUTION    5
0137     
0138     
0139 #define UBF_EOF(HDR, FIELD) ((char *)FIELD >= (((char *)HDR) + HDR->bytes_used))
0140 
0141 /**
0142  * UBF buffer alloc
0143  */
0144 #define NDRX_USYSBUF_MALLOC_WERR_OUT(__buf, __p_bufsz, __ret)  \
0145 {\
0146     int __buf_size__ = NDRX_MSGSIZEMAX;\
0147     __buf = NDRX_FPMALLOC(__buf_size__, NDRX_FPSYSBUF);\
0148     if (NULL==__buf)\
0149     {\
0150         int err = errno;\
0151         ndrx_Bset_error_fmt(BMALLOC, "%s: failed to allocate sysbuf: %s", __func__, strerror(errno));\
0152         NDRX_LOG(log_error, "%s: failed to allocate sysbuf: %s", __func__, strerror(errno));\
0153         userlog("%s: failed to allocate sysbuf: %s", __func__, strerror(errno));\
0154         errno = err;\
0155         EXFAIL_OUT(__ret);\
0156     }\
0157     __p_bufsz = __buf_size__;\
0158 }
0159 
0160 /* for sparc we set to 8 */
0161 #define DEFAULT_ALIGN       EX_ALIGNMENT_BYTES
0162     
0163     
0164 #if EX_ALIGNMENT_BYTES == 8
0165 
0166 #define ALIGNED_SIZE(DSIZE) \
0167     ((sizeof(BFLDID)*2 + DSIZE + DEFAULT_ALIGN - 1) / DEFAULT_ALIGN * DEFAULT_ALIGN)
0168 #else
0169 
0170 #define ALIGNED_SIZE(DSIZE) \
0171     ((sizeof(BFLDID) + DSIZE + DEFAULT_ALIGN -1 ) / DEFAULT_ALIGN * DEFAULT_ALIGN)
0172 #endif
0173    
0174 /**
0175  * Get aligned size with the data
0176  * @param TNAME type name this shall include standard field id with 8 alignment if needed
0177  */
0178 #define ALIGNED_SIZE_T(TNAME, DSIZE) \
0179     ((sizeof(TNAME) + DSIZE + DEFAULT_ALIGN -1 ) / DEFAULT_ALIGN * DEFAULT_ALIGN)
0180 
0181 /**
0182  * Generic data alignment to default system ALGIN setting
0183  * @param DSIZE data on which to calc alignment
0184  */
0185 #define ALIGNED_GEN(DSIZE) \
0186     ((DSIZE + DEFAULT_ALIGN -1 ) / DEFAULT_ALIGN * DEFAULT_ALIGN)
0187     
0188 #define VIEW_ENTRY if (EXSUCCEED!=ndrx_view_init()) {EXFAIL_OUT(ret);}
0189 #define VIEW_ENTRY2 if (EXSUCCEED!=ndrx_view_init()) {ret=-2; goto out;}
0190 #define VIEW_ENTRY3 if (EXSUCCEED!=ndrx_view_init()) {return EXFAIL;}
0191 /*---------------------------Enums--------------------------------------*/
0192 /*---------------------------Typedefs-----------------------------------*/    
0193 
0194 /**
0195  * Recursive field id with dot syntax
0196  */
0197 typedef struct
0198 {
0199     ndrx_growlist_t fldidocc;   /**< array of: fldid1,fldocc1,fldid2,occ2,-1  */
0200     char *cname;        /**< In case if leaf view, have a malloced field name */
0201     BFLDOCC cname_occ;  /**< occurrence for view field                        */
0202     
0203     /* last UBF name        */
0204     char *fldnm;
0205     
0206     /* last field cached...*/
0207     BFLDID bfldid;
0208     BFLDOCC occ;
0209     int nrflds;
0210     
0211 } ndrx_ubf_rfldid_t;
0212 
0213 /*---------------------------Globals------------------------------------*/
0214 /*---------------------------Statics------------------------------------*/
0215 /*---------------------------Prototypes---------------------------------*/
0216     
0217 extern NDRX_API int ndrx_get_num_from_hex(char c);
0218 extern NDRX_API int ndrx_normalize_string(char *str, int *out_len);
0219 
0220 extern NDRX_API void ndrx_build_printable_string(char *out, int out_len, char *in, 
0221         int in_len);
0222 
0223 extern NDRX_API int ndrx_get_nonprintable_char_tmpspace(char *str, int len);
0224 
0225 extern char * get_fld_loc_binary_search(UBFH * p_ub, BFLDID bfldid, BFLDOCC occ,
0226                             dtype_str_t **fld_dtype, int get_last, int *last_occ, 
0227                             char ** last_checked, char ** last_match);
0228 extern char * get_fld_loc(UBFH * p_ub, BFLDID bfldid, BFLDOCC occ,
0229                             dtype_str_t **fld_dtype,
0230                             char ** last_checked,
0231                             char ** last_matched,
0232                             int *last_occ,
0233                             Bfld_loc_info_t *last_start);
0234 extern void ubf_cache_shift(UBFH *p_ub, BFLDID fldid, int size_diff);
0235 extern void ubf_cache_dump(UBFH *p_ub, char *msg);
0236 extern int ubf_cache_update(UBFH *p_ub);
0237 
0238 extern int ndrx_Bget (UBFH * p_ub, BFLDID bfldid, BFLDOCC occ,
0239                             char * buf, BFLDLEN * buflen);
0240 extern int ndrx_Badd (UBFH *p_ub, BFLDID bfldid, char *buf, BFLDLEN len,
0241                                 Bfld_loc_info_t *last_start, 
0242                 Bfld_loc_info_t *next_fld);
0243 extern int ndrx_Baddfast (UBFH *p_ub, BFLDID bfldid, char *buf, BFLDLEN len, 
0244     Bfld_loc_info_t *next_fld);
0245 extern int ndrx_Bchg (UBFH *p_ub, BFLDID bfldid, BFLDOCC occ,
0246                             char * buf, BFLDLEN len, Bfld_loc_info_t *last_start, 
0247                             int upd_only);
0248 extern int have_buffer_size(UBFH *p_ub, int add_size, int set_err);
0249 extern int validate_entry(UBFH *p_ub, BFLDID bfldid, BFLDOCC occ, int mode);
0250 extern char * ndrx_Bfind (UBFH * p_ub, BFLDID bfldid,
0251                                         BFLDOCC occ, BFLDLEN * len,
0252                                         char **p_fld);
0253 extern BFLDOCC ndrx_Boccur (UBFH * p_ub, BFLDID bfldid);
0254 extern int _Bpres (UBFH *p_ub, BFLDID bfldid, BFLDOCC occ);
0255 
0256 extern char * ndrx_CBfind (UBFH *p_ub, BFLDID bfldid,
0257                         BFLDOCC occ, BFLDLEN * len, int usrtype, int mode,
0258                         int extralen);
0259 extern char * ndrx_Bgetalloc (UBFH * p_ub,
0260                             BFLDID bfldid, BFLDOCC occ, BFLDLEN *extralen);
0261 extern char * ndrx_Bfindlast (UBFH * p_ub, BFLDID bfldid,
0262                                                 BFLDOCC *occ,
0263                                                 BFLDLEN * len);
0264 extern char * ndrx_Btypcvt (BFLDLEN * to_len, int to_type,
0265                     char *from_buf, int from_type, BFLDLEN from_len);
0266 
0267 extern int ndrx_Bfprint (UBFH *p_ub, FILE * outf, 
0268         ndrx_plugin_tplogprintubf_hook_t p_writef, void *dataptr1, int level);
0269 
0270 extern int ndrx_Bnext(Bnext_state_t *state, UBFH *p_ub, BFLDID *bfldid,
0271                                 BFLDOCC *occ, char *buf, BFLDLEN *len,
0272                                 char **d_ptr);
0273 extern int ndrx_Bproj (UBFH * p_ub, BFLDID * fldlist,
0274                                     int mode, int *processed);
0275 
0276 extern int ndrx_Bprojcpy (UBFH * p_ub_dst, UBFH * p_ub_src,
0277                                     BFLDID * fldlist);
0278 extern int ndrx_Bupdate (UBFH *p_ub_dst, UBFH *p_ub_src);
0279 extern int ndrx_Bconcat (UBFH *p_ub_dst, UBFH *p_ub_src);
0280 extern BFLDOCC ndrx_Bfindocc (UBFH *p_ub, BFLDID bfldid, char * buf, BFLDLEN len);
0281 extern BFLDOCC ndrx_CBfindocc (UBFH *p_ub, BFLDID bfldid, char * value, BFLDLEN len, int usrtype);
0282 extern int ndrx_Bgetlast (UBFH *p_ub, BFLDID bfldid,
0283                                    BFLDOCC *occ, char *buf, BFLDLEN *len);
0284 extern int ndrx_Bextread (UBFH * p_ub, FILE *inf,
0285         long (*p_readf)(char *buffer, long bufsz, void *dataptr1), void *dataptr1,
0286         int level, char **p_readbuf_buffered);
0287 extern void ndrx_Bboolpr (char * tree, FILE *outf, 
0288         int (*p_writef)(char *buffer, long datalen, void *dataptr1), void *dataptr1);
0289 extern int ndrx_Bread  (UBFH * p_ub, FILE * inf,
0290         long (*p_readf)(char *buffer, long bufsz, void *dataptr1), void *dataptr1);
0291 extern int ndrx_Bwrite (UBFH *p_ub, FILE * outf,
0292         long (*p_writef)(char *buffer, long bufsz, void *dataptr1), void *dataptr1);
0293 extern int ndrx_Blen (UBFH *p_ub, BFLDID bfldid, BFLDOCC occ);
0294 extern int ndrx_Bboolsetcbf2 (char *funcname, void *funcptr, int functype);
0295 
0296 extern int ndrx_Bcmp(UBFH *p_ubf1, UBFH *p_ubf2);
0297 extern int ndrx_Bsubset(UBFH *p_ubf1, UBFH *p_ubf2, int level);
0298 
0299 extern BFLDOCC ndrx_Bnum(UBFH *p_ub);
0300 
0301 extern int ndrx_Bjoin(UBFH *dest, UBFH *src);
0302 extern int ndrx_Bojoin(UBFH *dest, UBFH *src);
0303 
0304 extern UBFH * ndrx_Balloc (BFLDOCC f, BFLDLEN v, long len_set);
0305 extern UBFH * ndrx_Brealloc (UBFH *p_ub, BFLDOCC f, BFLDLEN v, long len_set);
0306 
0307 extern long ndrx_Bneeded(BFLDOCC nrfields, BFLDLEN totsize);
0308 
0309 /* FLD_PTR support: */
0310 extern NDRX_API int ndrx_cmp_ptr (struct dtype_ext1 *t, char *val1, BFLDLEN len1, 
0311         char *val2, BFLDLEN len2, long mode);
0312 extern NDRX_API void ndrx_dump_ptr (struct dtype_ext1 *t, char *text, char *data, int *len);
0313 
0314 /* FLD_UBF support: */
0315 
0316 extern NDRX_API int ndrx_get_fb_ubf_size(dtype_str_t *t, char *fb, int *payload_size);
0317 extern NDRX_API int ndrx_put_data_ubf(dtype_str_t *t, char *fb, BFLDID bfldid, 
0318         char *data, int len);
0319 extern NDRX_API int ndrx_get_d_size_ubf (struct dtype_str *t, char *data, 
0320         int len, int *payload_size);
0321 extern NDRX_API int ndrx_get_data_ubf (struct dtype_str *t, char *fb, char *buf, int *len);
0322 extern NDRX_API int ndrx_g_ubf_empty(struct dtype_ext1* t);
0323 extern NDRX_API int ndrx_put_empty_ubf(struct dtype_ext1* t, char *fb, BFLDID bfldid);
0324 extern NDRX_API void ndrx_dump_ubf(struct dtype_ext1 *t, char *text, char *data, int *len);
0325 extern NDRX_API int ndrx_cmp_ubf (struct dtype_ext1 *t, char *val1, BFLDLEN len1, 
0326         char *val2, BFLDLEN len2, long mode);
0327 extern NDRX_API int ndrx_cmp_view (struct dtype_ext1 *t, char *val1, BFLDLEN len1, 
0328         char *val2, BFLDLEN len2, long mode);
0329 extern NDRX_API char *ndrx_talloc_view (struct dtype_ext1 *t, int *len);
0330 
0331 
0332 /* FLD_VIEW support: */
0333 
0334 extern NDRX_API int ndrx_get_fb_view_size(dtype_str_t *t, char *fb, int *payload_size);
0335 extern NDRX_API int ndrx_put_data_view(dtype_str_t *t, char *fb, BFLDID bfldid, 
0336         char *data, int len);
0337 extern NDRX_API int ndrx_get_d_size_view (struct dtype_str *t, char *data, 
0338         int len, int *payload_size);
0339 extern NDRX_API int ndrx_get_data_view (struct dtype_str *t, char *fb, char *buf, int *len);
0340 extern NDRX_API int ndrx_g_view_empty(struct dtype_ext1* t);
0341 extern NDRX_API int ndrx_put_empty_view(struct dtype_ext1* t, char *fb, BFLDID bfldid);
0342 extern NDRX_API void ndrx_dump_view(struct dtype_ext1 *t, char *text, char *data, int *len);
0343 extern NDRX_API int ndrx_cmp_view (struct dtype_ext1 *t, char *val1, BFLDLEN len1, 
0344         char *val2, BFLDLEN len2, long mode);
0345 extern NDRX_API char *ndrx_talloc_view (struct dtype_ext1 *t, int *len);
0346 
0347 extern NDRX_API char* ndrx_prep_viewp (struct dtype_ext1 *t, 
0348         ndrx_ubf_tls_bufval_t *storage, char *data);
0349 
0350 
0351 /* Recursive API: */
0352 extern NDRX_API int ndrx_Bgetr (UBFH * p_ub, BFLDID *fldidocc,
0353                             char * buf, BFLDLEN * buflen);
0354 
0355 
0356 extern NDRX_API int ndrx_Bpresr (UBFH *p_ub, BFLDID *fldidocc);
0357 
0358 extern NDRX_API char * ndrx_CBgetallocr (UBFH *p_ub, BFLDID *fldidocc, int usrtype, BFLDLEN *extralen);
0359 
0360 extern NDRX_API int ndrx_CBgetr (UBFH * p_ub, BFLDID *fldidocc,
0361                             char * buf, BFLDLEN * len, int usrtype);
0362 extern NDRX_API char* ndrx_Bfindr (UBFH *p_ub, BFLDID *fldidocc, BFLDLEN *p_len);
0363 
0364 extern NDRX_API char* ndrx_CBfindr (UBFH *p_ub, BFLDID *fldidocc, BFLDLEN *p_len, int usrtype);
0365 
0366 extern NDRX_API int ndrx_Bpresr (UBFH *p_ub, BFLDID *fldidocc);
0367 
0368 extern NDRX_API int ndrx_Bvnullr(UBFH *p_ub, BFLDID *fldidocc, char *cname, BFLDOCC occ);
0369 extern NDRX_API int ndrx_CBvgetr(UBFH *p_ub, BFLDID *fldidocc, char *cname, BFLDOCC occ, 
0370              char *buf, BFLDLEN *len, int usrtype, long flags);
0371 
0372 extern NDRX_API char *ndrx_CBvgetallocr(UBFH *p_ub, BFLDID *fldidocc, char *cname, BFLDOCC occ, 
0373              int usrtype, long flags, BFLDLEN *extralen);
0374 
0375 extern NDRX_API void ndrx_ubf_rfldid_free(ndrx_ubf_rfldid_t *rfldid);
0376 extern NDRX_API int ndrx_ubf_rfldid_parse(char *rfldidstr, ndrx_ubf_rfldid_t *rfldid);
0377 
0378 #ifdef  __cplusplus
0379 }
0380 #endif
0381 
0382 #endif  /* __UBF_INT_H */
0383 /* vim: set ts=4 sw=4 et smartindent: */