~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/db.cc

  • Committer: Stewart Smith
  • Date: 2009-07-09 01:35:10 UTC
  • mto: (1095.1.3 merge)
  • mto: This revision was merged to the branch mainline in revision 1096.
  • Revision ID: stewart@flamingspork.com-20090709013510-ucci2fdb191chi0l
fix SHOW CREATE DATABASE for default collation. Move database metadata reading code around to be a bit more sane.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#include <drizzled/lock.h>
35
35
#include <drizzled/errmsg_print.h>
36
36
#include <drizzled/transaction_services.h>
 
37
#include <drizzled/message/schema.pb.h>
37
38
 
38
39
extern drizzled::TransactionServices transaction_services;
39
40
 
72
73
 
73
74
const CHARSET_INFO *get_default_db_collation(const char *db_name)
74
75
{
75
 
  HA_CREATE_INFO db_info;
76
 
 
77
 
  /*
78
 
    db_info.default_table_charset contains valid character set
79
 
    (collation_server).
80
 
  */
81
 
 
82
 
  load_db_opt_by_name(db_name, &db_info);
83
 
 
84
 
  return db_info.default_table_charset;
 
76
  drizzled::message::Schema db;
 
77
 
 
78
  get_database_metadata(db_name, &db);
 
79
 
 
80
  /* If for some reason the db.opt file lacks a collation,
 
81
     we just return the default */
 
82
 
 
83
  if (db.has_collation())
 
84
  {
 
85
    const string buffer= db.collation();
 
86
    const CHARSET_INFO* cs= get_charset_by_name(buffer.c_str());
 
87
 
 
88
    if (!cs)
 
89
    {
 
90
      errmsg_printf(ERRMSG_LVL_ERROR,
 
91
                    _("Error while loading database options: '%s':"),db_name);
 
92
      errmsg_printf(ERRMSG_LVL_ERROR, ER(ER_UNKNOWN_COLLATION), buffer.c_str());
 
93
 
 
94
      return default_charset_info;
 
95
    }
 
96
 
 
97
    return cs;
 
98
  }
 
99
 
 
100
  return default_charset_info;
85
101
}
86
102
 
87
103
/* path is path to database, not schema file */
130
146
  return 0;
131
147
}
132
148
 
133
 
int load_db_opt(const char *path, HA_CREATE_INFO *create)
134
 
{
135
 
  drizzled::message::Schema db;
136
 
 
137
 
  memset(create, 0, sizeof(*create));
138
 
  create->default_table_charset= default_charset_info;
139
 
 
140
 
  int fd= open(path, O_RDONLY);
141
 
 
142
 
  if (fd == -1)
143
 
    return errno;
144
 
 
145
 
  if (!db.ParseFromFileDescriptor(fd))
146
 
  {
147
 
    close(fd);
148
 
    return -1;
149
 
  }
150
 
  close(fd);
151
 
 
152
 
  /* If for some reason the db.opt file lacks a collation, we just return the default */
153
 
  if (db.has_collation())
154
 
  {
155
 
    string buffer;
156
 
    buffer= db.collation();
157
 
    if (!(create->default_table_charset= get_charset_by_name(buffer.c_str())))
158
 
    {
159
 
      errmsg_printf(ERRMSG_LVL_ERROR,
160
 
                    _("Error while loading database options: '%s':"),path);
161
 
      errmsg_printf(ERRMSG_LVL_ERROR, ER(ER_UNKNOWN_COLLATION), buffer.c_str());
162
 
      create->default_table_charset= default_charset_info;
163
 
      return -1;
164
 
    }
165
 
  }
166
 
 
167
 
  return 0;
168
 
}
169
 
 
170
 
int load_db_opt_by_name(const char *db_name, HA_CREATE_INFO *db_create_info)
 
149
int get_database_metadata(const char *dbname, drizzled::message::Schema *db)
171
150
{
172
151
  char db_opt_path[FN_REFLEN];
173
152
  size_t length;
177
156
    to avoid table name to file name encoding.
178
157
  */
179
158
  length= build_table_filename(db_opt_path, sizeof(db_opt_path),
180
 
                              db_name, "", false);
 
159
                              dbname, "", false);
181
160
  strcpy(db_opt_path + length, MY_DB_OPT_FILE);
182
161
 
183
 
  return load_db_opt(db_opt_path, db_create_info);
 
162
  int fd= open(db_opt_path, O_RDONLY);
 
163
 
 
164
  if (fd == -1)
 
165
    return errno;
 
166
 
 
167
  if (!db->ParseFromFileDescriptor(fd))
 
168
  {
 
169
    close(fd);
 
170
    return -1;
 
171
  }
 
172
  close(fd);
 
173
 
 
174
  return 0;
184
175
}
185
176
 
186
 
 
187
177
/*
188
178
  Create a database
189
179