~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field.h

  • Committer: Monty Taylor
  • Date: 2008-10-13 09:29:43 UTC
  • mfrom: (509 drizzle)
  • mto: (509.1.4 codestyle)
  • mto: This revision was merged to the branch mainline in revision 511.
  • Revision ID: monty@inaugust.com-20081013092943-rwvx4a6d85b5l2dh
MergedĀ inĀ trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
  variables must declare the size_of() member function.
23
23
*/
24
24
 
25
 
#ifdef USE_PRAGMA_INTERFACE
26
 
#pragma interface                       /* gcc class implementation */
27
 
#endif
28
25
 
29
26
#define DATETIME_DEC                     6
30
27
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
603
600
  { return 0; }
604
601
};
605
602
 
606
 
 
607
 
class Field_num :public Field {
608
 
public:
609
 
  const uint8_t dec;
610
 
  bool decimal_precision;       // Purify cannot handle bit fields & only for decimal type
611
 
  bool unsigned_flag;   // Purify cannot handle bit fields
612
 
  Field_num(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
613
 
            unsigned char null_bit_arg, utype unireg_check_arg,
614
 
            const char *field_name_arg,
615
 
            uint8_t dec_arg, bool zero_arg, bool unsigned_arg);
616
 
  Item_result result_type () const { return REAL_RESULT; }
617
 
  void add_unsigned(String &res) const;
618
 
  friend class Create_field;
619
 
  void make_field(Send_field *);
620
 
  uint32_t decimals() const { return (uint32_t) dec; }
621
 
  uint32_t size_of() const { return sizeof(*this); }
622
 
  bool eq_def(Field *field);
623
 
  int store_decimal(const my_decimal *);
624
 
  my_decimal *val_decimal(my_decimal *);
625
 
  uint32_t is_equal(Create_field *new_field);
626
 
  int check_int(const CHARSET_INFO * const cs, const char *str, int length,
627
 
                const char *int_end, int error);
628
 
  bool get_int(const CHARSET_INFO * const cs, const char *from, uint32_t len, 
629
 
               int64_t *rnd, uint64_t unsigned_max, 
630
 
               int64_t signed_min, int64_t signed_max);
631
 
};
632
 
 
633
 
/* base class for all string related classes */
634
 
 
635
 
class Field_str :public Field {
636
 
protected:
637
 
  const CHARSET_INFO *field_charset;
638
 
  enum Derivation field_derivation;
639
 
public:
640
 
  Field_str(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
641
 
            unsigned char null_bit_arg, utype unireg_check_arg,
642
 
            const char *field_name_arg, const CHARSET_INFO * const charset);
643
 
  Item_result result_type () const { return STRING_RESULT; }
644
 
  uint32_t decimals() const { return NOT_FIXED_DEC; }
645
 
  int  store(double nr);
646
 
  int  store(int64_t nr, bool unsigned_val)=0;
647
 
  int  store_decimal(const my_decimal *);
648
 
  int  store(const char *to,uint32_t length, const CHARSET_INFO * const cs)=0;
649
 
  uint32_t size_of() const { return sizeof(*this); }
650
 
  const CHARSET_INFO *charset(void) const { return field_charset; }
651
 
  void set_charset(const CHARSET_INFO * const charset_arg) { field_charset= charset_arg; }
652
 
  enum Derivation derivation(void) const { return field_derivation; }
653
 
  virtual void set_derivation(enum Derivation derivation_arg)
654
 
  { field_derivation= derivation_arg; }
655
 
  bool binary() const { return field_charset == &my_charset_bin; }
656
 
  uint32_t max_display_length() { return field_length; }
657
 
  friend class Create_field;
658
 
  my_decimal *val_decimal(my_decimal *);
659
 
  virtual bool str_needs_quotes() { return true; }
660
 
  bool compare_str_field_flags(Create_field *new_field, uint32_t flags);
661
 
  uint32_t is_equal(Create_field *new_field);
662
 
};
663
 
 
664
 
 
665
 
/* base class for Field_varstring and Field_blob */
666
 
 
667
 
class Field_longstr :public Field_str
668
 
{
669
 
protected:
670
 
  int report_if_important_data(const char *ptr, const char *end);
671
 
public:
672
 
  Field_longstr(unsigned char *ptr_arg, uint32_t len_arg, unsigned char *null_ptr_arg,
673
 
                unsigned char null_bit_arg, utype unireg_check_arg,
674
 
                const char *field_name_arg, const CHARSET_INFO * const charset_arg)
675
 
    :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
676
 
               field_name_arg, charset_arg)
677
 
    {}
678
 
 
679
 
  int store_decimal(const my_decimal *d);
680
 
  uint32_t max_data_length() const;
681
 
};
682
 
 
683
 
class Field_tiny :public Field_num {
684
 
public:
685
 
  Field_tiny(unsigned char *ptr_arg, uint32_t len_arg, unsigned char *null_ptr_arg,
686
 
             unsigned char null_bit_arg,
687
 
             enum utype unireg_check_arg, const char *field_name_arg,
688
 
             bool zero_arg, bool unsigned_arg)
689
 
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
690
 
               unireg_check_arg, field_name_arg,
691
 
               0, zero_arg,unsigned_arg)
692
 
    {}
693
 
  enum Item_result result_type () const { return INT_RESULT; }
694
 
  enum_field_types type() const { return DRIZZLE_TYPE_TINY;}
695
 
  enum ha_base_keytype key_type() const
696
 
    { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
697
 
  int store(const char *to,uint32_t length, const CHARSET_INFO * const charset);
698
 
  int store(double nr);
699
 
  int store(int64_t nr, bool unsigned_val);
700
 
  int reset(void) { ptr[0]=0; return 0; }
701
 
  double val_real(void);
702
 
  int64_t val_int(void);
703
 
  String *val_str(String*,String *);
704
 
  bool send_binary(Protocol *protocol);
705
 
  int cmp(const unsigned char *,const unsigned char *);
706
 
  void sort_string(unsigned char *buff,uint32_t length);
707
 
  uint32_t pack_length() const { return 1; }
708
 
  void sql_type(String &str) const;
709
 
  uint32_t max_display_length() { return 4; }
710
 
 
711
 
  virtual unsigned char *pack(unsigned char* to, const unsigned char *from,
712
 
                      uint32_t max_length __attribute__((unused)),
713
 
                      bool low_byte_first __attribute__((unused)))
714
 
  {
715
 
    *to= *from;
716
 
    return to + 1;
717
 
  }
718
 
 
719
 
  virtual const unsigned char *unpack(unsigned char* to, const unsigned char *from,
720
 
                              uint32_t param_data __attribute__((unused)),
721
 
                              bool low_byte_first __attribute__((unused)))
722
 
  {
723
 
    *to= *from;
724
 
    return from + 1;
725
 
  }
726
 
};
727
 
 
728
603
/*
729
604
  Create field class for CREATE TABLE
730
605
*/
854
729
int set_field_to_null(Field *field);
855
730
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
856
731
 
 
732
 
857
733
bool
858
 
check_string_copy_error(Field_str *field,
859
 
                        const char *well_formed_error_pos,
860
 
                        const char *cannot_convert_error_pos,
861
 
                        const char *end,
862
 
                        const CHARSET_INFO * const cs);
 
734
test_if_important_data(const CHARSET_INFO * const cs, 
 
735
                       const char *str,
 
736
                       const char *strend);
863
737
 
864
738
/*
865
739
  Field subclasses
866
740
 */
 
741
#include <drizzled/field/str.h>
 
742
#include <drizzled/field/longstr.h>
 
743
#include <drizzled/field/num.h>
867
744
#include <drizzled/field/blob.h>
868
745
#include <drizzled/field/enum.h>
869
746
#include <drizzled/field/null.h>
873
750
#include <drizzled/field/double.h>
874
751
#include <drizzled/field/long.h>
875
752
#include <drizzled/field/int64_t.h>
 
753
#include <drizzled/field/num.h>
876
754
#include <drizzled/field/timetype.h>
877
755
#include <drizzled/field/timestamp.h>
878
756
#include <drizzled/field/datetime.h>
928
806
#define f_bit_as_char(x)        ((x) & FIELDFLAG_TREAT_BIT_AS_CHAR)
929
807
#define f_is_hex_escape(x)      ((x) & FIELDFLAG_HEX_ESCAPE)
930
808
 
 
809
bool
 
810
check_string_copy_error(Field_str *field,
 
811
                        const char *well_formed_error_pos,
 
812
                        const char *cannot_convert_error_pos,
 
813
                        const char *end,
 
814
                        const CHARSET_INFO * const cs);
 
815
 
 
816
 
 
817
class Field_tiny :public Field_num {
 
818
public:
 
819
  Field_tiny(unsigned char *ptr_arg, uint32_t len_arg, unsigned char *null_ptr_arg,
 
820
             unsigned char null_bit_arg,
 
821
             enum utype unireg_check_arg, const char *field_name_arg,
 
822
             bool zero_arg, bool unsigned_arg)
 
823
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
 
824
               unireg_check_arg, field_name_arg,
 
825
               0, zero_arg,unsigned_arg)
 
826
    {}
 
827
  enum Item_result result_type () const { return INT_RESULT; }
 
828
  enum_field_types type() const { return DRIZZLE_TYPE_TINY;}
 
829
  enum ha_base_keytype key_type() const
 
830
    { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
 
831
  int store(const char *to,uint32_t length, const CHARSET_INFO * const charset);
 
832
  int store(double nr);
 
833
  int store(int64_t nr, bool unsigned_val);
 
834
  int reset(void) { ptr[0]=0; return 0; }
 
835
  double val_real(void);
 
836
  int64_t val_int(void);
 
837
  String *val_str(String*,String *);
 
838
  bool send_binary(Protocol *protocol);
 
839
  int cmp(const unsigned char *,const unsigned char *);
 
840
  void sort_string(unsigned char *buff,uint32_t length);
 
841
  uint32_t pack_length() const { return 1; }
 
842
  void sql_type(String &str) const;
 
843
  uint32_t max_display_length() { return 4; }
 
844
 
 
845
  virtual unsigned char *pack(unsigned char* to, const unsigned char *from,
 
846
                      uint32_t max_length __attribute__((unused)),
 
847
                      bool low_byte_first __attribute__((unused)))
 
848
  {
 
849
    *to= *from;
 
850
    return to + 1;
 
851
  }
 
852
 
 
853
  virtual const unsigned char *unpack(unsigned char* to, const unsigned char *from,
 
854
                              uint32_t param_data __attribute__((unused)),
 
855
                              bool low_byte_first __attribute__((unused)))
 
856
  {
 
857
    *to= *from;
 
858
    return from + 1;
 
859
  }
 
860
};