transactd 3.5.0 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
- data/bin/common/tdclc_64_3_6.dll +0 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
- data/build/swig/tdcl.i +5 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +210 -184
- data/source/bzs/db/engine/mysql/database.h +276 -105
- data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
- data/source/bzs/db/protocol/tdap/client/database.h +6 -1
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
- data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
- data/source/bzs/db/protocol/tdap/client/field.h +3 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
- data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
- data/source/bzs/db/protocol/tdap/client/request.h +46 -38
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
- data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
- data/source/bzs/db/protocol/tdap/client/table.h +4 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
- data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
- data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
- data/source/bzs/example/ormap_c.cpp +2 -2
- data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
- data/source/bzs/test/tdclatl/test_v3.js +48 -1
- data/source/bzs/test/tdclphp/bench.php +89 -76
- data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
- data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
- data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
- data/source/bzs/test/trdclengn/testField.h +522 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
- data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
- data/source/global/tdclatl/RecordsetQuery.h +1 -1
- data/source/global/tdclatl/Table.cpp +17 -0
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/tdclatl.idl +7 -2
- data/transactd.gemspec +1 -1
- metadata +7 -5
- data/bin/common/tdclc_64_3_5.dll +0 -0
@@ -27,6 +27,7 @@
|
|
27
27
|
#include <bzs/db/engine/mysql/fieldAccess.h>
|
28
28
|
#include <boost/shared_ptr.hpp>
|
29
29
|
|
30
|
+
|
30
31
|
#ifndef MAX_KEY_SEGMENT
|
31
32
|
#define MAX_KEY_SEGMENT 8
|
32
33
|
#endif
|
@@ -125,6 +126,17 @@ struct extResultDef
|
|
125
126
|
{
|
126
127
|
return 4 + (sizeof(resultField) * fieldCount);
|
127
128
|
}
|
129
|
+
|
130
|
+
bool isFieldSelect(ulong clientRecordLen) const
|
131
|
+
{
|
132
|
+
return ((fieldCount > 1) ||
|
133
|
+
((fieldCount == 1) && (field[0].len < clientRecordLen)));
|
134
|
+
}
|
135
|
+
|
136
|
+
bool isAllField(ulong clientRecordLen) const
|
137
|
+
{
|
138
|
+
return ((fieldCount == 1) && (field[0].len >= clientRecordLen));
|
139
|
+
}
|
128
140
|
};
|
129
141
|
|
130
142
|
inline position::position() : m_tb(NULL), m_record(NULL){};
|
@@ -287,7 +299,7 @@ public:
|
|
287
299
|
m_sizeBytes = 0;
|
288
300
|
m_judge = false;
|
289
301
|
m_matched = false;
|
290
|
-
m_placeHolderNum =
|
302
|
+
m_placeHolderNum = 0xffff;
|
291
303
|
m_nullOffset = 0;
|
292
304
|
m_nullbit = 0;
|
293
305
|
m_nullOffsetCompFd = 0;
|
@@ -541,12 +553,15 @@ public:
|
|
541
553
|
|
542
554
|
void setNextPtr()
|
543
555
|
{
|
544
|
-
|
556
|
+
if (m_fields.size())
|
545
557
|
{
|
546
|
-
|
547
|
-
|
558
|
+
for (int i = 0; i < (int)m_fields.size() - 1; ++i)
|
559
|
+
{
|
560
|
+
m_fields[i].m_next = &m_fields[i + 1];
|
561
|
+
m_fields[i].oprCache();
|
562
|
+
}
|
563
|
+
m_fields[m_fields.size() - 1].oprCache();
|
548
564
|
}
|
549
|
-
m_fields[m_fields.size() - 1].oprCache();
|
550
565
|
}
|
551
566
|
};
|
552
567
|
|
@@ -556,39 +571,20 @@ class prepared : public engine::mysql::IPrepare
|
|
556
571
|
public:
|
557
572
|
fields* fds;
|
558
573
|
extResultDef* rd;
|
559
|
-
|
574
|
+
std::bitset<256> bits;
|
560
575
|
int blobs;
|
561
576
|
unsigned short rejectCount;
|
562
|
-
|
563
|
-
prepared() : fds(NULL), rd(NULL),
|
577
|
+
bool wholeRow;
|
578
|
+
prepared() : fds(NULL), rd(NULL), wholeRow(false){}
|
564
579
|
|
565
580
|
~prepared()
|
566
581
|
{
|
567
582
|
if (fds)
|
568
583
|
delete fds;
|
569
|
-
if (readMap)
|
570
|
-
delete [] readMap;
|
571
584
|
if (rd)
|
572
585
|
free(rd);
|
573
586
|
}
|
574
587
|
|
575
|
-
void copyBitmapTo(MY_BITMAP* bm)
|
576
|
-
{
|
577
|
-
if (readMap)
|
578
|
-
memcpy(bm->bitmap, readMap, readMapSize);
|
579
|
-
}
|
580
|
-
|
581
|
-
void assignBitmap(MY_BITMAP* bm)
|
582
|
-
{
|
583
|
-
if (bm)
|
584
|
-
{
|
585
|
-
assert(readMap == NULL);
|
586
|
-
readMapSize = ((bm->n_bits + 7)/ 8);
|
587
|
-
readMap = new unsigned char[readMapSize];
|
588
|
-
memcpy(readMap, (unsigned char*)bm->bitmap, readMapSize);
|
589
|
-
}
|
590
|
-
}
|
591
|
-
|
592
588
|
void assignResultDef(const extResultDef* src)
|
593
589
|
{
|
594
590
|
assert(rd == NULL);
|
@@ -602,7 +598,6 @@ public:
|
|
602
598
|
fds = new fields();
|
603
599
|
*(fds) = *src;
|
604
600
|
fds->setNextPtr();
|
605
|
-
|
606
601
|
}
|
607
602
|
|
608
603
|
void release()
|
@@ -635,8 +630,7 @@ class resultWriter
|
|
635
630
|
// in the client, fieldCount > 0 buf recLen=0 then this pattern
|
636
631
|
if (pos)
|
637
632
|
{
|
638
|
-
if (
|
639
|
-
(m_def->field[0].len >= pos->recordLenCl()))
|
633
|
+
if (m_def->isAllField(pos->recordLenCl()))
|
640
634
|
{ // write whole row
|
641
635
|
int len = pos->recordPackCopy(m_nw->curPtr(),
|
642
636
|
(uint)m_nw->bufferSpace());
|
@@ -725,15 +719,11 @@ class ReadRecordsHandler : public engine::mysql::IReadRecordsHandler
|
|
725
719
|
position m_position;
|
726
720
|
fields* m_fields;
|
727
721
|
fields* m_defaultFields;
|
728
|
-
engine::mysql::fieldBitmap bm;
|
729
722
|
unsigned short m_maxRows;
|
730
723
|
bool m_seeksMode;
|
731
724
|
|
732
725
|
public:
|
733
|
-
ReadRecordsHandler():m_defaultFields(new fields())
|
734
|
-
{
|
735
|
-
|
736
|
-
}
|
726
|
+
ReadRecordsHandler():m_defaultFields(new fields()){}
|
737
727
|
|
738
728
|
~ReadRecordsHandler()
|
739
729
|
{
|
@@ -753,23 +743,16 @@ public:
|
|
753
743
|
if (!m_fields->setSupplyValues(*req))
|
754
744
|
return STATUS_INVALID_SUPPLYVALUES;
|
755
745
|
}
|
756
|
-
|
757
|
-
|
758
|
-
{
|
759
|
-
bm.setTable(tb);
|
760
|
-
if (m_seeksMode && !(req->itype & FILTER_TYPE_SEEKS_BOOKMARKS))
|
761
|
-
addKeysegFieldMap(tb);
|
762
|
-
if (p->readMapSize)
|
763
|
-
p->copyBitmapTo(bm.getReadBitmap());
|
764
|
-
}
|
765
|
-
|
766
|
-
tb->indexInit();
|
746
|
+
engine::mysql::prepareHandler* ph = tb->getPrepareHandler();
|
747
|
+
ph->setReadBitmap(p->bits);
|
767
748
|
tb->blobBuffer()->clear();
|
768
749
|
tb->setBlobFieldCount(p->blobs);
|
769
750
|
nw->beginExt(tb->blobFields() != 0);
|
770
751
|
const extResultDef* rd = p->rd;
|
771
752
|
m_writer.init(nw, rd, noBookmark, m_fields->nullbytes);
|
772
753
|
m_maxRows = p->rd->maxRows;
|
754
|
+
ph->ready(p->wholeRow);
|
755
|
+
|
773
756
|
return 0;
|
774
757
|
}
|
775
758
|
|
@@ -778,14 +761,15 @@ public:
|
|
778
761
|
{
|
779
762
|
// Important! cache resultdef first.
|
780
763
|
const extResultDef* srcRd = req->resultDef();
|
781
|
-
|
764
|
+
|
782
765
|
short ret = begin(tb, req, fieldCache, nw, forword, noBookmark);
|
783
766
|
p->assignResultDef(srcRd);
|
784
767
|
p->assignFields(m_fields);
|
785
|
-
|
786
|
-
|
768
|
+
engine::mysql::prepareHandler* ph = tb->getPrepareHandler();
|
769
|
+
p->bits = ph->getReadBitmap();
|
787
770
|
p->blobs = tb->getBlobFieldCount();
|
788
771
|
p->rejectCount = m_req->rejectCount;
|
772
|
+
p->wholeRow = ph->isWholeRow();
|
789
773
|
end();
|
790
774
|
return ret;
|
791
775
|
}
|
@@ -807,36 +791,25 @@ public:
|
|
807
791
|
key = &tb->keyDef(tb->keyNum());
|
808
792
|
m_fields->init(*m_req, m_position, key, forword);
|
809
793
|
}
|
810
|
-
|
811
|
-
|
812
|
-
|
794
|
+
bool whole_row = true;
|
795
|
+
if (rd->isFieldSelect(m_position.recordLenCl()))
|
796
|
+
{
|
813
797
|
ret = convResultPosToFieldNum(tb, noBookmark, rd, m_seeksMode,
|
814
798
|
(req->itype & FILTER_TYPE_SEEKS_BOOKMARKS) != 0);
|
815
|
-
|
799
|
+
if (ret) return ret;
|
800
|
+
whole_row = false;
|
801
|
+
}
|
802
|
+
|
816
803
|
nw->beginExt(tb->blobFields() != 0);
|
817
804
|
m_writer.init(nw, rd, noBookmark, m_fields->nullbytes);
|
818
805
|
m_maxRows = rd->maxRows;
|
806
|
+
|
807
|
+
engine::mysql::prepareHandler* ph = tb->getPrepareHandler();
|
808
|
+
ph->ready(whole_row);
|
819
809
|
// DEBUG_RECORDS_BEGIN(m_resultDef, m_req)
|
820
|
-
|
821
810
|
return ret;
|
822
811
|
}
|
823
|
-
|
824
|
-
void addKeysegFieldMap(engine::mysql::table* tb)
|
825
|
-
{
|
826
|
-
const KEY* key = &tb->keyDef(tb->keyNum());
|
827
|
-
if (key)
|
828
|
-
{
|
829
|
-
int sgi = 0;
|
830
|
-
int segments = std::min<uint>(MAX_KEY_SEGMENT,
|
831
|
-
key->user_defined_key_parts);
|
832
|
-
while (sgi < segments)
|
833
|
-
{
|
834
|
-
bm.setReadBitmap(key->key_part[sgi].field->field_index);
|
835
|
-
++sgi;
|
836
|
-
}
|
837
|
-
}
|
838
|
-
}
|
839
|
-
|
812
|
+
|
840
813
|
// TODO This convert is move to client. but legacy app is need this
|
841
814
|
short convResultPosToFieldNum(engine::mysql::table* tb, bool noBookmark,
|
842
815
|
const extResultDef* rd, bool seeksMode, bool seekBookmark)
|
@@ -844,7 +817,8 @@ public:
|
|
844
817
|
int blobs = 0;
|
845
818
|
int nullfields = 0;
|
846
819
|
m_fields->nullbytes = 0;
|
847
|
-
|
820
|
+
engine::mysql::prepareHandler* ph = tb->getPrepareHandler();
|
821
|
+
ph->clearReadBitmap();
|
848
822
|
for (int i = 0; i < rd->fieldCount; i++)
|
849
823
|
{
|
850
824
|
const resultField& fd = rd->field[i];
|
@@ -852,7 +826,7 @@ public:
|
|
852
826
|
if (num == -1)
|
853
827
|
return STATUS_INVALID_FIELD_OFFSET;
|
854
828
|
const_cast<resultField&>(fd).fieldNum = num;
|
855
|
-
|
829
|
+
ph->setReadBitmap(num);
|
856
830
|
if (m_position.isBlobField(&fd))
|
857
831
|
++blobs;
|
858
832
|
if (m_position.isNullable(num) && m_position.isMysqlNull())
|
@@ -866,31 +840,17 @@ public:
|
|
866
840
|
const logicalField* fd = &m_req->field;
|
867
841
|
for (int i = 0; i < m_req->logicalCount; ++i)
|
868
842
|
{
|
869
|
-
|
843
|
+
ph->setReadBitmap(m_position.getFieldNumByPos(fd->pos));
|
870
844
|
fd = fd->next();
|
871
845
|
}
|
872
846
|
}
|
873
847
|
else if (!seekBookmark)
|
874
|
-
|
848
|
+
ph->makeCurrentKeyFieldBitmap();
|
875
849
|
|
876
850
|
// if need bookmark , add primary key fields
|
877
851
|
if (!noBookmark)
|
878
|
-
|
879
|
-
|
880
|
-
if (key)
|
881
|
-
{
|
882
|
-
int sgi = 0;
|
883
|
-
int segments = std::min<uint>(MAX_KEY_SEGMENT,
|
884
|
-
key->user_defined_key_parts);
|
885
|
-
while (sgi < segments)
|
886
|
-
{
|
887
|
-
bm.setReadBitmap(key->key_part[sgi].field->field_index);
|
888
|
-
++sgi;
|
889
|
-
}
|
890
|
-
}
|
891
|
-
}
|
892
|
-
if (tb->keyNum() >= 0)
|
893
|
-
tb->indexInit();
|
852
|
+
ph->makePrimaryKeyFieldBitmap();
|
853
|
+
|
894
854
|
tb->blobBuffer()->clear();
|
895
855
|
tb->setBlobFieldCount(blobs);
|
896
856
|
return 0;
|
@@ -898,10 +858,8 @@ public:
|
|
898
858
|
|
899
859
|
unsigned int end()
|
900
860
|
{
|
901
|
-
unsigned int len = m_writer.end();
|
902
861
|
// DEBUG_RECORDS_END(m_writer.get())
|
903
|
-
|
904
|
-
return len;
|
862
|
+
return m_writer.end();
|
905
863
|
}
|
906
864
|
|
907
865
|
int match(bool typeNext) const
|
@@ -116,24 +116,31 @@ public:
|
|
116
116
|
}
|
117
117
|
}
|
118
118
|
|
119
|
-
if (
|
119
|
+
if (P_MASK_DB_AINC_VAL & paramMask)
|
120
120
|
{
|
121
|
-
|
122
|
-
p += sizeof(
|
121
|
+
memcpy(p, (const char*)datalen, sizeof(autoIncPackInfo));
|
122
|
+
p += sizeof(autoIncPackInfo);
|
123
123
|
}
|
124
|
-
|
125
|
-
if (P_MASK_DATA & paramMask)
|
124
|
+
else
|
126
125
|
{
|
127
|
-
if (
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
}
|
126
|
+
if (P_MASK_DATALEN & paramMask)
|
127
|
+
{
|
128
|
+
datalenPtr = p;
|
129
|
+
p += sizeof(uint_td);
|
130
|
+
}
|
133
131
|
|
134
|
-
|
135
|
-
|
132
|
+
if (P_MASK_DATA & paramMask)
|
133
|
+
{
|
134
|
+
if (tb && (data == tb->record()))
|
135
|
+
resultLen = tb->recordPackCopy(p, 0);
|
136
|
+
else
|
137
|
+
memcpy(p, (const char*)data, resultLen);
|
138
|
+
p += resultLen;
|
139
|
+
}
|
136
140
|
|
141
|
+
if (P_MASK_DATALEN & paramMask)
|
142
|
+
memcpy(datalenPtr, (const char*)&resultLen, sizeof(uint_td));
|
143
|
+
}
|
137
144
|
if (P_MASK_KEYBUF & paramMask)
|
138
145
|
{
|
139
146
|
if (tb)
|
@@ -194,7 +194,7 @@ void dumpStdErr(int op, request& req, table* tb)
|
|
194
194
|
sprintf_s(msg.get(), 1024,
|
195
195
|
"[Transactd] Exception:op=%d Handle=%d tablename=%s datalen=%d"
|
196
196
|
" keynum=%d keylen=%d \n",
|
197
|
-
op, req.pbk->handle, tb ? tb->name().c_str() : "", *req.datalen,
|
197
|
+
op, req.pbk ? req.pbk->handle : -1, tb ? tb->name().c_str() : "", *req.datalen,
|
198
198
|
req.keyNum, req.keylen);
|
199
199
|
sql_print_error("%s", msg.get());
|
200
200
|
// dump Keybuf
|
@@ -505,6 +505,7 @@ inline bool dbExecuter::doOpenTable(request& req, char* buf, bool reconnect)
|
|
505
505
|
if (getschema)
|
506
506
|
mode -= TD_OPEN_MASK_GETSHCHEMA;
|
507
507
|
bool getDefaultImage = IS_MODE_GETDEFAULTIMAGE(mode);
|
508
|
+
bool bin_str = IS_MODE_BIN_STR(mode);
|
508
509
|
if (getDefaultImage)
|
509
510
|
mode -= TD_OPEN_MASK_GETDEFAULTIMAGE;
|
510
511
|
table* tb = NULL;
|
@@ -574,7 +575,7 @@ inline bool dbExecuter::doOpenTable(request& req, char* buf, bool reconnect)
|
|
574
575
|
if (getschema)
|
575
576
|
{
|
576
577
|
p += len;
|
577
|
-
len = m_tb->writeSchemaImage(p , *req.datalen - req.resultLen);
|
578
|
+
len = m_tb->writeSchemaImage(p , *req.datalen - req.resultLen, bin_str);
|
578
579
|
if (len == sizeof(ushort_td))
|
579
580
|
{
|
580
581
|
req.result = STATUS_BUFFERTOOSMALL;
|
@@ -688,32 +689,19 @@ inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
|
|
688
689
|
int ret = 1;
|
689
690
|
m_tb = getTable(req.pbk->handle);
|
690
691
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
691
|
-
if (keynum
|
692
|
-
{
|
693
|
-
m_tb->setNonKey(true);
|
694
|
-
op = TD_POS_NEXT_MULTI;
|
695
|
-
}
|
696
|
-
else
|
697
|
-
{
|
698
|
-
if (!m_tb->setKeyNum(keynum))
|
699
|
-
{
|
700
|
-
req.result = m_tb->stat();
|
701
|
-
return ret;
|
702
|
-
}
|
703
|
-
|
704
|
-
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
705
|
-
m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT
|
706
|
-
: HA_READ_KEY_OR_PREV,
|
707
|
-
m_tb->keymap());
|
708
|
-
}
|
709
|
-
|
692
|
+
if (keynum < 0) keynum = -2;
|
710
693
|
extRequest* ereq = (extRequest*)req.data;
|
711
694
|
bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
|
712
695
|
bool execPrepared = (ereq->itype & FILTER_TYPE_SUPPLYVALUE) != 0;
|
696
|
+
if (!m_tb->setKeyNumForMultiRead(keynum))
|
697
|
+
{
|
698
|
+
req.result = m_tb->stat();
|
699
|
+
return ret;
|
700
|
+
}
|
701
|
+
|
713
702
|
// smartReadRecordsHandler scope
|
714
703
|
{
|
715
704
|
smartReadRecordsHandler srrh(m_readHandler);
|
716
|
-
|
717
705
|
if (execPrepared)
|
718
706
|
{
|
719
707
|
if (m_tb->preparedStatements.size() < ereq->preparedId)
|
@@ -729,6 +717,20 @@ inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
|
|
729
717
|
noBookmark);
|
730
718
|
if (req.result != 0)
|
731
719
|
return ret;
|
720
|
+
if (keynum < 0)
|
721
|
+
{
|
722
|
+
if (op == TD_KEY_GE_NEXT_MULTI)
|
723
|
+
op = TD_POS_NEXT_MULTI;
|
724
|
+
else if (op == TD_KEY_LE_PREV_MULTI)
|
725
|
+
op = TD_POS_PREV_MULTI;
|
726
|
+
}
|
727
|
+
else
|
728
|
+
{
|
729
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
730
|
+
m_tb->seekKey(
|
731
|
+
(op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT : HA_READ_KEY_OR_PREV,
|
732
|
+
m_tb->keymap());
|
733
|
+
}
|
732
734
|
if (m_tb->stat() == 0)
|
733
735
|
{
|
734
736
|
if (op == TD_KEY_GE_NEXT_MULTI)
|
@@ -778,7 +780,16 @@ inline int dbExecuter::doReadMulti(request& req, int op,
|
|
778
780
|
if (op == TD_KEY_SEEK_MULTI && !(ereq->itype & FILTER_TYPE_SEEKS_BOOKMARKS))
|
779
781
|
{
|
780
782
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
781
|
-
if (
|
783
|
+
if (keynum < 0)
|
784
|
+
{
|
785
|
+
if (op != TD_POS_NEXT_MULTI && op != TD_POS_PREV_MULTI)
|
786
|
+
{
|
787
|
+
req.result = STATUS_INVALID_KEYNUM;
|
788
|
+
return ret;
|
789
|
+
}
|
790
|
+
keynum = -2;
|
791
|
+
}
|
792
|
+
if (!m_tb->setKeyNumForMultiRead(keynum))
|
782
793
|
{
|
783
794
|
req.result = m_tb->stat();
|
784
795
|
return ret;
|
@@ -994,26 +1005,29 @@ inline void dbExecuter::doInsert(request& req)
|
|
994
1005
|
}
|
995
1006
|
}
|
996
1007
|
m_tb->clearBuffer();
|
1008
|
+
autoIncPackInfo ai;
|
997
1009
|
m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
|
998
|
-
req.blobHeader);
|
999
|
-
|
1010
|
+
req.blobHeader, &ai);
|
1011
|
+
ai.value = m_tb->insert(ncc);
|
1000
1012
|
req.result = errorCodeSht(m_tb->stat());
|
1001
1013
|
if (m_tb->stat() == 0)
|
1002
1014
|
{
|
1003
|
-
if (
|
1015
|
+
if (ai.value && ai.len && *req.datalen >= ai.len)
|
1004
1016
|
{
|
1005
|
-
req.paramMask =
|
1006
|
-
req.
|
1017
|
+
req.paramMask = P_MASK_DB_AINC_VAL | P_MASK_POSBLK | P_MASK_KEYBUF;
|
1018
|
+
memcpy(req.datalen, &ai, sizeof(autoIncPackInfo));
|
1007
1019
|
}
|
1008
1020
|
else
|
1009
1021
|
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
1010
|
-
}
|
1022
|
+
}else
|
1023
|
+
req.paramMask = 0;
|
1011
1024
|
if (!m_tb->cursor())
|
1012
1025
|
req.paramMask |= P_MASK_PB_ERASE_BM;
|
1013
1026
|
}
|
1014
1027
|
|
1015
|
-
inline void dbExecuter::doUpdateKey(request& req)
|
1028
|
+
inline void dbExecuter::doUpdateKey(request& req, bool confrictCheck)
|
1016
1029
|
{
|
1030
|
+
|
1017
1031
|
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
1018
1032
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
1019
1033
|
if (m_tb->setKeyNum(keynum))
|
@@ -1022,12 +1036,12 @@ inline void dbExecuter::doUpdateKey(request& req)
|
|
1022
1036
|
m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
|
1023
1037
|
if (m_tb->stat() == 0)
|
1024
1038
|
{
|
1025
|
-
m_tb->beginUpdate(keynum);
|
1039
|
+
double updateAtBefore = m_tb->beginUpdate(keynum, confrictCheck ? 2 : 0);
|
1026
1040
|
if (m_tb->stat() == 0)
|
1027
1041
|
{
|
1028
1042
|
m_tb->setRecordFromPacked((const uchar*)req.data,
|
1029
|
-
*(req.datalen), req.blobHeader);
|
1030
|
-
m_tb->update(true);
|
1043
|
+
*(req.datalen), req.blobHeader, NULL);
|
1044
|
+
m_tb->update(true, updateAtBefore);
|
1031
1045
|
}
|
1032
1046
|
}
|
1033
1047
|
}
|
@@ -1037,16 +1051,17 @@ inline void dbExecuter::doUpdateKey(request& req)
|
|
1037
1051
|
req.paramMask |= P_MASK_PB_ERASE_BM;
|
1038
1052
|
}
|
1039
1053
|
|
1040
|
-
inline void dbExecuter::doUpdate(request& req)
|
1054
|
+
inline void dbExecuter::doUpdate(request& req, bool confrictCheck)
|
1041
1055
|
{
|
1056
|
+
|
1042
1057
|
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
1043
1058
|
bool ncc = (req.keyNum == -1);
|
1044
|
-
m_tb->beginUpdate(req.keyNum);
|
1059
|
+
double updateAtBefore = m_tb->beginUpdate(req.keyNum, confrictCheck ? 1 : 0);
|
1045
1060
|
if (m_tb->stat() == 0)
|
1046
1061
|
{
|
1047
1062
|
m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
|
1048
|
-
req.blobHeader);
|
1049
|
-
m_tb->update(ncc);
|
1063
|
+
req.blobHeader, NULL);
|
1064
|
+
m_tb->update(ncc, updateAtBefore);
|
1050
1065
|
}
|
1051
1066
|
req.result = errorCodeSht(m_tb->stat());
|
1052
1067
|
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
@@ -1054,7 +1069,7 @@ inline void dbExecuter::doUpdate(request& req)
|
|
1054
1069
|
req.paramMask |= P_MASK_PB_ERASE_BM;
|
1055
1070
|
}
|
1056
1071
|
|
1057
|
-
inline void dbExecuter::doDeleteKey(request& req)
|
1072
|
+
inline void dbExecuter::doDeleteKey(request& req, bool confrictCheck)
|
1058
1073
|
{
|
1059
1074
|
m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
|
1060
1075
|
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
@@ -1064,9 +1079,13 @@ inline void dbExecuter::doDeleteKey(request& req)
|
|
1064
1079
|
m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
|
1065
1080
|
if (m_tb->stat() == 0)
|
1066
1081
|
{
|
1067
|
-
m_tb->beginDel();
|
1082
|
+
double updateAtBefore = m_tb->beginDel(confrictCheck ? 2 : 0);
|
1068
1083
|
if (m_tb->stat() == 0)
|
1069
|
-
|
1084
|
+
{
|
1085
|
+
if (confrictCheck)
|
1086
|
+
m_tb->setUpdateTimeValue(req.data);
|
1087
|
+
m_tb->del(updateAtBefore);
|
1088
|
+
}
|
1070
1089
|
}
|
1071
1090
|
}
|
1072
1091
|
req.result = errorCodeSht(m_tb->stat());
|
@@ -1075,12 +1094,16 @@ inline void dbExecuter::doDeleteKey(request& req)
|
|
1075
1094
|
req.paramMask |= P_MASK_PB_ERASE_BM;
|
1076
1095
|
}
|
1077
1096
|
|
1078
|
-
inline void dbExecuter::doDelete(request& req)
|
1097
|
+
inline void dbExecuter::doDelete(request& req, bool confrictCheck)
|
1079
1098
|
{
|
1080
1099
|
m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
|
1081
|
-
m_tb->beginDel();
|
1100
|
+
double updateAtBefore = m_tb->beginDel(confrictCheck ? 1 : 0);
|
1082
1101
|
if (m_tb->stat() == 0)
|
1083
|
-
|
1102
|
+
{
|
1103
|
+
if (confrictCheck)
|
1104
|
+
m_tb->setUpdateTimeValue(req.data);
|
1105
|
+
m_tb->del(updateAtBefore);
|
1106
|
+
}
|
1084
1107
|
req.result = errorCodeSht(m_tb->stat());
|
1085
1108
|
req.paramMask = P_MASK_POSBLK;
|
1086
1109
|
if (!m_tb->cursor())
|
@@ -1111,7 +1134,7 @@ inline void dbExecuter::doInsertBulk(request& req)
|
|
1111
1134
|
{
|
1112
1135
|
m_tb->clearBuffer();
|
1113
1136
|
m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len,
|
1114
|
-
req.blobHeader);
|
1137
|
+
req.blobHeader, NULL);
|
1115
1138
|
if (i == *n - 1)
|
1116
1139
|
m_tb->insert((req.keyNum != -1));
|
1117
1140
|
else
|
@@ -1143,7 +1166,7 @@ inline void dbExecuter::doGetSchema(request& req, netsvc::server::netWriter* nw)
|
|
1143
1166
|
char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
|
1144
1167
|
if (req.keyNum == SC_SUBOP_VIEW_BY_SQL)
|
1145
1168
|
{// Return SQL statement as show create view.
|
1146
|
-
TABLE_LIST tables; char key[256];
|
1169
|
+
TABLE_LIST tables; char key[256]={0};
|
1147
1170
|
const char* keyPtr = key;
|
1148
1171
|
database* db = getDatabaseCid(req.cid);
|
1149
1172
|
THD* thd = db->thd();
|
@@ -1190,7 +1213,9 @@ inline void dbExecuter::doGetSchema(request& req, netsvc::server::netWriter* nw)
|
|
1190
1213
|
{// Return tabledef image binary.
|
1191
1214
|
database* db = getDatabaseCid(req.cid);
|
1192
1215
|
std::string name = getTableName(req);
|
1193
|
-
|
1216
|
+
unsigned char bin_char_index =
|
1217
|
+
(req.keyNum == SC_SUBOP_TABLEDEF_BIN_STR) ? 0 : CHARSET_BIN;
|
1218
|
+
schemaBuilder sb(bin_char_index);
|
1194
1219
|
protocol::tdap::tabledef* td = sb.getTabledef(db, name.c_str(),
|
1195
1220
|
(unsigned char*)p, *req.datalen);
|
1196
1221
|
if (td)
|
@@ -1334,16 +1359,16 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1334
1359
|
doInsert(req);
|
1335
1360
|
break;
|
1336
1361
|
case TD_REC_UPDATEATKEY:
|
1337
|
-
doUpdateKey(req);
|
1362
|
+
doUpdateKey(req, opTrn > 100);
|
1338
1363
|
break;
|
1339
1364
|
case TD_REC_UPDATE:
|
1340
|
-
doUpdate(req);
|
1365
|
+
doUpdate(req, opTrn > 100);
|
1341
1366
|
break;
|
1342
1367
|
case TD_REC_DELLETEATKEY:
|
1343
|
-
doDeleteKey(req);
|
1368
|
+
doDeleteKey(req, opTrn > 100);
|
1344
1369
|
break;
|
1345
1370
|
case TD_REC_DELETE:
|
1346
|
-
doDelete(req);
|
1371
|
+
doDelete(req, opTrn > 100);
|
1347
1372
|
break;
|
1348
1373
|
case TD_BEGIN_TRANSACTION:
|
1349
1374
|
{
|
@@ -1526,14 +1551,18 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1526
1551
|
break;
|
1527
1552
|
case TD_GET_PER:
|
1528
1553
|
m_tb = getTable(req.pbk->handle);
|
1529
|
-
m_tb->
|
1530
|
-
req.result = errorCodeSht(m_tb->stat());
|
1531
|
-
if (m_tb->stat() == 0)
|
1554
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
1532
1555
|
{
|
1533
|
-
|
1534
|
-
req.
|
1535
|
-
|
1536
|
-
|
1556
|
+
m_tb->calcPercentage();
|
1557
|
+
req.result = errorCodeSht(m_tb->stat());
|
1558
|
+
if (m_tb->stat() == 0)
|
1559
|
+
{
|
1560
|
+
req.paramMask = P_MASK_DATA | P_MASK_DATALEN ;
|
1561
|
+
req.data = m_tb->percentResult();
|
1562
|
+
req.resultLen = sizeof(int);
|
1563
|
+
}
|
1564
|
+
}else
|
1565
|
+
req.result = m_tb->stat();
|
1537
1566
|
break;
|
1538
1567
|
case TD_INSERT_BULK:
|
1539
1568
|
doInsertBulk(req);
|
@@ -1574,9 +1603,12 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1574
1603
|
releaseDatabase(req, op);
|
1575
1604
|
break;
|
1576
1605
|
case TD_AUTOMEKE_SCHEMA:
|
1606
|
+
{
|
1577
1607
|
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
1578
|
-
|
1608
|
+
unsigned char bin_char_index = (req.keyNum & 2) ? 0 : CHARSET_BIN;
|
1609
|
+
req.result = schemaBuilder(bin_char_index).execute(getDatabaseCid(req.cid), m_tb, (req.keyNum & 1));
|
1579
1610
|
break;
|
1611
|
+
}
|
1580
1612
|
case TD_CREATETABLE:
|
1581
1613
|
doCreateTable(req);
|
1582
1614
|
break;
|
@@ -1681,7 +1713,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1681
1713
|
{
|
1682
1714
|
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
1683
1715
|
bool ncc = (req.keyNum == -1);
|
1684
|
-
m_tb->beginUpdate(req.keyNum);
|
1716
|
+
double v = m_tb->beginUpdate(req.keyNum, opTrn > 100);
|
1685
1717
|
if (m_tb->stat() == 0)
|
1686
1718
|
{
|
1687
1719
|
std::vector<std::string> ss;
|
@@ -1691,7 +1723,7 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1691
1723
|
{
|
1692
1724
|
for (int i = 0; i < (int)ss.size() ; i+=2)
|
1693
1725
|
m_tb->setValue((short)atol(ss[i].c_str()), ss[i + 1], 0);
|
1694
|
-
m_tb->update(ncc);
|
1726
|
+
m_tb->update(ncc, v);
|
1695
1727
|
req.result = errorCodeSht(m_tb->stat());
|
1696
1728
|
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
1697
1729
|
if (!m_tb->cursor())
|
@@ -80,10 +80,10 @@ class dbExecuter : public engine::mysql::dbManager
|
|
80
80
|
inline void doStepRead(request& req, int op, engine::mysql::rowLockMode* lock);
|
81
81
|
|
82
82
|
inline void doInsert(request& req);
|
83
|
-
inline void doUpdate(request& req);
|
84
|
-
inline void doUpdateKey(request& req);
|
85
|
-
inline void doDelete(request& req);
|
86
|
-
inline void doDeleteKey(request& req);
|
83
|
+
inline void doUpdate(request& req, bool confrictCheck);
|
84
|
+
inline void doUpdateKey(request& req, bool confrictCheck);
|
85
|
+
inline void doDelete(request& req, bool confrictCheck);
|
86
|
+
inline void doDeleteKey(request& req, bool confrictCheck);
|
87
87
|
inline void doInsertBulk(request& req);
|
88
88
|
inline void doGetSchema(request& req, netsvc::server::netWriter* nw);
|
89
89
|
inline void doStat(request& req);
|