📄 testoibasic.cpp
字号:
t->coladd(0, new Col(*t, 0, "a", 1, Col::Char, 31, 0, getcs(par))); t->coladd(1, new Col(*t, 1, "b", 0, Col::Char, 4, 1, getcs(par))); t->coladd(2, new Col(*t, 2, "c", 1, Col::Unsigned, 1, 0, 0)); t->coladd(3, new Col(*t, 3, "d", 1, Col::Varchar, 128, 0, getcs(par))); t->coladd(4, new Col(*t, 4, "e", 0, Col::Varchar, 7, 0, getcs(par))); if (useindex(par, 0)) { // a, c, d ITab* x = new ITab(*t, "ti2x0", ITab::OrderedIndex, 3); x->icoladd(0, new ICol(*x, 0, *t->m_col[0])); x->icoladd(1, new ICol(*x, 1, *t->m_col[2])); x->icoladd(2, new ICol(*x, 2, *t->m_col[3])); t->itabadd(0, x); } if (useindex(par, 1)) { // e, d, c, b, a ITab* x = new ITab(*t, "ti2x1", ITab::OrderedIndex, 5); x->icoladd(0, new ICol(*x, 0, *t->m_col[4])); x->icoladd(1, new ICol(*x, 1, *t->m_col[3])); x->icoladd(2, new ICol(*x, 2, *t->m_col[2])); x->icoladd(3, new ICol(*x, 3, *t->m_col[1])); x->icoladd(4, new ICol(*x, 4, *t->m_col[0])); t->itabadd(1, x); } if (useindex(par, 2)) { // d ITab* x = new ITab(*t, "ti2x2", ITab::OrderedIndex, 1); x->icoladd(0, new ICol(*x, 0, *t->m_col[3])); t->itabadd(2, x); } if (useindex(par, 3)) { // b ITab* x = new ITab(*t, "ti2x3", ITab::OrderedIndex, 1); x->icoladd(0, new ICol(*x, 0, *t->m_col[1])); t->itabadd(3, x); } if (useindex(par, 4)) { // a, c ITab* x = new ITab(*t, "ti2z4", ITab::UniqueHashIndex, 2); x->icoladd(0, new ICol(*x, 0, *t->m_col[0])); x->icoladd(1, new ICol(*x, 1, *t->m_col[2])); t->itabadd(4, x); } if (useindex(par, 5)) { // a, c, d, e ITab* x = new ITab(*t, "ti2z5", ITab::UniqueHashIndex, 4); x->icoladd(0, new ICol(*x, 0, *t->m_col[0])); x->icoladd(1, new ICol(*x, 1, *t->m_col[2])); x->icoladd(2, new ICol(*x, 2, *t->m_col[3])); x->icoladd(3, new ICol(*x, 3, *t->m_col[4])); t->itabadd(5, x); } tablist[2] = t; } verifytables();}// connectionsstatic Ndb_cluster_connection* g_ncc = 0;struct Con { Ndb* m_ndb; NdbDictionary::Dictionary* m_dic; NdbConnection* m_tx; NdbOperation* m_op; NdbIndexOperation* m_indexop; NdbScanOperation* m_scanop; NdbIndexScanOperation* m_indexscanop; NdbScanFilter* m_scanfilter; enum ScanMode { ScanNo = 0, Committed, Latest, Exclusive }; ScanMode m_scanmode; enum ErrType { ErrNone = 0, ErrDeadlock, ErrNospace, ErrOther }; ErrType m_errtype; Con() : m_ndb(0), m_dic(0), m_tx(0), m_op(0), m_indexop(0), m_scanop(0), m_indexscanop(0), m_scanfilter(0), m_scanmode(ScanNo), m_errtype(ErrNone) {} ~Con() { if (m_tx != 0) closeTransaction(); } int connect(); void connect(const Con& con); void disconnect(); int startTransaction(); int getNdbOperation(const Tab& tab); int getNdbIndexOperation1(const ITab& itab, const Tab& tab); int getNdbIndexOperation(const ITab& itab, const Tab& tab); int getNdbScanOperation(const Tab& tab); int getNdbIndexScanOperation1(const ITab& itab, const Tab& tab); int getNdbIndexScanOperation(const ITab& itab, const Tab& tab); int getNdbScanFilter(); int equal(int num, const char* addr); int getValue(int num, NdbRecAttr*& rec); int setValue(int num, const char* addr); int setBound(int num, int type, const void* value); int beginFilter(int group); int endFilter(); int setFilter(int num, int cond, const void* value, unsigned len); int execute(ExecType t); int execute(ExecType t, bool& deadlock, bool& nospace); int readTuples(Par par); int readIndexTuples(Par par); int executeScan(); int nextScanResult(bool fetchAllowed); int nextScanResult(bool fetchAllowed, bool& deadlock); int updateScanTuple(Con& con2); int deleteScanTuple(Con& con2); void closeScan(); void closeTransaction(); void printerror(NdbOut& out);};intCon::connect(){ assert(m_ndb == 0); m_ndb = new Ndb(g_ncc, "TEST_DB"); CHKCON(m_ndb->init() == 0, *this); CHKCON(m_ndb->waitUntilReady(30) == 0, *this); m_tx = 0, m_op = 0; return 0;}voidCon::connect(const Con& con){ assert(m_ndb == 0); m_ndb = con.m_ndb;}voidCon::disconnect(){ delete m_ndb; m_ndb = 0, m_dic = 0, m_tx = 0, m_op = 0;}intCon::startTransaction(){ assert(m_ndb != 0); if (m_tx != 0) closeTransaction(); CHKCON((m_tx = m_ndb->startTransaction()) != 0, *this); return 0;}intCon::getNdbOperation(const Tab& tab){ assert(m_tx != 0); CHKCON((m_op = m_tx->getNdbOperation(tab.m_name)) != 0, *this); return 0;}intCon::getNdbIndexOperation1(const ITab& itab, const Tab& tab){ assert(m_tx != 0); CHKCON((m_op = m_indexop = m_tx->getNdbIndexOperation(itab.m_name, tab.m_name)) != 0, *this); return 0;}intCon::getNdbIndexOperation(const ITab& itab, const Tab& tab){ assert(m_tx != 0); unsigned tries = 0; while (1) { if (getNdbIndexOperation1(itab, tab) == 0) break; CHK(++tries < 10); NdbSleep_MilliSleep(100); } return 0;}intCon::getNdbScanOperation(const Tab& tab){ assert(m_tx != 0); CHKCON((m_op = m_scanop = m_tx->getNdbScanOperation(tab.m_name)) != 0, *this); return 0;}intCon::getNdbIndexScanOperation1(const ITab& itab, const Tab& tab){ assert(m_tx != 0); CHKCON((m_op = m_scanop = m_indexscanop = m_tx->getNdbIndexScanOperation(itab.m_name, tab.m_name)) != 0, *this); return 0;}intCon::getNdbIndexScanOperation(const ITab& itab, const Tab& tab){ assert(m_tx != 0); unsigned tries = 0; while (1) { if (getNdbIndexScanOperation1(itab, tab) == 0) break; CHK(++tries < 10); NdbSleep_MilliSleep(100); } return 0;}intCon::getNdbScanFilter(){ assert(m_tx != 0 && m_scanop != 0); delete m_scanfilter; m_scanfilter = new NdbScanFilter(m_scanop); return 0;}intCon::equal(int num, const char* addr){ assert(m_tx != 0 && m_op != 0); CHKCON(m_op->equal(num, addr) == 0, *this); return 0;}intCon::getValue(int num, NdbRecAttr*& rec){ assert(m_tx != 0 && m_op != 0); CHKCON((rec = m_op->getValue(num, 0)) != 0, *this); return 0;}intCon::setValue(int num, const char* addr){ assert(m_tx != 0 && m_op != 0); CHKCON(m_op->setValue(num, addr) == 0, *this); return 0;}intCon::setBound(int num, int type, const void* value){ assert(m_tx != 0 && m_indexscanop != 0); CHKCON(m_indexscanop->setBound(num, type, value) == 0, *this); return 0;}intCon::beginFilter(int group){ assert(m_tx != 0 && m_scanfilter != 0); CHKCON(m_scanfilter->begin((NdbScanFilter::Group)group) == 0, *this); return 0;}intCon::endFilter(){ assert(m_tx != 0 && m_scanfilter != 0); CHKCON(m_scanfilter->end() == 0, *this); return 0;}intCon::setFilter(int num, int cond, const void* value, unsigned len){ assert(m_tx != 0 && m_scanfilter != 0); CHKCON(m_scanfilter->cmp((NdbScanFilter::BinaryCondition)cond, num, value, len) == 0, *this); return 0;}intCon::execute(ExecType t){ assert(m_tx != 0); CHKCON(m_tx->execute(t) == 0, *this); return 0;}intCon::execute(ExecType t, bool& deadlock, bool& nospace){ int ret = execute(t); if (ret != 0 && deadlock && m_errtype == ErrDeadlock) { LL3("caught deadlock"); ret = 0; } else { deadlock = false; } if (ret != 0 && nospace && m_errtype == ErrNospace) { LL3("caught nospace"); ret = 0; } else { nospace = false; } CHK(ret == 0); return 0;}intCon::readTuples(Par par){ assert(m_tx != 0 && m_scanop != 0); int scan_flags = 0; if (par.m_tupscan) scan_flags |= NdbScanOperation::SF_TupScan; CHKCON(m_scanop->readTuples(par.m_lockmode, scan_flags, par.m_scanpar) == 0, *this); return 0;}intCon::readIndexTuples(Par par){ assert(m_tx != 0 && m_indexscanop != 0); CHKCON(m_indexscanop->readTuples(par.m_lockmode, 0, par.m_scanpar, par.m_ordered, par.m_descending) == 0, *this); return 0;}intCon::executeScan(){ CHKCON(m_tx->execute(NoCommit) == 0, *this); return 0;}intCon::nextScanResult(bool fetchAllowed){ int ret; assert(m_scanop != 0); CHKCON((ret = m_scanop->nextResult(fetchAllowed)) != -1, *this); assert(ret == 0 || ret == 1 || (! fetchAllowed && ret == 2)); return ret;}intCon::nextScanResult(bool fetchAllowed, bool& deadlock){ int ret = nextScanResult(fetchAllowed); if (ret == -1) { if (deadlock && m_errtype == ErrDeadlock) { LL3("caught deadlock"); ret = 0; } } else { deadlock = false; } CHK(ret == 0 || ret == 1 || (! fetchAllowed && ret == 2)); return ret;}intCon::updateScanTuple(Con& con2){ assert(con2.m_tx != 0); CHKCON((con2.m_op = m_scanop->updateCurrentTuple(con2.m_tx)) != 0, *this); return 0;}intCon::deleteScanTuple(Con& con2){ assert(con2.m_tx != 0); CHKCON(m_scanop->deleteCurrentTuple(con2.m_tx) == 0, *this); return 0;}voidCon::closeScan(){ assert(m_scanop != 0); m_scanop->close(); m_scanop = 0, m_indexscanop = 0;}voidCon::closeTransaction(){ assert(m_ndb != 0 && m_tx != 0); m_ndb->closeTransaction(m_tx); m_tx = 0, m_op = 0; m_scanop = 0, m_indexscanop = 0;}voidCon::printerror(NdbOut& out){ m_errtype = ErrOther; unsigned any = 0; int code; int die = 0; if (m_ndb) { if ((code = m_ndb->getNdbError().code) != 0) { LL0(++any << " ndb: error " << m_ndb->getNdbError()); die += (code == g_opt.m_die); } if (m_dic && (code = m_dic->getNdbError().code) != 0) { LL0(++any << " dic: error " << m_dic->getNdbError()); die += (code == g_opt.m_die); } if (m_tx) { if ((code = m_tx->getNdbError().code) != 0) { LL0(++any << " con: error " << m_tx->getNdbError()); die += (code == g_opt.m_die); // 631 is new, occurs only on 4 db nodes, needs to be checked out if (code == 266 || code == 274 || code == 296 || code == 297 || code == 499 || code == 631) m_errtype = ErrDeadlock; if (code == 826 || code == 827 || code == 902) m_errtype = ErrNospace; } if (m_op && m_op->getNdbError().code != 0) { LL0(++any << " op : error " << m_op->getNdbError()); die += (code == g_opt.m_die); } } } if (! any) { LL0("failed but no NDB error code"); } if (die) { if (g_opt.m_core) abort(); exit(1); }}// dictionary operationsstatic intinvalidateindex(Par par, const ITab& itab){ Con& con = par.con(); const Tab& tab = par.tab(); con.m_ndb->getDictionary()->invalidateIndex(itab.m_name, tab.m_name); return 0;}static intinvalidateindex(Par par){ Con& con = par.con(); const Tab& tab = par.tab(); for (unsigned i = 0; i < tab.m_itabs; i++) { if (tab.m_itab[i] == 0) continue; const ITab& itab = *tab.m_itab[i]; invalidateindex(par, itab); } return 0;}static intinvalidatetable(Par par){ Con& con = par.con(); const Tab& tab = par.tab(); invalidateindex(par); con.m_ndb->getDictionary()->invalidateTable(tab.m_name); return 0;}static intdroptable(Par par){ Con& con = par.con(); const Tab& tab = par.tab(); con.m_dic = con.m_ndb->getDictionary(); if (con.m_dic->getTable(tab.m_name) == 0) { // how to check for error LL4("no table " << tab.m_name); } else { LL3("drop table " << tab.m_name); CHKCON(con.m_dic->dropTable(tab.m_name) == 0, con); } con.m_dic = 0; return 0;}static intcreatetable(Par par){ Con& con = par.con(); const Tab& tab = par.tab(); LL3("create table " << tab.m_name); LL4(tab); NdbDictionary::Table t(tab.m_name); if (par.m_fragtype != NdbDictionary::Object::FragUndefined) { t.setFragmentType(par.m_fragtype); } if (par.m_nologging) { t.setLogging(false); } for (unsigned k = 0; k < tab.m_cols; k++) { const Col& col = *tab.m_col[k]; NdbDictionary::Column c(col.m_name); c.setType((NdbDictionary::Column::Type)col.m_type); c.setLength(col.m_bytelength); // for char NDB API uses length in bytes c.setPrimaryKey(col.m_pk); c.setNullable(col.m_nullable); if (col.m_chs != 0) c.setCharset(col.m_chs->m_cs); t.addColumn(c); } con.m_dic = con.m_ndb->getDictionary(); CHKCON(con.m_dic->createTable(t) == 0, con); con.m_dic = 0; return 0;}static intdropindex(Par par, const ITab& itab){ Con& con = par.con(); const Tab& tab = par.tab(); con.m_dic = con.m_ndb->getDictionary(); if (con.m_dic->getIndex(itab.m_name, tab.m_name) == 0) { // how to check for error LL4("no index " << itab.m_name); } else { LL3("drop index " << itab.m_name); CHKCON(con.m_dic->dropIndex(itab.m_name, tab.m_name) == 0, con); } con.m_dic = 0; return 0;}static intdropindex(Par par){ const Tab& tab = par.tab(); for (unsigned i = 0; i < tab.m_itabs; i++) { if (tab.m_itab[i] == 0) continue; const ITab& itab = *tab.m_itab[i]; CHK(dropindex(par, itab) == 0); } return 0;}static intcreateindex(Par par, const ITab& itab){ Con& con = par.con(); const Tab& tab = par.tab(); LL3("create index " << itab.m_name); LL4(itab); NdbDictionary::Index x(itab.m_name); x.setTable(tab.m_name); x.setType((NdbDictionary::Index::Type)itab.m_type); if (par.m_nologging || itab.m_type == ITab::OrderedIndex) { x.setLogging(false); } for (unsigned k = 0; k < itab.m_icols; k++) { const ICol& icol = *itab.m_icol[k]; const Col& col = icol.m_col; x.addColumnName(col.m_name); } con.m_dic = con.m_ndb->getDictionary(); CHKCON(con.m_dic->createIndex(x) == 0, con); con.m_dic = 0; return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -