00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Common/table.h"
00027 #include "include/error.h"
00028
00029 namespace IXE {
00030 using namespace std;
00031
00032 bool DynamicTable::insert(AnyObject* obj)
00033 {
00034 Size recordSize = metaClass->recordSize(obj);
00035 if (realloc_record(row, recordSize))
00036 throw MemoryError("Out of memory");
00037 DocID docID = noDocID;
00038
00039
00040 byte* field = (byte*)row.data;
00041 Field* fd;
00042 vector<Item*>::const_iterator item = obj->values.begin();
00043 for (fd = metaClass->fields(); fd; fd = fd->next) {
00044 byte* src = (*item++)->value();
00045 field = fd->store(field, src);
00046
00047 if (fd->indexType == Field::primary) {
00048 docID = *(DocID*)src;
00049 # ifndef noBIGENDIAN_KEYS
00050 key.size = fd->storeKey((byte*)key.data, (byte*)&docID);
00051 # else
00052 byte* keyField = (byte*)key.data;
00053 keyField = fd->store(keyField, src);
00054 key.size = keyField - (byte*)key.data;
00055 # endif
00056 }
00057 }
00058 row.size = (Size)(field - (byte*)row.data);
00059
00060
00061
00062 if (!tcbdbtranbegin(primary))
00063 return false;
00064
00065
00066 key.size = primaryField->storeKey((byte*)key.data,
00067 FieldOf(&obj, primaryField));
00068 int sp;
00069 byte* oldData = (byte*)tcbdbget3(primary, key.data, key.size, &sp);
00070 if (oldData) {
00071 AnyObject old;
00072 fetch((byte*)&old, oldData);
00073 if ((old == *obj) ||
00074
00075
00076 (nFulltext && isNew)) {
00077 free(oldData);
00078
00079 old._clear();
00080 return true;
00081 }
00082 removeSecondary(old);
00083 free(oldData);
00084 nRows--;
00085
00086 old._clear();
00087 }
00088
00089 if (fulltextIndexer && fulltextIndexer->isUpdated(docID)) {
00090
00091 tcbdbtrancommit(primary);
00092 return true;
00093 }
00094
00095
00096 if (fulltextIndexer) {
00097
00098 for (Field* fd = obj->metaClass()->fields(); fd != 0; fd = fd->next)
00099 if (fd->indexType == Field::fulltext)
00100 fulltextIndexer->add((byte*)obj, fd);
00101
00102 for (Field* fd = obj->metaClass()->fields(); fd != 0; fd = fd->next)
00103 if (fd->indexType == Field::fulltextMerged)
00104 fulltextIndexer->add((byte*)obj, fd);
00105 }
00106 insertRow(obj);
00107 nRows++;
00108 tcbdbtrancommit(primary);
00109 return oldData != 0;
00110 }
00111
00112 }