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

📄 isql++.cpp

📁 絲路server源碼 Silk Road server source
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      do {	cout << this->makeIdentifier	  (tableRs->getString(1),tableRs->getString(2),tableRs->getString(3));		cout << " (" << tableRs->getString(4) << ")" << endl;	string desc=tableRs->getString(5);	bool descIsNull=tableRs->wasNull();	int nameLength=30;	int nullabilityLength=10;	int typeLength=25;	string nameTitle="Column name";	string nullabilityTitle="Nullable";	string typeTitle="Data type";		nameTitle.resize(nameLength,SPACE_CHAR);	typeTitle.resize(typeLength,SPACE_CHAR);	nullabilityTitle.resize(nullabilityLength,SPACE_CHAR);		cout << OUTER_SEPARATOR << nameTitle	     << INNER_SEPARATOR << typeTitle	     << INNER_SEPARATOR << nullabilityTitle	     << OUTER_SEPARATOR << endl;	string t;	cout << OUTER_SEPARATOR;	t.resize(nameLength,LINE_CHAR);	cout << t << INNER_SEPARATOR;	t.resize(typeLength,LINE_CHAR);	cout << t << INNER_SEPARATOR;	t.resize(nullabilityLength,LINE_CHAR);	cout << t << OUTER_SEPARATOR << endl;		//now, fetch the columns	{	  ResultSet* rs=md->getColumns	    (catalog,schema,tableRs->getString(3),"%");	  Deleter<ResultSet> _rs(rs);	  	  while(rs->next()) {	    cout << OUTER_SEPARATOR;	    string colName=rs->getString(4);	    colName.resize(nameLength,SPACE_CHAR);	    string typeName=rs->getString(6);	    typeName.resize(typeLength,SPACE_CHAR);	    	    string nullInfo;	    switch(rs->getInt(11)) {	    case DatabaseMetaData::columnNoNulls:	      nullInfo="No";	      break;	    case DatabaseMetaData::columnNullable:	      nullInfo="Yes";	      break;	    default:	      nullInfo="Unknown";	      break;	    }	    nullInfo.resize(nullabilityLength);	    	    cout << colName << INNER_SEPARATOR		 << typeName << INNER_SEPARATOR		 << nullInfo << OUTER_SEPARATOR		 << endl;	  }	}	cout << endl;	try {	  ResultSet* rs=md->getPrimaryKeys(tableRs->getString(1),					   tableRs->getString(2),					   tableRs->getString(3));	  Deleter<ResultSet> _rs(rs);	  string colNames;	  string keyName;	  bool keyNameIsNull=true;	  if(rs->next()) {	    try {	      keyName=rs->getString(6);	      keyNameIsNull=rs->wasNull();	    } catch(SQLException&) {} //temporary workaround for OL driver	    do {	      if(colNames.length()>0) {		colNames+=",";	      }	      colNames+=rs->getString(4);	    } while(rs->next());	  }	  if(colNames.length()>0) {	    cout << OUTER_SEPARATOR << "PRIMARY KEY "		 << "(" << colNames << ")" << endl;	      	  }	} catch(SQLException& e) {	}	//fetch the foreign keys	try {	  ResultSet* rs=md->getImportedKeys(tableRs->getString(1),					    tableRs->getString(2),					    tableRs->getString(3));	  	  Deleter<ResultSet> _rs(rs);	  	  bool goon=rs->next();	  // here, we trust that the result set is ordered	  // by key_seq	  while(goon) {	    string pkTable=this->makeIdentifier	      (rs->getString(1),rs->getString(2),rs->getString(3));	    string pkCols;	    string fkCols;	    short ks=rs->getShort(9);	    	    pkCols+=rs->getString(4);	    fkCols+=rs->getString(8);	    	    while(goon=rs->next()) {	      if(rs->getShort(9)==1) {		//this is part of another key		break;	      }	      	      pkCols+=",";	      fkCols+=",";	      	      pkCols+=rs->getString(4);	      fkCols+=rs->getString(8);	    }	    	    cout << OUTER_SEPARATOR << "FOREIGN KEY ("		 << fkCols << ") REFERENCES " 		 << pkTable << " (" << pkCols << ")"		 << OUTER_SEPARATOR << endl;	  }	} catch(SQLException& e) {	  // ignore, probably not supported	}	try {	  ResultSet* rs=md->getIndexInfo(tableRs->getString(1),					 tableRs->getString(2),					 tableRs->getString(3),					 false,false);	  Deleter<ResultSet> _rs(rs);	  bool goon=rs->next();	  while(goon) {	    //ignore statistics	    if(rs->getShort(7)==DatabaseMetaData::tableIndexStatistic) {	      goon=rs->next();	      break;	    }	    	    string idxName=rs->getString(6);	    string cols=rs->getString(9);	    string order=(rs->getString(10)=="A"?"ASC":"DESC");	    string unique=(rs->getBoolean(4)?"":"UNIQUE ");	    	    while(goon=rs->next()) {	      if(rs->getShort(8)==1) {		// part of next index		break;	      }	      cols+=","+rs->getString(9);	    }	    cout << OUTER_SEPARATOR << unique << order		 << " INDEX " << idxName << " ON (" << cols << ")" << endl;	  }	  	} catch(SQLException&) {}	try {	  ResultSet* rs=md->getBestRowIdentifier(tableRs->getString(1),						 tableRs->getString(2),						 tableRs->getString(3),						 DatabaseMetaData::bestRowTemporary,						 true);	  Deleter<ResultSet> _rs(rs);	  if(rs->next()) {	    cout << endl;	    int nameLength=30;	    int pseudoLength=10;	    int scopeLength=30;	    string nameTitle="Column name";	    string pseudoTitle="Pseudo";	    string scopeTitle="Scope";	    cout << OUTER_SEPARATOR << "Best row identifiers" << endl;		    nameTitle.resize(nameLength,SPACE_CHAR);	    pseudoTitle.resize(pseudoLength,SPACE_CHAR);	    scopeTitle.resize(scopeLength,SPACE_CHAR);		    cout << OUTER_SEPARATOR << nameTitle		 << INNER_SEPARATOR << pseudoTitle		 << INNER_SEPARATOR << scopeTitle		 << OUTER_SEPARATOR << endl;	    	    string t;	    cout << OUTER_SEPARATOR;	    t.resize(nameLength,LINE_CHAR);	    cout << t << INNER_SEPARATOR;	    t.resize(pseudoLength,LINE_CHAR);	    cout << t << INNER_SEPARATOR;	    t.resize(scopeLength,LINE_CHAR);	    cout << t << OUTER_SEPARATOR << endl;	    do {	      string colName=rs->getString(2);	      string pseudo;	      string scope;	      switch(rs->getInt(8)) {	      case DatabaseMetaData::bestRowPseudo:		pseudo="Yes";		break;	      case DatabaseMetaData::bestRowNotPseudo:		pseudo="No";		break;	      case DatabaseMetaData::bestRowUnknown:		pseudo="Unknown";		break;	      default:		pseudo="?";		break;	      }	      switch(rs->getInt(1)) {	      case DatabaseMetaData::bestRowTemporary:		scope="While positioned on row";		break;	      case DatabaseMetaData::bestRowTransaction:		scope="Current transaction";		break;	      case DatabaseMetaData::bestRowSession:		scope="Session (across transactions)";		break;	      default:		scope="?";		break;	      }	      colName.resize(nameLength,SPACE_CHAR);	      pseudo.resize(pseudoLength,SPACE_CHAR);	      scope.resize(scopeLength,SPACE_CHAR);	      cout << OUTER_SEPARATOR << colName		   << INNER_SEPARATOR << pseudo		   << INNER_SEPARATOR << scope		   << OUTER_SEPARATOR << endl;	    } while(rs->next());	  } 	} catch(SQLException& e) {	  // ignore	}	cout << endl;		if(!descIsNull && desc.length()>0) {	  cout << OUTER_SEPARATOR << "Description" << endl;	  cout << OUTER_SEPARATOR << "===========" << endl;	  cout << OUTER_SEPARATOR << desc << endl;	  cout << endl;	}      } while(tableRs->next());    }  }  bool wasProcedure=false;  if(!wasTable) {    // this might be a procedure    try {      ResultSet* procRs=md->getProcedures(catalog,schema,name);      Deleter<ResultSet> _procRs(procRs);            if(wasProcedure=procRs->next()) {	do {	  cout << this->makeIdentifier	    (procRs->getString(1),procRs->getString(2),procRs->getString(3))	       << " (PROCEDURE)" << endl;	  ResultSet* colRs=md->getProcedureColumns(procRs->getString(1),						   procRs->getString(2),						   procRs->getString(3),						   "%");	  Deleter<ResultSet> _colRs(colRs);	  if(colRs->next()) {	    int nameLen=30;	    int dataTypeLen=15;	    int nullableLen=8;	    int typeLen=10;	    string nameTitle="Column";	    string dataTypeTitle="Data type";	    string nullableTitle="Nullable";	    string typeTitle="Type";	    nameTitle.resize(nameLen,SPACE_CHAR);	    dataTypeTitle.resize(dataTypeLen,SPACE_CHAR);	    nullableTitle.resize(nullableLen);	    typeTitle.resize(typeLen);	    	    cout << OUTER_SEPARATOR << nameTitle		 << INNER_SEPARATOR << dataTypeTitle		 << INNER_SEPARATOR << nullableTitle		 << INNER_SEPARATOR << typeTitle		 << OUTER_SEPARATOR << endl;	    string t;	    t.resize(nameLen,LINE_CHAR);	    cout << OUTER_SEPARATOR << t;	    t.resize(dataTypeLen,LINE_CHAR);	    cout << INNER_SEPARATOR << t;	    t.resize(nullableLen,LINE_CHAR);	    cout << INNER_SEPARATOR << t;	    t.resize(typeLen,LINE_CHAR);	    cout << t << OUTER_SEPARATOR << endl;	    do {	      string name=colRs->getString(4);	      string dataType=colRs->getString(7);	      string nullable;	      switch(colRs->getShort(12)) {	      case DatabaseMetaData::procedureNoNulls:		nullable="No";		break;	      case DatabaseMetaData::procedureNullable:		nullable="Yes";		break;	      case DatabaseMetaData::procedureNullableUnknown:	      default:		nullable="?";		break;	      }	      	      string type;	      switch(colRs->getShort(5)) {	      case DatabaseMetaData::procedureColumnIn:		type="IN"; break;	      case DatabaseMetaData::procedureColumnOut:		type="OUT"; break;	      case DatabaseMetaData::procedureColumnInOut:		type="IN OUT"; break;	      case DatabaseMetaData::procedureColumnReturn:		type="RETURN"; break;	      case DatabaseMetaData::procedureColumnResult:		type="RESULT"; break;	      default:		type="?";	      }	      name.resize(nameLen,SPACE_CHAR);	      dataType.resize(dataTypeLen,SPACE_CHAR);	      nullable.resize(nullableLen,SPACE_CHAR);	      type.resize(typeLen,SPACE_CHAR);	      cout << OUTER_SEPARATOR << name		   << INNER_SEPARATOR << dataType		   << INNER_SEPARATOR << nullable		   << INNER_SEPARATOR << type		   << OUTER_SEPARATOR << endl;	    } while(colRs->next());	  }	  	} while(procRs->next());      }          } catch(SQLException& e) {      //apparently no procedures    }  }  if(!(wasProcedure || wasTable)) {    cout << "Could not find any table or procedure named " << arg << endl;  }}int main(int argc, char** argv){  if(argc!=2 && argc!=4) {    cerr << "Usage: " << argv[0] << " connect-string" << endl	 << "or     " << argv[0] << " dsn username password" << endl;    return 0;  }  try {    Connection* con;    if(argc==2) {      con=DriverManager::getConnection(argv[1]);    } else {      con=DriverManager::getConnection(argv[1],argv[2],argv[3]);    }    Deleter<Connection> _con(con);    DatabaseMetaData* md=con->getMetaData();    cout << "Connected to " 	 << md->getDatabaseProductName() << " "	 << md->getDatabaseProductVersion()	 << " using " << md->getDriverName() << " "	 << md->getDriverVersion() << " (ODBC Version "	 << md->getDriverMajorVersion() << "."	 << md->getDriverMinorVersion() << ")" << endl;    {      Isql isql(con);      isql.run();    }    cout << endl;  } catch(SQLException& e) {    cerr << endl << "Whoops: " << e.getMessage() << endl;    return 1;  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -