123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /* ---------------------------------------------------------------------------
- Nullsoft Database Engine
- --------------------
- codename: Near Death Experience
- --------------------------------------------------------------------------- */
- /* ---------------------------------------------------------------------------
- IndexField Class
- Windows implementation
- Field data layout
- [4 bytes] Position
- [4 bytes] Data Type
- [1 byte] Name Length
- [Name Length bytes] Name (UTF-8)
- --------------------------------------------------------------------------- */
- #include "../nde.h"
- #include "../ndestring.h"
- //---------------------------------------------------------------------------
- IndexField::IndexField(unsigned char id, int Pos, int type, const wchar_t *FieldName)
- {
- InitField();
- Type = FIELD_INDEX;
- Name = ndestring_wcsdup(FieldName);
- ID = id;
- Position = Pos;
- DataType = type;
- }
- //---------------------------------------------------------------------------
- void IndexField::InitField(void)
- {
- index = 0;
- Type = FIELD_INDEX;
- Name = NULL;
- ID = 0;
- Position = -1;
- DataType = FIELD_UNKNOWN;
- }
- //---------------------------------------------------------------------------
- IndexField::IndexField()
- {
- InitField();
- }
- //---------------------------------------------------------------------------
- IndexField::~IndexField()
- {
- ndestring_release(Name);
- delete index;
- }
- //---------------------------------------------------------------------------
- void IndexField::ReadTypedData(const uint8_t *data, size_t len)
- {
- unsigned char c;
- int pos=0;
- CHECK_INT(len);
- Position = GET_INT(); pos += 4;
- CHECK_INT(len);
- DataType = GET_INT(); pos += 4;
- CHECK_CHAR(len);
- c = GET_CHAR(); pos++;
- if (c)
- {
- CHECK_BIN(len, c);
- int string_length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(data+pos), c, 0, 0);
- Name = ndestring_malloc((string_length+1)*sizeof(wchar_t));
- MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(data+pos), c, Name, string_length);
- Name[string_length]=0;
- }
- }
- //---------------------------------------------------------------------------
- void IndexField::WriteTypedData(uint8_t *data, size_t len)
- {
- int pos=0;
- CHECK_INT(len);
- PUT_INT(Position); pos += 4;
- CHECK_INT(len);
- PUT_INT(DataType); pos += 4;
- CHECK_CHAR(len);
-
- CHECK_CHAR(len);
- if (Name)
- {
- size_t string_length = WideCharToMultiByte(CP_UTF8, 0, Name, -1, 0, 0, 0, 0);
- if (string_length)
- {
- PUT_CHAR((uint8_t)string_length-1);
- pos++;
- CHECK_BIN(len, string_length-1);
- WideCharToMultiByte(CP_UTF8, 0, Name, -1, (LPSTR)(data+pos), (int)string_length-1, 0, 0);
- }
- else
- {
- PUT_CHAR(0);
- }
- }
- else
- {
- PUT_CHAR(0);
- }
- }
- //---------------------------------------------------------------------------
- wchar_t *IndexField::GetIndexName(void)
- {
- return Name;
- }
- //---------------------------------------------------------------------------
- size_t IndexField::GetDataSize(void)
- {
- size_t s=9;
- if (Name)
- {
- int string_length=WideCharToMultiByte(CP_UTF8, 0, Name, -1, 0, 0, 0, 0);
- if (string_length)
- s+=string_length-1;
- }
- s++;
- return s;
- }
- //---------------------------------------------------------------------------
- int IndexField::Compare(Field * /*Entry*/)
- {
- return 0;
- }
- //---------------------------------------------------------------------------
- int IndexField::TranslateToIndex(int Id, IndexField *toindex)
- {
- if (index && toindex && toindex->index)
- return index->TranslateIndex(Id, toindex->index);
- return -1;
- }
|