FirteX-高性能全文索引和检索平台API Documentation |
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