diff options
Diffstat (limited to 'Src/nde/android/ColumnField.cpp')
-rw-r--r-- | Src/nde/android/ColumnField.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/Src/nde/android/ColumnField.cpp b/Src/nde/android/ColumnField.cpp new file mode 100644 index 00000000..0bd47b7b --- /dev/null +++ b/Src/nde/android/ColumnField.cpp @@ -0,0 +1,175 @@ +/* --------------------------------------------------------------------------- +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; +} + + |