FirteX-高性能全文索引和检索平台

API Documentation


首页 | 名字空间列表 | 类继承关系 | 组合类型列表 | $(BL\录(B | 文件列表 | 名字空间成员 | 组合类型成员 | 文件成员

Field.h

浏览该文件的文档。
00001 //
00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 
00003 // All rights reserved.
00004 // This file is part of FirteX (www.firtex.org)
00005 //
00006 // Use of the FirteX is subject to the terms of the software license set forth in 
00007 // the LICENSE file included with this software, and also available at
00008 // http://www.firtex.org/license.html
00009 //
00010 // Author       : 郭瑞杰(GuoRuijie)
00011 // Email        : ruijieguo@software.ict.ac.cn,ruijieguo@gmail.com
00012 // Created      : 2005/11/20
00013 //
00014 #ifndef _FIELD_H
00015 #define _FIELD_H
00016 
00017 #if _MSC_VER > 1000
00018 #pragma once
00019 #endif // _MSC_VER > 1000
00020 
00021 #include <string>
00022 #include "../utility/StdHeader.h"
00023 #include "../utility/Reader.h"
00024 #include "../analyzer/Tokens.h"
00025 #include "../utility/Number.h"
00026 #include "../utility/FXString.h"
00027 #include "../utility/DateTime.h"
00028 
00029 using namespace std;
00030 using namespace firtex::utility;
00031 using namespace firtex::analyzer;
00032 
00033 
00034 //CField Type define (8Byte)
00035 #define FIELD_NONE                              0x00            //匿名
00036 #define FIELD_WORD                              0x01            //普通的词,一般经过Analyzer形成WordID
00037 #define FIELD_DATE                              0x02            //时间日期
00038 #define FIELD_NAME                              0x03            //人名,字符串
00039 #define FIELD_COMPANY                   0x04            //机构名,字符串
00040 #define FIELD_EMAIL                             0x05            //Email,字符串
00041 #define FIELD_NUM                               0x06            //数字
00042 #define FIELD_ALPHA                             0x07            //字母,字符串
00043 #define FIELD_ALPNUM                    0x08            //数字字母组合,字符串
00044 #define FIELD_URL                               0x09            //URL,字符串
00045 
00046 //CField Value Type define (8Byte)
00047 #define FIELDVALUE_EMPTY                        0x00    //Empty
00048 #define FIELDVALUE_TEXT                         0x01    //文本
00049 #define FIELDVALUE_TEXTW                        0x02    //Unicode 文本
00050 #define FIELDVALUE_READER                       0x03    //通过Reader读取
00051 #define FIELDVALUE_BINARY                       0x04    //二进制值
00052 #define FIELDVALUE_NUMBER                       0x06    //数值
00053 
00054 //CField bits define (16Byte)
00056 #define BIT_INDEX_MASK                                  0x01    //索引
00057 #define BIT_ANALYZE_MASK                                0x02    //分析
00058 
00059 #define BIT_STORE_MASK                                  0x04    //存储
00060 #define BIT_COMPRESS_MASK                               0x08    //压缩存储
00061 
00062 #define BIT_TERMVECTOR_SEQUENCE_MASK                    0x10    //原始序列
00063 #define BIT_TERMVECTOR_FREQ_MASK        0x20    //不带位置(只存词,词频)
00064 #define BIT_TERMVECTOR_POSITION_MASK            0x40    //带位置(存词,词频,位置)
00065 
00066 
00067 
00068 
00069 typedef uint32_t        FieldFlag;
00070 typedef uint8_t         FieldType;
00071 typedef uint16_t        FieldBits;
00072 
00073 //----------------------------------------------------------------------//
00074 //                              -----------------------------------------------------
00075 // FieldFlag = |8Byte FieldType|8Byte fielddata|16Byte FieldBits|
00076 //                              -----------------------------------------------------
00077 //----------------------------------------------------------------------//
00078 #define FIELDTYPE(flag) (FieldType)((flag)>>24)
00079 #define FIELDDATATYPE(flag) (FieldType)((flag)>>16)
00080 #define FIELDBITS(flag) (FieldBits)(flag)
00081 #define MAKEFIELDFLAG(type,valuetype,bits) (FieldFlag)( (((FieldFlag)(type))<<24) | (((FieldFlag)(valuetype))<<16) | (bits) )
00082 
00083 namespace firtex
00084 {
00085         namespace document
00086         {               
00087                 typedef unsigned int method_type;
00088                 typedef method_type Store_;
00089                 typedef method_type Index_;
00090                 typedef method_type TermVector_;
00091                 #define DEFINE_METHOD(cat,mt,value) namespace cat { const method_type mt = (method_type)(value);}
00092 
00093                 DEFINE_METHOD(Index,NO,1)
00094                 DEFINE_METHOD(Index,ANALYZE,2)
00095                 DEFINE_METHOD(Index,UN_ANALYZE,3)
00096 
00097                 DEFINE_METHOD(Store,YES,1)
00098                 DEFINE_METHOD(Store,COMPRESS,2)
00099                 DEFINE_METHOD(Store,NO,3)
00100 
00101                 DEFINE_METHOD(TermVector,NO,1)          
00102                 DEFINE_METHOD(TermVector,SEQUENCE,2)                    //存储文档Analyze后的原始序列
00103                 DEFINE_METHOD(TermVector,FREQ,3)        //不存储位置信息,仅存储词和词频信息
00104                 DEFINE_METHOD(TermVector,POSITION,4)            //存储词,词频,词位置信息
00105 
00106                 
00107                 typedef uint8_t fielddata_t;
00108                 struct fielddata
00109                 {
00110                         fielddata_t     vt;                     
00111                         union
00112                         {
00113                                 CFXStringA*     strval; //ASCII
00114                                 CFXStringW*     wstrval;//UNICODE                                       
00115                                 CReader*        reader;
00116                                 datarecord      binary;                         
00117                                 numbervar       number;
00118                         }data;
00119                         bool    owner;                          //is it the owner of the data?
00120                 };
00121 
00123                 //CFieldData
00124                 
00125                 class CFieldData : public fielddata
00126                 {
00127                 public:
00128                         CFieldData();
00129                         CFieldData(const string& str);                                                  //will copy the string
00130                         CFieldData(const wstring& wstr);                                                        //will copy the string
00131                         CFieldData(const char* str);                                                    //will copy the string
00132                         CFieldData(const wchar_t* str);                                                 //will copy the string
00133                         CFieldData(char* str,size_t len);                                               //will NOT copy the string
00134                         CFieldData(wchar_t* str,size_t len);                                    //will NOT copy the string
00135                         CFieldData(const str_t& str,bool bNoCopy = true);               //will or will NOT copy the string,depends on bNoCopy
00136                         CFieldData(const wstr_t& wstr,bool bNoCopy = true);             //will or will NOT copy the string,depends on bNoCopy
00137                         CFieldData(CFXString* str,bool bOwner = false);                 //will or will NOT delete str,depends on bOwner
00138                         CFieldData(CFXStringW* wstr,bool bOwner = false);               //will or will NOT delete str,depends on bOwner
00139                         CFieldData(CReader* r,bool bOwner = false);             //will or will NOT delete data.reader depends on bOwner
00140                         CFieldData(const datarecord& bin,bool bNoCopy = false); //will or will NOT copy the data,depends on bNoCopy
00141                         CFieldData(const numbervar& num);                                               //will copy the data                    
00142                         CFieldData(const CFieldData& src);                                              
00143                         ~CFieldData();
00144                 public:
00145                         operator string()const;
00146                         operator wstring()const;
00147                         operator char*()const;
00148                         operator wchar_t*()const;
00149                         operator str_t()const;                  
00150                         operator wstr_t()const;
00151                         operator CFXStringA*()const;
00152                         operator CFXStringW*()const;
00153                         operator CReader*()const;
00154                         operator datarecord()const;
00155                         operator numbervar&();                  
00156 
00157                         CFieldData& operator=(const string& str);                               //will copy the string
00158                         CFieldData& operator=(const wstring& str);                              //will copy the string
00159                         CFieldData& operator=(const char* str);                                 //will copy the string
00160                         CFieldData& operator=(const wchar_t* wstr);                             //will copy the string
00161                         CFieldData& operator=(const str_t& str);                                //will NOT copy the string
00162                         CFieldData& operator=(const wstr_t& wstr);                              //will NOT copy the string
00163                         CFieldData& operator=(CFXStringA* str);                                 //will NOT delete str
00164                         CFieldData& operator=(CFXStringW* wstr);                                //will NOT delete wstr
00165                         CFieldData& operator=(CReader* r);                                              //will NOT delete data.reader
00166                         CFieldData& operator=(const datarecord& bin);                   //will NOT copy the data
00167                         CFieldData& operator=(const numbervar& num);                    //will copy the data                    
00168                         CFieldData& operator=(const CFieldData& src);
00169 
00170                         void    assignBinary(byte* bin,size_t len,bool bNoCopy);
00171                         void    assignText(char* text,size_t len,bool bNoCopy);
00172                         void    assignText(wchar_t* text,size_t len,bool bNoCopy);
00173                         void    assign(const CFieldData& src,bool bNoCopy);
00174                 public:
00175                         void    clear();
00176                         friend class CField;
00177                 };              
00178 
00180                 //CField                
00181                 class CField
00182                 {                       
00183                 public:
00190                         static CField* Keyword(const tchar* name, const char* value,FieldType ft,float fBoost = 1.0) 
00191                         {
00192                                 return new CField(name, value,Store::YES,Index::UN_ANALYZE,TermVector::NO,ft,fBoost);
00193                         }
00194 
00201                         static CField* Keyword(const tchar* name, const wchar_t* value,FieldType ft,float fBoost = 1.0) 
00202                         {
00203                                 return new CField(name, value,Store::YES,Index::UN_ANALYZE,TermVector::NO,ft,fBoost);
00204                         }
00205 
00212                         static CField* Keyword(const tchar* name, const CDateTime& value,float fBoost = 1.0)
00213                         {
00214                                 numbervar nvar;
00215                                 nvar.value.i64val = value.getTime();
00216                                 nvar.nt = NT_I8;
00217                                 return new CField(name, nvar,Store::YES,Index::UN_ANALYZE,fBoost);
00218                         }
00219 
00226                         static CField* Keyword(const tchar* name, const numbervar& value,float fBoost = 1.0)
00227                         {                       
00228                                 return new CField(name, value,Store::YES,Index::UN_ANALYZE,fBoost);
00229                         }
00230 
00237                         static CField* UnIndexed(const tchar* name, const char* value,float fBoost = 1.0) 
00238                         {
00239                                 return new CField(name, value, Store::YES,Index::NO,TermVector::NO,FIELD_NONE,fBoost);
00240                         }
00241 
00248                         static CField* UnIndexed(const tchar* name, const wchar_t* value,float fBoost = 1.0) 
00249                         {
00250                                 return new CField(name, value, Store::YES,Index::NO,TermVector::NO,FIELD_NONE,fBoost);
00251                         }
00252 
00260                         static CField* UnIndexed(const tchar* name, CReader* value,bool bDelete = false,float fBoost = 1.0)
00261                         {
00262                                 return new CField(name,value,bDelete,Store::YES,Index::NO,TermVector::NO,fBoost);
00263                         }
00264 
00273                         static CField* UnIndexed(const tchar* name,char* text,size_t length,bool bNoCopy = false,float fBoost = 1.0) 
00274                         {                               
00275                                 return new CField(name,text,length,bNoCopy,FIELD_NONE,Store::YES,Index::NO,TermVector::NO,fBoost);
00276                         }
00277 
00286                         static CField* UnIndexed(const tchar* name,wchar_t* text,size_t length,bool bNoCopy = false,float fBoost = 1.0) 
00287                         {                               
00288                                 return new CField(name,text,length,bNoCopy,FIELD_NONE,Store::YES,Index::NO,TermVector::NO,fBoost);
00289                         }
00290 
00291 
00299                         static CField* UnIndexed(const tchar* name, const str_t& value,bool bNoCopy = true,float fBoost = 1.0) 
00300                         {                               
00301                                 return new CField(name,value.str,value.length,bNoCopy,FIELD_NONE,Store::YES,Index::NO,TermVector::NO,fBoost);
00302                         }
00303 
00312                         static CField* Text(const tchar* name, const char* value,FieldType ft = FIELD_WORD,Store_ store=Store::NO,TermVector_ termVector=TermVector::NO,float fBoost = 1.0) 
00313                         {
00314                                 return new CField(name, value, ft,store,Index::ANALYZE,termVector,fBoost);
00315                         }
00316 
00325                         static CField* Text(const tchar* name, const wchar_t* value,FieldType ft = FIELD_WORD,Store_ store=Store::NO,TermVector_ termVector=TermVector::NO,float fBoost = 1.0) 
00326                         {
00327                                 return new CField(name, value, ft,store,Index::ANALYZE,termVector,fBoost);
00328                         }
00329 
00339                         static CField* Text(const tchar* name, CReader* value,bool bDelete = false,Store_ store = Store::NO,TermVector_ termVector = TermVector::NO,float fBoost = 1.0)
00340                         {
00341                                 return new CField(name,value,bDelete,store,Index::ANALYZE,termVector,fBoost);
00342                         }
00343 
00352                         static CField* Text(const tchar* name, char* text,size_t length,bool bNoCopy = true,FieldType ft = FIELD_WORD,Store_ store = Store::NO,TermVector_ termVector = TermVector::NO,float fBoost = 1.0) 
00353                         {                               
00354                                 return new CField(name,text,length,bNoCopy,ft,store,Index::ANALYZE,termVector,fBoost);
00355                         }
00356 
00365                         static CField* Text(const tchar* name, wchar_t* text,size_t length,bool bNoCopy = true,FieldType ft = FIELD_WORD,Store_ store = Store::NO,TermVector_ termVector = TermVector::NO,float fBoost = 1.0) 
00366                         {                               
00367                                 return new CField(name,text,length,bNoCopy,ft,store,Index::ANALYZE,termVector,fBoost);
00368                         }
00369 
00379                         static CField* Text(const tchar* name, const str_t& value,bool bNoCopy = true,FieldType ft = FIELD_WORD,Store_ store = Store::NO,TermVector_ termVector = TermVector::NO,float fBoost = 1.0) 
00380                         {                               
00381                                 return new CField(name,value.str,value.length,bNoCopy,ft,store,Index::ANALYZE,termVector,fBoost);
00382                         }                       
00383 
00391                         static CField* UnStored(const tchar* name, const char* value,FieldType ft = FIELD_WORD,TermVector_ termVector=TermVector::NO,float fBoost = 1.0) 
00392                         {
00393                                 return new CField(name,value,ft,Store::NO,Index::ANALYZE,termVector,fBoost);
00394                         }
00395 
00403                         static CField* UnStored(const tchar* name, const wchar_t* value,FieldType ft = FIELD_WORD,TermVector_ termVector=TermVector::NO,float fBoost = 1.0) 
00404                         {
00405                                 return new CField(name,value,ft,Store::NO,Index::ANALYZE,termVector,fBoost);
00406                         }
00407 
00416                         static CField* UnStored(const tchar* name, CReader* value,bool bDelete = false,TermVector_ termVector=TermVector::NO,float fBoost = 1.0)
00417                         {
00418                                 return new CField(name,value,bDelete,Store::NO,Index::ANALYZE,termVector,fBoost);
00419                         }
00420 
00430                         static CField* UnStored(const tchar* name, char* text,size_t length,bool bNoCopy = true,FieldType ft = FIELD_WORD,TermVector_ termVector=TermVector::NO,float fBoost = 1.0)
00431                         {                               
00432                                 return new CField(name,text,length,bNoCopy,ft,Store::NO,Index::ANALYZE,termVector,fBoost);
00433                         }
00434 
00444                         static CField* UnStored(const tchar* name, wchar_t* text,size_t length,bool bNoCopy = true,FieldType ft = FIELD_WORD,TermVector_ termVector=TermVector::NO,float fBoost = 1.0)
00445                         {                               
00446                                 return new CField(name,text,length,bNoCopy,ft,Store::NO,Index::ANALYZE,termVector,fBoost);
00447                         }
00448 
00456                         static CField* UnStored(const tchar* name, const str_t& value,bool bNoCopy = true,FieldType ft = FIELD_WORD,TermVector_ termVector=TermVector::NO,float fBoost = 1.0)
00457                         {                               
00458                                 return new CField(name,value.str,value.length,bNoCopy,ft,Store::NO,Index::ANALYZE,termVector,fBoost);
00459                         }
00460 
00470                         static CField* Binary(const tchar* name, byte* value,size_t length,bool bNoCopy,bool bCompress,float fBoost = 1.0) 
00471                         {                               
00472                                 return new CField(name,value,length,bNoCopy,bCompress?Store::COMPRESS:Store::YES,fBoost);
00473                         }
00474 
00483                         static CField* Binary(const tchar* name,const datarecord& dr,bool bNoCopy,bool bCompress,float fBoost = 1.0) 
00484                         {                               
00485                                 return new CField(name,dr.data,dr.length,bNoCopy,bCompress?Store::COMPRESS:Store::YES,fBoost);
00486                         }
00487 
00496                         static CField* Tokens(const tchar* name,CTokens* value, bool bDelete = true,TermVector_ termVector = TermVector::NO,float fBoost = 1.0)
00497                         {
00498                                 return new CField(name,value,bDelete,termVector,fBoost);
00499                         }
00500                 public:                                                         
00508                         CField(const tchar* name, const char* value,FieldType ft,Store_ store,Index_ index,TermVector_ termVector,float fBoost = 1.0);
00509 
00517                         CField(const tchar* name, const wchar_t* value,FieldType ft,Store_ store,Index_ index,TermVector_ termVector,float fBoost = 1.0);
00518 
00527                         CField(const tchar* name, CReader* reader,bool bDelete, Store_ store,Index_ index,TermVector_ termVector,float fBoost = 1.0);
00528 
00538                         CField(const tchar* name, char* text,size_t length,bool bNoCopy,FieldType ft, Store_ store,Index_ index,TermVector_ termVector,float fBoost = 1.0);
00539 
00549                         CField(const tchar* name, wchar_t* text,size_t length,bool bNoCopy, FieldType ft,Store_ store,Index_ index,TermVector_ termVector,float fBoost = 1.0);
00550 
00558                         CField(const tchar* name, byte* value,size_t length,bool bNoCopy,Store_ store,float fBoost = 1.0);
00559                         
00566                         CField(const tchar* name, CTokens* value,bool bDelete,TermVector_ termVector,float fBoost = 1.0);
00567 
00574                         CField(const tchar* name, const numbervar& nvar,Store_ store,Index_ index,float fBoost = 1.0);
00575 
00579                         CField(const CField& clone);
00580 
00589                         CField(fieldid_t id,const tchar* name,FieldType ft,Store_ store,Index_ index,TermVector_ tv,float fBoost = 1.0);
00590 
00591                         virtual ~CField();
00592                 public:
00593                         fieldid_t                       getID(){return m_id;}
00594                         void                            setID(fieldid_t fid){m_id = fid;}
00595 
00596                         CFXString&                      getName(){return m_name;}
00597 
00598                         FieldType                       getFieldType()const{return m_type;}
00599                         void                            setFieldType(FieldType type){m_type = type;}
00600 
00601                         fielddata_t                     getDataType()const{return m_data.vt;}           
00602 
00603                         Index_                          getIndex(){return m_index;}
00604                         Store_                          getStore(){return m_store;}
00605                         TermVector_                     getTermVector(){return m_termVector;}
00606 
00607                         void                            fromFlag(FieldFlag flag);
00608                         FieldFlag                       toFlag();       
00609 
00610                         
00611                         inline datarecord&      binaryValue();
00612                         inline CFXStringA*      textValue();
00613                         inline CFXStringW*      textWValue();
00614                         inline numbervar&       numberValue();
00615                         inline CReader*         readerValue();
00616 
00617                         inline CTokens*         tokensValue();
00618                         
00619                         void                            textValue(char* text,size_t len,bool bNoCopy = true);
00620                         void                            textValue(wchar_t* text,size_t len,bool bNoCopy = true);
00621                         void                            textValue(const str_t& str,bool bNoCopy = true);
00622                         void                            textValue(const wstr_t& wstr,bool bNoCopy = true);
00623 
00624                         void                            binaryValue(byte* data,size_t len,bool bNoCopy = true);
00625                         void                            binaryValue(const datarecord& dr,bool bNoCopy = true);
00626                         void                            numberValue(const numbervar& num);
00627                         void                            readerValue(CReader* reader,bool bDelete = false);
00628 
00629                         void                            tokensValue(CTokens* tokens,bool bDelete = true);
00630                         
00631                         
00632 
00633                         inline CFieldData&      getData(){return m_data;}
00634                         inline void                     setData(CFieldData& data);
00635 
00636                         inline void                     setBoost(float fBoost){m_fBoost=fBoost;}
00637                         inline float            getBoost(){return m_fBoost;}
00638 
00639                         inline bool                     isIndexed(){return (m_index != Index::NO);}
00640                         inline bool                     isAnalyzed(){return (m_index == Index::ANALYZE);}
00641 
00642                         inline bool                     isStored(){return (m_store != Store::NO);}
00643                         inline bool                     isCompressed(){return (m_store == Store::COMPRESS);}
00644 
00645                         inline bool                     isStoreTermVector(){return (m_termVector != TermVector::NO);}
00646 
00651                         CField*                         clone(){return new CField(*this);}      
00652                 
00653                 private:                        
00654                         fieldid_t               m_id;                           //编号
00655                         CFXString               m_name;                         //名字
00656                         FieldType               m_type;
00657                         Index_                  m_index;                        //索引标志
00658                         Store_                  m_store;                        //存储标志
00659                         TermVector_             m_termVector;           //词向量标志
00660 
00661                         float                   m_fBoost;                       //字段提升值                    
00662                         CFieldData              m_data;                         //字段数据
00663                         CTokens*                m_pTokens;                      //analyze 后的tokens
00664                         bool                    m_bDeleteTokens;        //是否需要删除m_pTokens
00665                 };
00666 
00668                 //Inline functions
00670                 //CFieldData
00671                 inline CFieldData::CFieldData()
00672                 {
00673                         memset(this,0,sizeof(fielddata));
00674                         vt = FIELDVALUE_EMPTY;
00675                 }
00676                 inline CFieldData::CFieldData(const string& str)
00677                 {
00678                         memset(this,0,sizeof(fielddata));
00679                         vt = FIELDVALUE_TEXT;
00680                         data.strval = new CFXStringA(str);                      
00681                         owner = true;                   
00682                 }
00683                 inline CFieldData::CFieldData(const wstring& str)
00684                 {
00685                         memset(this,0,sizeof(fielddata));
00686                         vt = FIELDVALUE_TEXT;
00687                         data.wstrval = new CFXStringW(str);                     
00688                         owner = true;
00689                 }
00690                 inline CFieldData::CFieldData(const char* str)
00691                 {
00692                         memset(this,0,sizeof(fielddata));
00693                         vt = FIELDVALUE_TEXT;
00694                         data.strval = new CFXStringA(str);                      
00695                         owner = true;                   
00696                 }
00697                 inline CFieldData::CFieldData(const wchar_t* str)
00698                 {
00699                         memset(this,0,sizeof(fielddata));
00700                         vt = FIELDVALUE_TEXT;
00701                         data.wstrval = new CFXStringW(str);                     
00702                         owner = true;                   
00703                 }
00704 
00705                 inline CFieldData::CFieldData(char* str,size_t len)
00706                 {
00707                         memset(this,0,sizeof(fielddata));
00708                         vt = FIELDVALUE_TEXT;
00709                         data.strval = new CFXStringA(str,len,false);                    //NO copy string
00710                         owner = true;                   
00711                 }
00712                 inline CFieldData::CFieldData(wchar_t* str,size_t len)
00713                 {
00714                         memset(this,0,sizeof(fielddata));
00715                         vt = FIELDVALUE_TEXTW;
00716                         data.wstrval = new CFXStringW(str,len,false);           //NO copy string                        
00717                         owner = true;                   
00718                 }
00719 
00720                 inline CFieldData::CFieldData(const str_t& str,bool bNoCopy)
00721                 {
00722                         memset(this,0,sizeof(fielddata));                       
00723                         vt = FIELDVALUE_TEXT;                   
00724                         data.strval = new CFXStringA(str,bNoCopy);                                      
00725                         owner = true;                   
00726                 }
00727                 inline CFieldData::CFieldData(const wstr_t& wstr,bool bNoCopy)
00728                 {
00729                         memset(this,0,sizeof(fielddata));
00730                         vt = FIELDVALUE_TEXTW;                  
00731                         data.wstrval = new CFXStringW(wstr,bNoCopy);                                    
00732                         owner = true;                   
00733                 }
00734                 inline CFieldData::CFieldData(CFXStringA* str,bool bOwner)
00735                 {
00736                         memset(this,0,sizeof(fielddata));
00737                         vt = FIELDVALUE_TEXT;                   
00738                         data.strval = str;
00739                         owner = bOwner;                 
00740                 }
00741                 inline CFieldData::CFieldData(CFXStringW* wstr,bool bOwner)
00742                 {
00743                         memset(this,0,sizeof(fielddata));
00744                         vt = FIELDVALUE_TEXTW;                  
00745                         data.wstrval = wstr;
00746                         owner = bOwner;                 
00747                 }
00748 
00749                 inline CFieldData::CFieldData(CReader* r,bool bOwner)
00750                 {
00751                         memset(this,0,sizeof(fielddata));
00752                         vt = FIELDVALUE_READER;
00753                         data.reader = r;                
00754                         owner = bOwner;
00755                 }
00756                 inline CFieldData::CFieldData(const datarecord& bin,bool bNoCopy)
00757                 {
00758                         memset(this,0,sizeof(fielddata));
00759                         vt = FIELDVALUE_BINARY;
00760                         data.binary.length = bin.length;
00761                         if(!bNoCopy)
00762                         {
00763                                 data.binary.data = new byte[bin.length];
00764                                 memcpy(data.binary.data,bin.data,bin.length);
00765                                 owner = true;
00766                         }
00767                         else
00768                         {
00769                                 data.binary.data = bin.data;
00770                                 owner = false;
00771                         }
00772                 }
00773                 inline CFieldData::CFieldData(const numbervar& num)
00774                 {
00775                         memset(this,0,sizeof(fielddata));
00776                         vt = FIELDVALUE_NUMBER;
00777                         data.number = num;
00778                 }               
00779                 inline CFieldData::CFieldData(const CFieldData& src)
00780                 {
00781                         if(vt != FIELDVALUE_EMPTY)
00782                                 clear();
00783                         vt = src.vt;    
00784                         switch(src.vt)
00785                         {
00786                         case FIELDVALUE_EMPTY:
00787                                 break;
00788                         case FIELDVALUE_TEXT:
00789                                 data.strval = new CFXStringA(*(src.data.strval));
00790                                 owner = true;
00791                                 break;
00792                         case FIELDVALUE_TEXTW:
00793                                 data.wstrval = new CFXStringW(*(src.data.wstrval));
00794                                 owner = true;
00795                                 break;
00796                         case FIELDVALUE_BINARY:
00797                                 data.binary.length = src.data.binary.length;
00798                                 if(src.owner)
00799                                 {                                       
00800                                         data.binary.data = new byte[data.binary.length];
00801                                         memcpy(data.binary.data,src.data.binary.data,data.binary.length);
00802                                 }
00803                                 else 
00804                                 {
00805                                         data.binary.data = src.data.binary.data;
00806                                 }
00807                                 owner = src.owner;
00808                                 break;
00809                         case FIELDVALUE_READER:
00810                                 if(src.owner)
00811                                 {
00812                                         data.reader = src.data.reader->clone();
00813                                         owner = true;
00814                                 }
00815                                 else 
00816                                 {
00817                                         data.reader = src.data.reader;
00818                                         owner = false;
00819                                 }
00820                                 break;                  
00821                         }
00822                 }
00823                 inline CFieldData::~CFieldData()
00824                 {
00825                         clear();
00826                 }
00827 
00828                 inline CFieldData::operator string()const
00829                 {
00830                         if(vt != FIELDVALUE_TEXT)
00831                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator string()const");
00832                         return (*(data.strval));
00833                 }
00834                 inline CFieldData::operator wstring()const
00835                 {
00836                         if(vt != FIELDVALUE_TEXTW)
00837                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator wstring()const");
00838                         return (*(data.wstrval));
00839                 }
00840                 inline CFieldData::operator char*()const
00841                 {
00842                         if(vt != FIELDVALUE_TEXT)
00843                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator char*()const");
00844                         return (*(data.strval));
00845                 }
00846                 inline CFieldData::operator wchar_t*()const
00847                 {
00848                         if(vt != FIELDVALUE_TEXTW)
00849                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator wchar_t*()const");
00850                         return (*(data.wstrval));
00851                 }
00852                 
00853                 inline CFieldData::operator str_t()const
00854                 {
00855                         if(vt != FIELDVALUE_TEXT)
00856                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator str_t()const");
00857                         return (*(data.strval));
00858                 }
00859                 inline CFieldData::operator wstr_t()const
00860                 {
00861                         if(vt != FIELDVALUE_TEXTW)
00862                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator wstr_t()const");
00863                         return (*(data.wstrval));
00864                 }               
00865         
00866                 inline CFieldData::operator CFXStringA*()const
00867                 {
00868                         if(vt != FIELDVALUE_TEXT)
00869                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator CFXStringA*()const");
00870                         return data.strval;
00871                 }
00872                 inline CFieldData::operator CFXStringW*()const
00873                 {
00874                         if(vt != FIELDVALUE_TEXTW)
00875                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator CFXStringW*()const");
00876                         return data.wstrval;
00877                 }
00878 
00879                 inline CFieldData::operator CReader*()const
00880                 {
00881                         if(vt != FIELDVALUE_READER)
00882                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator CReader*()const");
00883                         return data.reader;
00884                 }
00885                 inline CFieldData::operator datarecord()const
00886                 {
00887                         if(vt != FIELDVALUE_BINARY)
00888                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator datarecord()const");
00889                         return data.binary;
00890                 }
00891                 inline CFieldData::operator numbervar&()
00892                 {
00893                         if(vt != FIELDVALUE_NUMBER)
00894                                 FIRTEX_THROW2(CAST_ERROR,"CFieldData::operator numbervar&()const");
00895                         return data.number;
00896                 }               
00897                 inline CFieldData& CFieldData::operator=(const string& str)
00898                 {
00899                         if(vt != FIELDVALUE_TEXT && vt != FIELDVALUE_EMPTY)
00900                                 clear();
00901                         vt = FIELDVALUE_TEXT;
00902                         if(!data.strval)
00903                         {
00904                                 data.strval = new CFXStringA(str);
00905                                 owner = true;
00906                         }
00907                         else 
00908                                 *(data.strval) = str;
00909                         return (*this);
00910                 }
00911                 inline CFieldData& CFieldData::operator=(const wstring& wstr)
00912                 {
00913                         if(vt != FIELDVALUE_TEXTW && vt != FIELDVALUE_EMPTY)
00914                                 clear();
00915                         vt = FIELDVALUE_TEXTW;
00916 
00917                         if(!data.strval)
00918                         {
00919                                 data.wstrval = new CFXStringW(wstr);
00920                                 owner = true;
00921                         }
00922                         else 
00923                                 *(data.wstrval) = wstr;                 
00924                         return (*this);
00925                 }
00926                 inline CFieldData& CFieldData::operator=(const char* str)
00927                 {
00928                         if(vt != FIELDVALUE_TEXT && vt != FIELDVALUE_EMPTY)
00929                                 clear();
00930                         vt = FIELDVALUE_TEXT;
00931                         if(!owner || !data.strval)
00932                                 data.strval = new CFXStringA(str);
00933                         else (*(data.strval)) = str;
00934                         return (*this);
00935                 }
00936                 inline CFieldData& CFieldData::operator=(const wchar_t* wstr)
00937                 {
00938                         if(vt != FIELDVALUE_TEXT && vt != FIELDVALUE_EMPTY)
00939                                 clear();
00940                         vt = FIELDVALUE_TEXTW;
00941                         if(!owner)
00942                                 data.wstrval = new CFXStringW(wstr);
00943                         else (*(data.wstrval)) = wstr;                  
00944                         return (*this);
00945                 }
00946 
00947                 inline CFieldData& CFieldData::operator=(const str_t& str)
00948                 {
00949                         if(vt != FIELDVALUE_TEXT && vt != FIELDVALUE_EMPTY)
00950                                 clear();
00951                         vt = FIELDVALUE_TEXT;
00952                         if(!owner || !data.strval)
00953                         {
00954                                 data.strval = new CFXStringA(str);
00955                                 owner = true;
00956                         }
00957                         else (*(data.strval)) = str;
00958                         return (*this);                 
00959                 }
00960                 inline CFieldData& CFieldData::operator=(const wstr_t& wstr)
00961                 {
00962                         if(vt != FIELDVALUE_TEXTW && vt != FIELDVALUE_EMPTY)
00963                                 clear();
00964                         vt = FIELDVALUE_TEXTW;
00965                         if(!owner || !data.wstrval)
00966                         {
00967                                 data.wstrval = new CFXStringW(wstr);
00968                                 owner = true;
00969                         }
00970                         else (*(data.wstrval)) = wstr;
00971                         
00972                         return (*this);
00973                 }
00974                 inline CFieldData& CFieldData::operator=(CFXStringA* str)
00975                 {
00976                         if(vt != FIELDVALUE_TEXT && vt != FIELDVALUE_EMPTY)
00977                                 clear();
00978                         vt = FIELDVALUE_TEXT;
00979                         if(owner && data.strval)
00980                                 delete data.strval;
00981                         data.strval = str;
00982                         owner = false;
00983                         return (*this);
00984                 }
00985                 inline CFieldData& CFieldData::operator=(CFXStringW* wstr)
00986                 {
00987                         if(vt != FIELDVALUE_TEXTW && vt != FIELDVALUE_EMPTY)
00988                                 clear();
00989                         vt = FIELDVALUE_TEXTW;
00990                         if(owner && data.wstrval)
00991                                 delete data.wstrval;
00992                         data.wstrval = wstr;
00993                         owner = false;
00994                         return (*this);
00995                 }
00996                 inline CFieldData& CFieldData::operator=(CReader* r)
00997                 {
00998                         if(vt != FIELDVALUE_READER && vt != FIELDVALUE_EMPTY)
00999                                 clear();
01000                         vt = FIELDVALUE_READER;
01001                         if(owner && data.reader)
01002                                 delete data.reader;
01003                         data.reader = r;
01004                         owner = false;                  
01005                         return (*this);
01006                 }
01007                 inline CFieldData& CFieldData::operator=(const datarecord& bin)
01008                 {
01009                         if(vt != FIELDVALUE_BINARY && vt != FIELDVALUE_EMPTY)
01010                                 clear();
01011                         vt = FIELDVALUE_BINARY;
01012                         if(owner && data.binary.data)
01013                                 delete[] data.binary.data;
01014                         data.binary.data = bin.data;
01015                         data.binary.length = bin.length;
01016                         owner = false;                  
01017                         return (*this);
01018                 }
01019                 inline CFieldData& CFieldData::operator=(const numbervar& num)
01020                 {
01021                         if(vt != FIELDVALUE_NUMBER && vt != FIELDVALUE_EMPTY)
01022                                 clear();
01023                         vt = FIELDVALUE_NUMBER;
01024                         data.number = num;                      
01025                         owner = true;                                           
01026                         return (*this);
01027                 }               
01028                 inline CFieldData& CFieldData::operator=(const CFieldData& src)
01029                 {
01030                         if(vt != FIELDVALUE_EMPTY)
01031                                 clear();
01032                         vt = src.vt;    
01033                         switch(src.vt)
01034                         {
01035                         case FIELDVALUE_EMPTY:
01036                                 break;
01037                         case FIELDVALUE_TEXT:
01038                                 data.strval = new CFXStringA(*(src.data.strval));
01039                                 owner = true;
01040                                 break;
01041                         case FIELDVALUE_TEXTW:
01042                                 data.wstrval = new CFXStringW(*(src.data.wstrval));
01043                                 owner = true;
01044                                 break;
01045                         case FIELDVALUE_BINARY:
01046                                 data.binary.length = src.data.binary.length;
01047                                 if(src.owner)
01048                                 {                                       
01049                                         data.binary.data = new byte[data.binary.length];
01050                                         memcpy(data.binary.data,src.data.binary.data,data.binary.length);
01051                                 }
01052                                 else 
01053                                 {
01054                                         data.binary.data = src.data.binary.data;
01055                                 }
01056                                 owner = src.owner;
01057                                 break;
01058                         case FIELDVALUE_READER:
01059                                 if(src.owner)
01060                                 {
01061                                         data.reader = src.data.reader->clone();
01062                                         owner = true;
01063                                 }
01064                                 else 
01065                                 {
01066                                         data.reader = src.data.reader;
01067                                         owner = false;
01068                                 }
01069                                 break;                  
01070                         }
01071 
01072                         return (*this);
01073                 }
01074                 inline void CFieldData::assignBinary(byte* bin,size_t len,bool bNoCopy)
01075                 {
01076                         if(vt != FIELDVALUE_BINARY)
01077                                 clear();
01078                         vt = FIELDVALUE_BINARY;
01079                         if(owner)
01080                                 delete[] data.binary.data;
01081                         data.binary.length = len;
01082                         if(bNoCopy)
01083                                 data.binary.data = bin; 
01084                         else 
01085                         {
01086                                 data.binary.data = new byte[len];
01087                                 memcpy(data.binary.data,bin,len);
01088                         }
01089                         owner = !bNoCopy;
01090                 }
01091                 inline void CFieldData::assignText(char* text,size_t len,bool bNoCopy)
01092                 {
01093                         if(vt != FIELDVALUE_TEXT)
01094                                 clear();
01095                         vt = FIELDVALUE_TEXT;
01096                         if(!owner || !data.strval)
01097                         {
01098                                 data.strval = new CFXString(text,len,bNoCopy);
01099                                 owner = true;
01100                         }       
01101                         else 
01102                         {
01103                                 data.strval->assign(text,len,bNoCopy);
01104                         }                       
01105                 }
01106 
01107                 inline void CFieldData::assignText(wchar_t* text,size_t len,bool bNoCopy)
01108                 {
01109                         if(vt != FIELDVALUE_TEXTW)
01110                                 clear();
01111                         vt = FIELDVALUE_TEXTW;
01112                         if(!owner || !data.wstrval)
01113                         {
01114                                 data.wstrval = new CFXStringW(text,len,bNoCopy);
01115                                 owner = true;
01116                         }       
01117                         else 
01118                         {
01119                                 data.wstrval->assign(text,len,bNoCopy);
01120                         }                       
01121                 }
01122                 inline void CFieldData::assign(const CFieldData& src,bool bNoCopy)
01123                 {
01124                         if(!bNoCopy)
01125                         {
01126                                 *this = src;
01127                                 return;
01128                         }                               
01129                         if(vt != FIELDVALUE_EMPTY)
01130                                 clear();                        
01131                         memcpy(this,&src,sizeof(fielddata));
01132                         owner = false;
01133                 }
01134 
01135                 inline void CFieldData::clear()
01136                 {
01137                         if(owner)
01138                         {
01139                                 switch(vt)
01140                                 {
01141                                 case FIELDVALUE_TEXT:
01142                                         delete data.strval;
01143                                         break;
01144                                 case FIELDVALUE_TEXTW:
01145                                         delete data.wstrval;
01146                                         break;
01147                                 case FIELDVALUE_BINARY:
01148                                         delete[] data.binary.data;
01149                                         break;
01150                                 case FIELDVALUE_READER:
01151                                         delete data.reader;
01152                                         break;                          
01153                                 default:
01154                                         break;
01155                                 }
01156                         }                       
01157                         memset(this,0,sizeof(fielddata));
01158                 }
01159 
01160 
01162                 //CField
01163                 inline datarecord&      CField::binaryValue()
01164                 {
01165                         if(getDataType() != FIELDVALUE_BINARY)
01166                                 FIRTEX_THROW2(CAST_ERROR,"CField.binaryValue:the data in this field is not a binary value");
01167 
01168                         return (datarecord&)m_data;
01169                 }
01170                 
01171                 inline CFXString* CField::textValue()
01172                 {
01173                         if(m_data.vt != FIELDVALUE_TEXT)
01174                                 FIRTEX_THROW2(CAST_ERROR,"CField.CField::textValue():the data in this field is not a text value");
01175 
01176                         return m_data.data.strval;
01177                 }
01178                 inline CFXStringW* CField::textWValue()
01179                 {
01180                         if(m_data.vt != FIELDVALUE_TEXTW)
01181                                 FIRTEX_THROW2(CAST_ERROR,"CField.CField::textWValue():the data in this field is not a unicode text value");
01182 
01183                         return m_data.data.wstrval;
01184                 }               
01185                 inline numbervar& CField::numberValue()
01186                 {
01187                         if(m_data.vt != FIELDVALUE_NUMBER)
01188                                 FIRTEX_THROW2(CAST_ERROR,"CField.CField::numberValue():the data in this field is not a number value");
01189 
01190                         return m_data.data.number;
01191                 }
01192                 inline CReader* CField::readerValue()
01193                 {
01194                         if(m_data.vt != FIELDVALUE_READER)
01195                                 FIRTEX_THROW2(CAST_ERROR,"CField.CField::readerValue():the data in this field is not a reader value");
01196 
01197                         return m_data.data.reader;
01198                 }
01199                 inline CTokens* CField::tokensValue()
01200                 {
01201                         return m_pTokens;
01202                 }               
01203 
01204                 inline void CField::textValue(char* text,size_t len,bool bNoCopy)
01205                 {                               
01206                         m_data.assignText(text,len,bNoCopy);
01207                 }       
01208                 inline void CField::textValue(wchar_t* text,size_t len,bool bNoCopy)
01209                 {                                       
01210                         m_data.assignText(text,len,bNoCopy);
01211                 }       
01212                 inline void CField::textValue(const str_t& str,bool bNoCopy)
01213                 {               
01214                         m_data.assignText(str.str,str.length,bNoCopy);
01215                 }
01216                 inline void CField::textValue(const wstr_t& wstr,bool bNoCopy)
01217                 {               
01218                         m_data.assignText(wstr.str,wstr.length,bNoCopy);
01219                 }
01220                 inline void CField::readerValue(CReader* reader,bool bDelete)
01221                 {                       
01222                         m_data = reader;
01223                         m_data.owner = bDelete;                 
01224                 }
01225 
01226                 inline void CField::tokensValue(CTokens* tokens,bool bDelete)
01227                 {
01228                         if(m_bDeleteTokens && m_pTokens)
01229                                 delete m_pTokens;
01230                         m_pTokens = tokens;
01231                         m_bDeleteTokens = bDelete;
01232                 }
01233                 inline void CField::binaryValue(byte* data,size_t len,bool bNoCopy)
01234                 {
01235                         if (data == NULL)
01236                                 throw CIllegalArgumentException("value cannot be null.");                       
01237                         m_data.assignBinary(data,len,bNoCopy);
01238                 }
01239                 inline void CField::binaryValue(const datarecord& dr,bool bNoCopy)
01240                 {
01241                         if (dr.data == NULL)
01242                                 throw CIllegalArgumentException("CField::binaryValue():value cannot be null.");                 
01243                         m_data.assignBinary(dr.data,dr.length,bNoCopy);
01244                 }
01245                 inline void CField::numberValue(const numbervar& num)
01246                 {                                       
01247                         m_data = num;
01248                 }
01249 
01250                 inline void CField::setData(CFieldData& data)
01251                 {                       
01252                         m_data.assign(data,true);               
01253                 }
01254         }
01255 }
01256 
01257 
01258 #endif

http://www.firtex.org http://www.sourceforge.net/projects/firtex