winamp/Src/nde/android/ColumnField.cpp

176 lines
3.8 KiB
C++

/* ---------------------------------------------------------------------------
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;
}