/* {{{ MADB_DescFree */ SQLRETURN MADB_DescFree(MADB_Desc *Desc, my_bool RecordsOnly) { MADB_DescRecord *Record; unsigned int i; if (!Desc) return SQL_ERROR; /* We need to free internal pointers first */ for (i=0; i < Desc->Records.elements; i++) { Record= ((MADB_DescRecord *)Desc->Records.buffer) + i; MADB_FREE(Record->InternalBuffer); MADB_FREE(Record->DefaultValue); if (Desc->DescType == MADB_DESC_IRD) { MADB_FREE(Record->CatalogName); MADB_FREE(Record->BaseCatalogName); MADB_FREE(Record->BaseColumnName); MADB_FREE(Record->BaseTableName); MADB_FREE(Record->ColumnName); MADB_FREE(Record->TableName); MADB_FREE(Record->TypeName); } } delete_dynamic(&Desc->Records); for (i=0; i < Desc->Stmts.elements; i++) { MADB_Stmt **XStmt= ((MADB_Stmt **)Desc->Stmts.buffer) + i; MADB_Stmt *Stmt= *XStmt; switch(Desc->DescType) { case MADB_DESC_ARD: Stmt->Ard=Stmt->IArd; break; case MADB_DESC_APD: Stmt->Apd= Stmt->IApd; break; } } delete_dynamic(&Desc->Stmts); if (Desc->AppType) { Desc->Dbc->Descrs= list_delete(Desc->Dbc->Stmts, &Desc->ListItem); } if (!RecordsOnly) MADB_FREE(Desc); return SQL_SUCCESS; }
void free_tmpdir(MY_TMPDIR *tmpdir) { uint i; if (!tmpdir->full_list.elements) return; for (i=0; i<=tmpdir->max; i++) my_free(tmpdir->list[i], MYF(0)); delete_dynamic(&tmpdir->full_list); pthread_mutex_destroy(&tmpdir->mutex); }
/** WT_RESOURCE destructor It's called from lf_hash and takes a pointer to an LF_SLIST instance. WT_RESOURCE is located at arg+sizeof(LF_SLIST) */ static void wt_resource_destroy(uchar *arg) { WT_RESOURCE *rc= (WT_RESOURCE*)(arg+LF_HASH_OVERHEAD); DBUG_ENTER("wt_resource_destroy"); DBUG_ASSERT(rc->owners.elements == 0); rc_rwlock_destroy(rc); mysql_cond_destroy(&rc->cond); delete_dynamic(&rc->owners); DBUG_VOID_RETURN; }
void my_dirend(MY_DIR *buffer) { DBUG_ENTER("my_dirend"); if (buffer) { delete_dynamic((DYNAMIC_ARRAY*)((char*)buffer + ALIGN_SIZE(sizeof(MY_DIR)))); free_root((MEM_ROOT*)((char*)buffer + ALIGN_SIZE(sizeof(MY_DIR)) + ALIGN_SIZE(sizeof(DYNAMIC_ARRAY))), MYF(0)); my_free(buffer); } DBUG_VOID_RETURN; } /* my_dirend */
my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist) { char *end, *copy; char buff[FN_REFLEN]; DBUG_ENTER("init_tmpdir"); DBUG_PRINT("enter", ("pathlist: %s", pathlist ? pathlist : "NULL")); mysql_mutex_init(key_TMPDIR_mutex, &tmpdir->mutex, MY_MUTEX_INIT_FAST); if (my_init_dynamic_array(&tmpdir->full_list, sizeof(char*), 1, 5)) goto err; if (!pathlist || !pathlist[0]) { /* Get default temporary directory */ pathlist=getenv("TMPDIR"); /* Use this if possible */ #if defined(_WIN32) if (!pathlist) pathlist=getenv("TEMP"); if (!pathlist) pathlist=getenv("TMP"); #endif if (!pathlist || !pathlist[0]) pathlist=(char*) P_tmpdir; } do { size_t length; end=strcend(pathlist, DELIM); strmake(buff, pathlist, (uint) (end-pathlist)); length= cleanup_dirname(buff, buff); if (!(copy= my_strndup(key_memory_MY_TMPDIR_full_list, buff, length, MYF(MY_WME))) || insert_dynamic(&tmpdir->full_list, ©)) DBUG_RETURN(TRUE); pathlist=end+1; } while (*end); freeze_size(&tmpdir->full_list); tmpdir->list=(char **)tmpdir->full_list.buffer; tmpdir->max=tmpdir->full_list.elements-1; tmpdir->cur=0; DBUG_RETURN(FALSE); err: delete_dynamic(&tmpdir->full_list); /* Safe to free */ mysql_mutex_destroy(&tmpdir->mutex); DBUG_RETURN(TRUE); }
my_bool free_dynamic_string_array(DYNAMIC_STRING_ARRAY *array) { DBUG_ENTER("free_dynamic_string_array"); if (array) { delete_dynamic(array->pos_info_arr); array->pos_info_arr = NULL; dynstr_free(array->dynstr); array->dynstr = NULL; my_free(array->pos_info_arr); my_free(array->dynstr); array->pos_info_arr = NULL; array->dynstr = NULL; array->cur_idx = 0; DBUG_RETURN(FALSE); } DBUG_RETURN(TRUE); }
static void clean_up(struct languages *lang_head, struct errors *error_head) { struct languages *tmp_lang, *next_language; struct errors *tmp_error, *next_error; uint count, i; my_free((void*) default_language); for (tmp_lang= lang_head; tmp_lang; tmp_lang= next_language) { next_language= tmp_lang->next_lang; my_free(tmp_lang->lang_short_name); my_free(tmp_lang->lang_long_name); my_free(tmp_lang->charset); my_free(tmp_lang); } for (tmp_error= error_head; tmp_error; tmp_error= next_error) { next_error= tmp_error->next_error; count= (tmp_error->msg).elements; for (i= 0; i < count; i++) { struct message *tmp; tmp= dynamic_element(&tmp_error->msg, i, struct message*); my_free(tmp->lang_short_name); my_free(tmp->text); } delete_dynamic(&tmp_error->msg); if (tmp_error->sql_code1[0]) my_free((void*) tmp_error->sql_code1); if (tmp_error->sql_code2[0]) my_free((void*) tmp_error->sql_code2); my_free((void*) tmp_error->er_name); my_free(tmp_error); } }
/* {{{ MADB_DescCopyDesc */ SQLRETURN MADB_DescCopyDesc(MADB_Desc *SrcDesc, MADB_Desc *DestDesc) { if (!SrcDesc) return SQL_INVALID_HANDLE; if (DestDesc->DescType == MADB_DESC_IRD) { MADB_SetError(&DestDesc->Error, MADB_ERR_HY016, NULL, 0); return SQL_ERROR; } if (!SrcDesc->Header.Count) { MADB_SetError(&DestDesc->Error, MADB_ERR_HY007, NULL, 0); return SQL_ERROR; } /* make sure there aren't old records */ delete_dynamic(&DestDesc->Records); if (my_init_dynamic_array(&DestDesc->Records, sizeof(MADB_DescRecord), SrcDesc->Records.elements, SrcDesc->Records.alloc_increment)) { MADB_SetError(&DestDesc->Error, MADB_ERR_HY001, NULL, 0); return SQL_ERROR; } memcpy(&DestDesc->Header, &SrcDesc->Header, sizeof(MADB_Header)); DestDesc->AppType= SrcDesc->AppType; DestDesc->DescType= SrcDesc->DescType; memcpy(&DestDesc->Error, &SrcDesc->Error, sizeof(MADB_Error)); /* Since we never allocate pointers we can just copy content */ memcpy(DestDesc->Records.buffer, SrcDesc->Records.buffer, SrcDesc->Records.size_of_element * SrcDesc->Records.max_element); /* todo: internal buffer needs to be clearead or we need to move it outside of record structure */ return SQL_SUCCESS; }
int my_load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv, const char ***default_directories) { DYNAMIC_ARRAY args; TYPELIB group; my_bool found_print_defaults= 0; uint args_used= 0; int error= 0; MEM_ROOT alloc; char *ptr,**res; struct handle_option_ctx ctx; const char **dirs; uint args_sep= my_getopt_use_args_separator ? 1 : 0; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc, 512, 0, MYF(0)); if ((dirs= init_default_directories(&alloc)) == NULL) goto err; /* Check if the user doesn't want any default option processing --no-defaults is always the first option */ if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i, j; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ j= 1; /* Start from 1 for the reset result args */ if (my_getopt_use_args_separator) { /* set arguments separator */ set_args_separator(&res[1]); j++; } for (i=2 ; i < (uint) *argc ; i++, j++) res[j]=argv[0][i]; res[j]=0; /* End pointer */ /* Update the argc, if have not added args separator, then we have to decrease argc because we have removed the "--no-defaults". */ if (!my_getopt_use_args_separator) (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ if (default_directories) *default_directories= dirs; DBUG_RETURN(0); } group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32, MYF(0))) goto err; ctx.alloc= &alloc; ctx.args= &args; ctx.group= &group; error= my_search_option_files(conf_file, argc, argv, &args_used, handle_default_option, (void *) &ctx, dirs); /* Here error contains <> 0 only if we have a fully specified conf_file or a forced default file */ if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc + 1 + args_sep) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]= argv[0][0]; /* Name MUST be set, even by embedded library */ memcpy((uchar*) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skip --defaults-xxx options */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list This options must always be the last of the default options */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skip argument */ } if (my_getopt_use_args_separator) { /* set arguments separator for arguments from config file and command line */ set_args_separator(&res[args.elements+1]); } if (*argc) memcpy((uchar*) (res+1+args.elements+args_sep), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc+args_sep]=0; /* last null */ (*argc)+=args.elements+args_sep; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) if (!my_getopt_is_args_separator((*argv)[i])) /* skip arguments separator */ printf("%s ", (*argv)[i]); puts(""); exit(0); } if (error == 0 && default_directories) *default_directories= dirs; DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }
void load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv) { DYNAMIC_ARRAY args; const char **dirs, *forced_default_file; TYPELIB group; my_bool found_print_defaults=0; uint args_used=0; MEM_ROOT alloc; char *ptr,**res; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc,128,0); if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ for (i=2 ; i < (uint) *argc ; i++) res[i-1]=argv[0][i]; (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ DBUG_VOID_RETURN; } /* Check if we want to force the use a specific default file */ forced_default_file=0; if (*argc >= 2) { if (is_prefix(argv[0][1],"--defaults-file=")) { forced_default_file=strchr(argv[0][1],'=')+1; args_used++; } else if (is_prefix(argv[0][1],"--defaults-extra-file=")) { defaults_extra_file=strchr(argv[0][1],'=')+1; args_used++; } } group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32)) goto err; if (forced_default_file) { if (search_default_file(&args, &alloc, "", forced_default_file, "", &group)) goto err; } else if (dirname_length(conf_file)) { if (search_default_file(&args, &alloc, NullS, conf_file, default_ext, &group)) goto err; } else { #ifdef _WIN32 char system_dir[FN_REFLEN]; GetWindowsDirectory(system_dir,sizeof(system_dir)); if (search_default_file(&args, &alloc, system_dir, conf_file, windows_ext, &group)) goto err; #endif #if defined(__EMX__) || defined(OS2) if (getenv("ETC") && search_default_file(&args, &alloc, getenv("ETC"), conf_file, default_ext, &group)) goto err; #endif for (dirs=default_directories ; *dirs; dirs++) { int error=0; if (**dirs) error=search_default_file(&args, &alloc, *dirs, conf_file, default_ext, &group); else if (defaults_extra_file) error=search_default_file(&args, &alloc, NullS, defaults_extra_file, default_ext, &group); if (error) goto err; } } if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]=argv[0][0]; memcpy((gptr) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skipp --defaults-file and --defaults-extra-file */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skipp argument */ } memcpy((gptr) (res+1+args.elements), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc]=0; /* last null */ (*argc)+=args.elements; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) printf("%s ", (*argv)[i]); puts(""); exit(1); } DBUG_VOID_RETURN; err: fprintf(stderr,"Program aborted\n"); exit(1); }
virtual ~string_ref_list_wrap() { if (string_ref_list_init) delete_dynamic(&string_ref_list); }
int load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv) { DYNAMIC_ARRAY args; const char **dirs, *forced_default_file, *forced_extra_defaults; TYPELIB group; my_bool found_print_defaults=0; uint args_used=0; int error= 0; MEM_ROOT alloc; char *ptr, **res; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc,512,0); if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ for (i=2 ; i < (uint) *argc ; i++) res[i-1]=argv[0][i]; res[i-1]=0; /* End pointer */ (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ DBUG_RETURN(0); } get_defaults_files(*argc, *argv, (char **)&forced_default_file, (char **)&forced_extra_defaults); if (forced_default_file) forced_default_file= strchr(forced_default_file,'=')+1; if (forced_extra_defaults) defaults_extra_file= strchr(forced_extra_defaults,'=')+1; args_used+= (forced_default_file ? 1 : 0) + (forced_extra_defaults ? 1 : 0); group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32)) goto err; if (forced_default_file) { if ((error= search_default_file_with_ext(&args, &alloc, "", "", forced_default_file, &group, 0)) < 0) goto err; if (error > 0) { fprintf(stderr, "Could not open required defaults file: %s\n", forced_default_file); goto err; } } else if (dirname_length(conf_file)) { if ((error= search_default_file(&args, &alloc, NullS, conf_file, &group)) < 0) goto err; } else { #ifdef __WIN__ char system_dir[FN_REFLEN]; GetWindowsDirectory(system_dir,sizeof(system_dir)); if ((search_default_file(&args, &alloc, system_dir, conf_file, &group))) goto err; #endif #if defined(__EMX__) || defined(OS2) { const char *etc; if ((etc= getenv("ETC")) && (search_default_file(&args, &alloc, etc, conf_file, &group)) < 0) goto err; } #endif for (dirs=default_directories ; *dirs; dirs++) { if (**dirs) { if (search_default_file(&args, &alloc, *dirs, conf_file, &group) < 0) goto err; } else if (defaults_extra_file) { if (search_default_file(&args, &alloc, NullS, defaults_extra_file, &group) < 0) goto err; /* Fatal error */ } } } /* Here error contains <> 0 only if we have a fully specified conf_file or a forced default file */ if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]= argv[0][0]; /* Name MUST be set, even by embedded library */ memcpy((gptr) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skip --defaults-file and --defaults-extra-file */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skip argument */ } if (*argc) memcpy((gptr) (res+1+args.elements), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc]=0; /* last null */ (*argc)+=args.elements; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) printf("%s ", (*argv)[i]); puts(""); exit(0); } DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }
hstresult::~hstresult() { delete_dynamic(&flds); }
hstcpcli::~hstcpcli() { delete_dynamic(&flds); }