123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /* ---------------------------------------------------------------------------
- Nullsoft Database Engine
- --------------------
- codename: Near Death Experience
- --------------------------------------------------------------------------- */
- /* ---------------------------------------------------------------------------
- ColumnField Class
- Android (linux) implementation
- Field data layout:
- [1 byte] Field Type
- [1 byte] Unused (maybe convert to 'searchable')
- [1 byte] Name Length
- [Name Length bytes] Name (UTF-8)
- --------------------------------------------------------------------------- */
- #include "ColumnField.h"
- #include "../NDEString.h"
- #include "../nde.h"
- //---------------------------------------------------------------------------
- ColumnField::ColumnField(unsigned char FieldID, const char *FieldName, unsigned char FieldType, Table *parentTable)
- {
- InitField();
- Type = FIELD_COLUMN;
- MyType = FieldType;
- Name = ndestring_wcsdup(FieldName);
- ID = FieldID;
- }
- //---------------------------------------------------------------------------
- void ColumnField::InitField(void)
- {
- searchable = false;
- MyType = FIELD_UNKNOWN;
- Type = FIELD_COLUMN;
- Name = NULL;
- ID = 0;
- }
- //---------------------------------------------------------------------------
- ColumnField::ColumnField()
- {
- InitField();
- }
- //---------------------------------------------------------------------------
- ColumnField::~ColumnField()
- {
- if (Name) free(Name);
- }
- void ColumnField::SetSearchable(bool val)
- {
- searchable=val;
- }
- bool ColumnField::IsSearchableField() const
- {
- return searchable;
- }
- //---------------------------------------------------------------------------
- void ColumnField::ReadTypedData(const uint8_t *data, size_t len)
- {
- unsigned char c;
- int pos=0;
- // [1 byte] Field Type
- CHECK_CHAR(len);
- MyType = GET_CHAR();
- pos++;
- // [1 byte] unused
- CHECK_CHAR(len);
- //cut: indexUnique = (BOOL)GET_CHAR();
- pos++;
- // [1 byte] string length
- CHECK_CHAR(len);
- c = GET_CHAR();
- pos++;
- if (c)
- {
- CHECK_BIN(len, c);
- Name = ndestring_wcsndup((const char *)(data+pos), c);
- }
- }
- //---------------------------------------------------------------------------
- void ColumnField::WriteTypedData(uint8_t *data, size_t len)
- {
- int pos = 0;
- // [1 byte] Field Type
- CHECK_CHAR(len);
- PUT_CHAR(MyType);
- pos++;
- // [1 byte] unused
- CHECK_CHAR(len);
- PUT_CHAR(0/*(char)indexUnique*/);
- pos++;
- CHECK_CHAR(len);
- if (Name)
- {
- int string_length = strlen(Name);
- if (string_length)
- {
- PUT_CHAR(string_length);
- pos++;
- CHECK_BIN(len, string_length);
- PUT_BINARY(data, (const uint8_t *)Name, string_length, pos);
- }
- else
- {
- PUT_CHAR(0);
- }
- }
- else
- {
- PUT_CHAR(0);
- }
- }
- //---------------------------------------------------------------------------
- unsigned char ColumnField::GetDataType(void)
- {
- return MyType;
- }
- //---------------------------------------------------------------------------
- void ColumnField::SetDataType(unsigned char type)
- {
- if ((MyType == FIELD_INTEGER || MyType == FIELD_BOOLEAN || MyType == FIELD_DATETIME || MyType == FIELD_LENGTH) &&
- (type == FIELD_INTEGER || type == FIELD_BOOLEAN || type == FIELD_DATETIME || type == FIELD_LENGTH)) {
- MyType = type;
- }
- // going from string to filename or filename to string is OK
- if ((MyType == FIELD_FILENAME && type == FIELD_STRING)
- || (MyType == FIELD_STRING && type == FIELD_FILENAME))
- {
- MyType = type;
- }
- }
- //---------------------------------------------------------------------------
- char *ColumnField::GetFieldName(void)
- {
- return Name;
- }
- //---------------------------------------------------------------------------
- size_t ColumnField::GetDataSize(void)
- {
- size_t s=3;
- if (Name)
- {
- s+=strlen(Name);
- }
- return s;
- }
- //---------------------------------------------------------------------------
- int ColumnField::Compare(Field * /*Entry*/)
- {
- return 0;
- }
|