~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/benchmark/benchmarkudf.cc

  • Committer: devananda
  • Date: 2009-07-01 17:38:47 UTC
  • mto: (1093.1.7 captain)
  • mto: This revision was merged to the branch mainline in revision 1095.
  • Revision ID: devananda.vdv@gmail.com-20090701173847-3n3mbtessg5ff35e
refactored function/benchmark into plugin/benchmark

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* 
 
2
 -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 
3
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
4
 */
 
5
 
 
6
#include <drizzled/server_includes.h>
 
7
#include <drizzled/error.h>
 
8
#include <drizzled/session.h>
 
9
 
 
10
using namespace std;
 
11
 
 
12
class Item_func_benchmark :public Item_int_func
 
13
{
 
14
public:
 
15
//  Item_func_benchmark(Item *count_expr, Item *expr) :Item_int_func(count_expr, expr)  {}
 
16
  Item_func_benchmark() :Item_int_func() {}
 
17
  int64_t val_int();
 
18
  virtual void print(String *str, enum_query_type query_type);
 
19
 
 
20
  const char *func_name() const      { return "benchmark"; }
 
21
  void fix_length_and_dec()          { max_length=1; maybe_null=0; }
 
22
  bool check_argument_count(int n)   { return (n==2); }
 
23
};
 
24
 
 
25
 
 
26
/* This function is just used to test speed of different functions */
 
27
int64_t Item_func_benchmark::val_int()
 
28
{
 
29
  assert(fixed == 1);
 
30
  char buff[MAX_FIELD_WIDTH];
 
31
  String tmp(buff,sizeof(buff), &my_charset_bin);
 
32
  my_decimal tmp_decimal;
 
33
  Session *session=current_session;
 
34
  uint64_t loop_count;
 
35
 
 
36
  loop_count= (uint64_t) args[0]->val_int();
 
37
 
 
38
  if (args[0]->null_value ||
 
39
      (!args[0]->unsigned_flag && (((int64_t) loop_count) < 0)))
 
40
  {
 
41
    if (!args[0]->null_value)
 
42
    {
 
43
      llstr(((int64_t) loop_count), buff);
 
44
      push_warning_printf(current_session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
 
45
                          ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE),
 
46
                          "count", buff, "benchmark");
 
47
    }
 
48
 
 
49
    null_value= 1;
 
50
    return 0;
 
51
  }
 
52
 
 
53
  null_value=0;
 
54
  for (uint64_t loop=0 ; loop < loop_count && !session->killed; loop++)
 
55
  {
 
56
    switch (args[1]->result_type()) {
 
57
    case REAL_RESULT:
 
58
      (void) args[1]->val_real();
 
59
      break;
 
60
    case INT_RESULT:
 
61
      (void) args[1]->val_int();
 
62
      break;
 
63
    case STRING_RESULT:
 
64
      (void) args[1]->val_str(&tmp);
 
65
      break;
 
66
    case DECIMAL_RESULT:
 
67
      (void) args[1]->val_decimal(&tmp_decimal);
 
68
      break;
 
69
    case ROW_RESULT:
 
70
    default:
 
71
      // This case should never be chosen
 
72
      assert(0);
 
73
      return 0;
 
74
    }
 
75
  }
 
76
  return 0;
 
77
}
 
78
 
 
79
void Item_func_benchmark::print(String *str, enum_query_type query_type)
 
80
{
 
81
  str->append(STRING_WITH_LEN("benchmark("));
 
82
  args[0]->print(str, query_type);
 
83
  str->append(',');
 
84
  args[1]->print(str, query_type);
 
85
  str->append(')');
 
86
}
 
87
 
 
88
Create_function<Item_func_benchmark> benchmarkudf(string("benchmark"));
 
89
 
 
90
static int initialize(PluginRegistry &registry)
 
91
{
 
92
  registry.add(&benchmarkudf);
 
93
  return 0;
 
94
}
 
95
 
 
96
drizzle_declare_plugin(benchmark)
 
97
{
 
98
  "benchmark",
 
99
  "0.1",
 
100
  "Devananda van der Veen",
 
101
  "Measure time for repeated calls to a function.",
 
102
  PLUGIN_LICENSE_GPL,
 
103
  initialize, /* Plugin Init */
 
104
  NULL,   /* Plugin Deinit */
 
105
  NULL,   /* status variables */
 
106
  NULL,   /* system variables */
 
107
  NULL    /* config options */
 
108
}
 
109
drizzle_declare_plugin_end;