~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/table.cc

Committing Stewart's work

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
#include <drizzled/item/decimal.h>
39
39
#include <drizzled/item/float.h>
40
40
#include <drizzled/item/null.h>
 
41
#include <drizzled/temporal.h>
41
42
 
42
43
#include "drizzled/table_proto.h"
43
44
 
485
486
  for (unsigned int fieldnr= 0; fieldnr < share->fields; fieldnr++)
486
487
  {
487
488
    message::Table::Field pfield= table.field(fieldnr);
488
 
    if (pfield.has_constraints() && pfield.constraints().is_nullable())
 
489
    if (pfield.constraints().is_nullable())
489
490
      null_fields++;
490
491
 
491
492
    enum_field_types drizzle_field_type=
824
825
 
825
826
    switch (field_type)
826
827
    {
 
828
    case DRIZZLE_TYPE_BLOB:
 
829
    case DRIZZLE_TYPE_VARCHAR:
 
830
    {
 
831
      message::Table::Field::StringFieldOptions field_options= pfield.string_options();
 
832
 
 
833
      charset= get_charset(field_options.has_collation_id() ?
 
834
                           field_options.collation_id() : 0);
 
835
 
 
836
      if (! charset)
 
837
        charset= default_charset_info;
 
838
 
 
839
      field_length= field_options.length() * charset->mbmaxlen;
 
840
    }
 
841
      break;
827
842
    case DRIZZLE_TYPE_DOUBLE:
828
843
    {
829
844
      message::Table::Field::NumericFieldOptions fo= pfield.numeric_options();
852
867
                                                   false);
853
868
      break;
854
869
    }
 
870
    case DRIZZLE_TYPE_TIMESTAMP:
 
871
    case DRIZZLE_TYPE_DATETIME:
 
872
      field_length= drizzled::DateTime::MAX_STRING_LENGTH;
 
873
      break;
 
874
    case DRIZZLE_TYPE_DATE:
 
875
      field_length= drizzled::Date::MAX_STRING_LENGTH;
 
876
      break;
 
877
    case DRIZZLE_TYPE_ENUM:
 
878
    {
 
879
      field_length= 0;
 
880
 
 
881
      message::Table::Field::SetFieldOptions fo= pfield.set_options();
 
882
 
 
883
      for(int valnr= 0; valnr < fo.field_value_size(); valnr++)
 
884
      {
 
885
        if (fo.field_value(valnr).length() > field_length)
 
886
          field_length= charset->cset->numchars(charset,
 
887
                                                fo.field_value(valnr).c_str(),
 
888
                                                fo.field_value(valnr).c_str()
 
889
                                                + fo.field_value(valnr).length())
 
890
            * charset->mbmaxlen;
 
891
      }
 
892
    }
 
893
      break;
 
894
    case DRIZZLE_TYPE_LONG:
 
895
      {
 
896
        uint32_t sign_len= pfield.constraints().is_unsigned() ? 0 : 1;
 
897
          field_length= MAX_INT_WIDTH+sign_len;
 
898
      }
 
899
      break;
 
900
    case DRIZZLE_TYPE_LONGLONG:
 
901
      field_length= MAX_BIGINT_WIDTH;
 
902
      break;
855
903
    default:
856
 
      field_length= pfield.options().length();
 
904
      abort();
857
905
      break;
858
906
    }
859
907
 
861
909
                         &share->mem_root,
862
910
                         record + field_offsets[fieldnr] + data_offset,
863
911
                         field_length,
864
 
                         pfield.has_constraints() && pfield.constraints().is_nullable() ? true : false,
 
912
                         pfield.constraints().is_nullable(),
865
913
                         null_pos,
866
914
                         null_bit_pos,
867
915
                         decimals,