⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testoibasic.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -