~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/item/create.cc

  • Committer: Brian Aker
  • Date: 2009-02-17 00:40:38 UTC
  • mfrom: (873.2.30 devel)
  • Revision ID: brian@tangent.org-20090217004038-ivu0noxx1958wwls
Merge from Monty.

Show diffs side-by-side

added added

removed removed

Lines of Context:
121
121
#include <drizzled/function/unsigned.h>
122
122
#include <drizzled/function/update_hash.h>
123
123
 
 
124
#include <map>
 
125
 
 
126
using namespace std;
124
127
 
125
128
class Item;
126
129
 
2978
2981
  { {0, 0}, NULL}
2979
2982
};
2980
2983
 
2981
 
static HASH native_functions_hash;
2982
 
 
2983
 
extern "C" unsigned char*
2984
 
get_native_fct_hash_key(const unsigned char *buff, size_t *length,
2985
 
                        bool /* unused */)
2986
 
{
2987
 
  Native_func_registry *func= (Native_func_registry*) buff;
2988
 
  *length= func->name.length;
2989
 
  return (unsigned char*) func->name.str;
2990
 
}
 
2984
static map<string, Native_func_registry *> native_functions_map;
2991
2985
 
2992
2986
/*
2993
2987
  Load the hash table for native functions.
2997
2991
 
2998
2992
int item_create_init()
2999
2993
{
 
2994
  string func_name;
 
2995
 
3000
2996
  Native_func_registry *func;
3001
 
 
3002
 
  if (hash_init(& native_functions_hash,
3003
 
                system_charset_info,
3004
 
                array_elements(func_array),
3005
 
                0,
3006
 
                0,
3007
 
                (hash_get_key) get_native_fct_hash_key,
3008
 
                NULL,                          /* Nothing to free */
3009
 
                MYF(0)))
3010
 
    return(1);
3011
 
 
3012
2997
  for (func= func_array; func->builder != NULL; func++)
3013
2998
  {
3014
 
    if (my_hash_insert(& native_functions_hash, (unsigned char*) func))
3015
 
      return(1);
 
2999
    func_name.assign(func->name.str, func->name.length);
 
3000
    transform(func_name.begin(), func_name.end(), func_name.begin(), ::tolower);
 
3001
 
 
3002
    native_functions_map[func_name]= func;
3016
3003
  }
3017
3004
 
3018
 
  return(0);
3019
 
}
3020
 
 
3021
 
/*
3022
 
  Empty the hash table for native functions.
3023
 
  Note: this code is not thread safe, and is intended to be used at server
3024
 
  shutdown only (after thread requests have been executed).
3025
 
*/
3026
 
 
3027
 
void item_create_cleanup()
3028
 
{
3029
 
  hash_free(& native_functions_hash);
3030
 
  return;
3031
 
}
 
3005
  return 0;
 
3006
}
 
3007
 
3032
3008
 
3033
3009
Create_func *
3034
 
find_native_function_builder(Session *,
3035
 
                             LEX_STRING name)
 
3010
find_native_function_builder(LEX_STRING name)
3036
3011
{
3037
3012
  Native_func_registry *func;
3038
3013
  Create_func *builder= NULL;
3039
3014
 
3040
 
  /* Thread safe */
3041
 
  func= (Native_func_registry*) hash_search(& native_functions_hash,
3042
 
                                            (unsigned char*) name.str,
3043
 
                                             name.length);
3044
 
 
3045
 
  if (func)
 
3015
  string func_name(name.str, name.length);
 
3016
  transform(func_name.begin(), func_name.end(), func_name.begin(), ::tolower);
 
3017
 
 
3018
  map<string, Native_func_registry *>::iterator func_iter=
 
3019
    native_functions_map.find(func_name);
 
3020
 
 
3021
  if (func_iter != native_functions_map.end())
3046
3022
  {
 
3023
    func= (*func_iter).second;
3047
3024
    builder= func->builder;
3048
3025
  }
3049
3026