~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/db.cc

  • Committer: Brian Aker
  • Date: 2009-05-14 16:47:01 UTC
  • mfrom: (1014.3.4 merge)
  • Revision ID: brian@gaz-20090514164701-l58qmp3mqo6et160
Merging Brian's work.

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
                                 TableList **dropped_tables);
51
51
 
52
52
static bool rm_dir_w_symlink(const char *org_path, bool send_error);
53
 
static void mysql_change_db_impl(Session *session,
54
 
                                 LEX_STRING *new_db_name,
55
 
                                 const CHARSET_INFO * const new_db_charset);
 
53
static void mysql_change_db_impl(Session *session, LEX_STRING *new_db_name);
 
54
            
56
55
 
57
56
 
58
57
/* Database lock hash */
148
147
    set, even if the database does not exist.
149
148
*/
150
149
 
151
 
const CHARSET_INFO *get_default_db_collation(Session *session, const char *db_name)
 
150
const CHARSET_INFO *get_default_db_collation(const char *db_name)
152
151
{
153
152
  HA_CREATE_INFO db_info;
154
153
 
155
 
  if (session->db != NULL && strcmp(db_name, session->db) == 0)
156
 
    return session->db_charset;
157
 
 
158
154
  /*
159
155
    db_info.default_table_charset contains valid character set
160
156
    (collation_server).
161
157
  */
162
158
 
163
 
  load_db_opt_by_name(session, db_name, &db_info);
 
159
  load_db_opt_by_name(db_name, &db_info);
164
160
 
165
161
  return db_info.default_table_charset;
166
162
}
211
207
  return 0;
212
208
}
213
209
 
214
 
int load_db_opt(Session *session, const char *path, HA_CREATE_INFO *create)
 
210
int load_db_opt(const char *path, HA_CREATE_INFO *create)
215
211
{
216
212
  drizzled::message::Schema db;
217
 
  string buffer;
218
213
 
219
214
  memset(create, 0, sizeof(*create));
220
 
  create->default_table_charset= session->variables.collation_server;
 
215
  create->default_table_charset= default_charset_info;
221
216
 
222
217
  int fd= open(path, O_RDONLY);
223
218
 
231
226
  }
232
227
  close(fd);
233
228
 
234
 
  buffer= db.collation();
235
 
  if (!(create->default_table_charset= get_charset_by_name(buffer.c_str())))
 
229
  /* If for some reason the db.opt file lacks a collation, we just return the default */
 
230
  if (db.has_collation())
236
231
  {
237
 
    errmsg_printf(ERRMSG_LVL_ERROR,
238
 
                  _("Error while loading database options: '%s':"),path);
239
 
    errmsg_printf(ERRMSG_LVL_ERROR, ER(ER_UNKNOWN_COLLATION), buffer.c_str());
240
 
    create->default_table_charset= default_charset_info;
241
 
    return -1;
 
232
    string buffer;
 
233
    buffer= db.collation();
 
234
    if (!(create->default_table_charset= get_charset_by_name(buffer.c_str())))
 
235
    {
 
236
      errmsg_printf(ERRMSG_LVL_ERROR,
 
237
                    _("Error while loading database options: '%s':"),path);
 
238
      errmsg_printf(ERRMSG_LVL_ERROR, ER(ER_UNKNOWN_COLLATION), buffer.c_str());
 
239
      create->default_table_charset= default_charset_info;
 
240
      return -1;
 
241
    }
242
242
  }
243
243
 
244
244
  return 0;
245
245
}
246
246
 
247
 
int load_db_opt_by_name(Session *session, const char *db_name,
248
 
                        HA_CREATE_INFO *db_create_info)
 
247
int load_db_opt_by_name(const char *db_name, HA_CREATE_INFO *db_create_info)
249
248
{
250
249
  char db_opt_path[FN_REFLEN];
251
250
 
256
255
  (void) build_table_filename(db_opt_path, sizeof(db_opt_path),
257
256
                              db_name, "", MY_DB_OPT_FILE, 0);
258
257
 
259
 
  return load_db_opt(session, db_opt_path, db_create_info);
 
258
  return load_db_opt(db_opt_path, db_create_info);
260
259
}
261
260
 
262
261
 
423
422
    goto exit;
424
423
  }
425
424
 
426
 
  if (session->db && !strcmp(session->db,db))
427
 
  {
428
 
    session->db_charset= create_info->default_table_charset ?
429
 
                     create_info->default_table_charset :
430
 
                     session->variables.collation_server;
431
 
    session->variables.collation_database= session->db_charset;
432
 
  }
433
 
 
434
425
  transaction_services.rawStatement(session, session->getQueryString(), session->getQueryLength());
435
426
  session->my_ok(result);
436
427
 
470
461
  if (db && (strcmp(db, "information_schema") == 0))
471
462
  {
472
463
    my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), "", "", INFORMATION_SCHEMA_NAME.c_str());
473
 
    return(true);
 
464
    return true;
474
465
  }
475
466
 
476
467
  /*
593
584
    it to 0.
594
585
  */
595
586
  if (session->db && !strcmp(session->db, db))
596
 
    mysql_change_db_impl(session, NULL, session->variables.collation_server);
 
587
    mysql_change_db_impl(session, NULL);
597
588
  pthread_mutex_unlock(&LOCK_create_db);
598
589
  start_waiting_global_read_lock(session);
599
590
exit2:
777
768
  @param new_db_charset Character set of the new database.
778
769
*/
779
770
 
780
 
static void mysql_change_db_impl(Session *session,
781
 
                                 LEX_STRING *new_db_name,
782
 
                                 const CHARSET_INFO * const new_db_charset)
 
771
static void mysql_change_db_impl(Session *session, LEX_STRING *new_db_name)
783
772
{
784
773
  /* 1. Change current database in Session. */
785
774
 
816
805
 
817
806
    session->reset_db(new_db_name->str, new_db_name->length);
818
807
  }
819
 
 
820
 
  /* 3. Update db-charset environment variables. */
821
 
 
822
 
  session->db_charset= new_db_charset;
823
 
  session->variables.collation_database= new_db_charset;
824
808
}
825
809
 
826
810
 
964
948
        new_db_name->length == 0.
965
949
      */
966
950
 
967
 
      mysql_change_db_impl(session, NULL, session->variables.collation_server);
 
951
      mysql_change_db_impl(session, NULL);
968
952
 
969
 
      return(false);
 
953
      return false;
970
954
    }
971
955
    else
972
956
    {
973
957
      my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
974
958
 
975
 
      return(true);
 
959
      return true;
976
960
    }
977
961
  }
978
962
 
983
967
    /* const_cast<> is safe here: mysql_change_db_impl does a copy */
984
968
    LEX_STRING is_name= { const_cast<char *>(INFORMATION_SCHEMA_NAME.c_str()),
985
969
                          INFORMATION_SCHEMA_NAME.length() };
986
 
    mysql_change_db_impl(session, &is_name, system_charset_info);
 
970
    mysql_change_db_impl(session, &is_name);
987
971
 
988
 
    return(false);
 
972
    return false;
989
973
  }
990
974
 
991
975
  /*
998
982
  new_db_file_name.length= new_db_name->length;
999
983
  new_db_file_name.str= (char *)malloc(new_db_name->length + 1);
1000
984
  if (new_db_file_name.str == NULL)
1001
 
    return(true);                             /* the error is set */
 
985
    return true;                             /* the error is set */
1002
986
  memcpy(new_db_file_name.str, new_db_name->str, new_db_name->length);
1003
987
  new_db_file_name.str[new_db_name->length]= 0;
1004
988
 
1018
1002
    free(new_db_file_name.str);
1019
1003
 
1020
1004
    if (force_switch)
1021
 
      mysql_change_db_impl(session, NULL, session->variables.collation_server);
 
1005
      mysql_change_db_impl(session, NULL);
1022
1006
 
1023
 
    return(true);
 
1007
    return true;
1024
1008
  }
1025
1009
 
1026
1010
  if (check_db_dir_existence(new_db_file_name.str))
1037
1021
 
1038
1022
      /* Change db to NULL. */
1039
1023
 
1040
 
      mysql_change_db_impl(session, NULL, session->variables.collation_server);
 
1024
      mysql_change_db_impl(session, NULL);
1041
1025
 
1042
1026
      /* The operation succeed. */
1043
1027
 
1044
 
      return(false);
 
1028
      return false;
1045
1029
    }
1046
1030
    else
1047
1031
    {
1052
1036
 
1053
1037
      /* The operation failed. */
1054
1038
 
1055
 
      return(true);
 
1039
      return true;
1056
1040
    }
1057
1041
  }
1058
1042
 
1061
1045
    attributes and will be freed in Session::~Session().
1062
1046
  */
1063
1047
 
1064
 
  db_default_cl= get_default_db_collation(session, new_db_file_name.str);
1065
 
 
1066
 
  mysql_change_db_impl(session, &new_db_file_name, db_default_cl);
1067
 
 
1068
 
  return(false);
 
1048
  db_default_cl= get_default_db_collation(new_db_file_name.str);
 
1049
 
 
1050
  mysql_change_db_impl(session, &new_db_file_name);
 
1051
 
 
1052
  return false;
1069
1053
}
1070
1054
 
1071
1055