项目:Equella
文件:SimpleTypeQuery.java
@Override
public IParameterMetaData getParameterMetadata(String query,List<Object> params) throws OdaException
{
MetadataBean bean = new MetadataBean();
int paramcount = 1;
String[] queryStrings = getQueryStrings(query,null);
for( String queryString : queryStrings )
{
int sz = queryString.length();
for( int i = 0; i < sz; i++ )
{
char c = queryString.charat(i);
if( c == '?' )
{
DeFinition deFinition = addColumn("param" + (paramcount++),TYPE_STRING,bean); //$NON-NLS-1$
deFinition.setMode(ParameterMetaData.parameterModeIn);
}
}
}
return bean;
}
/**
* Converts from JDBC Metadata to Avatica parameters
*/
protected static List<AvaticaParameter> parameters(ParameterMetaData MetaData)
throws sqlException {
if (MetaData == null) {
return Collections.emptyList();
}
final List<AvaticaParameter> params = new ArrayList<>();
for (int i = 1; i <= MetaData.getParameterCount(); i++) {
params.add(
new AvaticaParameter(MetaData.isSigned(i),MetaData.getPrecision(i),MetaData.getScale(i),MetaData.getParameterType(i),MetaData.getParameterTypeName(i),MetaData.getParameterClassName(i),"?" + i));
}
return params;
}
项目:calcite-avatica
文件:RemoteDriverTest.java
@Test public void testPrepareBindExecuteFetchVarbinary() throws Exception {
ConnectionSpec.getDatabaseLock().lock();
try {
final Connection connection = getLocalConnection();
final String sql = "select x'de' || ? as c from (values (1,'a'))";
final PreparedStatement ps =
connection.prepareStatement(sql);
final ParameterMetaData parameterMetaData = ps.getParameterMetaData();
assertthat(parameterMetaData.getParameterCount(),equalTo(1));
ps.setBytes(1,new byte[]{65,66});
final ResultSet resultSet = ps.executeQuery();
assertTrue(resultSet.next());
assertthat(resultSet.getBytes(1),equalTo(new byte[]{(byte) 0xDE,65,66}));
resultSet.close();
ps.close();
connection.close();
} finally {
ConnectionSpec.getDatabaseLock().unlock();
}
}
/**
* Get the parameter Meta data of this prepared statement.
*
* @return the Meta data
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
int id = getNextId(TraceObject.ParaMETER_Meta_DATA);
if (isDebugEnabled()) {
debugCodeAssign("ParameterMetaData",TraceObject.ParaMETER_Meta_DATA,id,"getParameterMetaData()");
}
checkClosed();
JdbcParameterMetaData Meta = new JdbcParameterMetaData(
session.getTrace(),this,command,id);
return Meta;
} catch (Exception e) {
throw logAndConvert(e);
}
}
private void sendParameterDescription(Prepared p) throws IOException {
try {
PreparedStatement prep = p.prep;
ParameterMetaData Meta = prep.getParameterMetaData();
int count = Meta.getParameterCount();
startMessage('t');
writeShort(count);
for (int i = 0; i < count; i++) {
int type;
if (p.paramType != null && p.paramType[i] != 0) {
type = p.paramType[i];
} else {
type = PgServer.PG_TYPE_VARCHAR;
}
server.checkType(type);
writeInt(type);
}
sendMessage();
} catch (Exception e) {
sendErrorResponse(e);
}
}
项目:spring4-understanding
文件:StatementCreatorUtilsTests.java
@Test
public void testSetParameterValueWithNullAndGetParameterTypeWorkingButNotForOtherDriver() throws sqlException {
StatementCreatorUtils.driversWithNoSupportForGetParameterType.clear();
StatementCreatorUtils.driversWithNoSupportForGetParameterType.add("Oracle JDBC Driver");
Connection con = mock(Connection.class);
DatabaseMetaData dbmd = mock(DatabaseMetaData.class);
ParameterMetaData pmd = mock(ParameterMetaData.class);
given(preparedStatement.getConnection()).willReturn(con);
given(con.getMetaData()).willReturn(dbmd);
given(dbmd.getDriverName()).willReturn("Apache Derby Embedded Driver");
given(preparedStatement.getParameterMetaData()).willReturn(pmd);
given(pmd.getParameterType(1)).willReturn(Types.SMALLINT);
StatementCreatorUtils.setParameterValue(preparedStatement,1,sqlTypeValue.TYPE_UNKNowN,null,null);
verify(dbmd).getDriverName();
verify(pmd).getParameterType(1);
verify(preparedStatement).setNull(1,Types.SMALLINT);
assertEquals(1,StatementCreatorUtils.driversWithNoSupportForGetParameterType.size());
}
/**
* test execute statements that no parameters would be returned if
* prepareStatement("execute statement systab using values('SYS%','8000001%')");
*
* @exception sqlException if error occurs
*/
public void testExecuteStatementUsing () throws sqlException {
/*
* the test no longer tests 4552,but kept as an interesting test scenario
* bug 4552 - no parameters would be returned for execute statement using
* System.out.println("Bug 4552 - no parameters would be returned for execute statement using");
* orig: ps = con.prepareStatement("execute statement systab using values('SYS%','8000001%')");
*/
PreparedStatement ps = prepareStatement("select * from sys.systables " +
"where CAST(tablename AS VARCHAR(128)) like 'SYS%' and " +
"CAST(tableID AS VARCHAR(128)) like '8000001%'");
ParameterMetaData paramMetaData = ps.getParameterMetaData();
assertEquals("Unexpected parameter count",paramMetaData.getParameterCount());
//expected values to be stored in a 2dim. array
String parameterMetaDataArray0 [][] = null;
testParameterMetaData(paramMetaData,parameterMetaDataArray0);
ps.execute();
ps.close();
}
/**
* tests parameterMetaData and reports error if the ParameterMetaData results
* does not match the expected results.
*
* @param paramMetaData ParameterMetadata object
* @param paramMetaDataArray 2 dimensional array containing expected test results.
* @exception sqlException if any error occurs
*/
static void testParameterMetaData(ParameterMetaData paramMetaData,String [][] paramMetaDataArray) throws sqlException {
int numParam = paramMetaData.getParameterCount();
for (int i=0,j=0; i<numParam; i++) {
assertEquals("Unexpected parameter isNullable",paramMetaDataArray[i][j++],parameterIsNullableInStringForm(paramMetaData.isNullable(i+1)));
assertEquals("Unexpected parameter isSigned",Boolean.valueOf(paramMetaDataArray[i][j++]).booleanValue(),paramMetaData.isSigned(i+1));
assertEquals("Unexpected parameter getPrecision",Integer.parseInt(paramMetaDataArray[i][j++]),paramMetaData.getPrecision(i+1));
assertEquals("Unexpected parameter getScale",paramMetaData.getScale(i+1));
assertEquals("Unexpected parameter getParameterType",paramMetaData.getParameterType(i+1));
assertEquals("Unexpected parameter getParameterTypeName",paramMetaData.getParameterTypeName(i+1));
assertEquals("Unexpected parameter getParameterClassName",paramMetaData.getParameterClassName(i+1));
assertEquals("Unexpected parameter getParameterMode",parameterModeInStringForm(paramMetaData.getParameterMode(i+1)));
j=0;
}
}
项目:gemfirexd-oss
文件:UDTTest.java
/**
* Check the ParameterMetaData for a statement whose first parameter is a UDT.
*/
private void checkPMD
(
Connection conn,String query,String expectedClassName,int expectedJDBCType,String expectedsqlTypeName,int expectedPrecision,int expectedScale
) throws Exception
{
PreparedStatement ps = conn.prepareStatement( query );
ParameterMetaData pmd = ps.getParameterMetaData();
assertEquals( pmd.getParameterClassName( 1 ),expectedClassName );
assertEquals( pmd.getParameterType( 1 ),expectedJDBCType );
assertEquals( pmd.getParameterTypeName( 1 ),expectedsqlTypeName );
assertEquals( pmd.getPrecision( 1 ),expectedPrecision );
assertEquals( pmd.getScale( 1 ),expectedScale );
ps.close();
}
项目:gemfirexd-oss
文件:OffsetFetchNextTest.java
/**
* Test dynamic arguments
*/
public void testDynamicArgsMetaData() throws sqlException {
//since there is no getParameterMetaData() call available in JSR169
//implementations,do not run this test if we are running JSR169
if (JDBC.vmSupportsJSR169()) return;
PreparedStatement ps = prepareStatement(
"select * from t1 where a = ? order by b " +
"offset ? rows fetch next ? rows only");
ParameterMetaData pmd = ps.getParameterMetaData();
int[] expectedTypes = { Types.INTEGER,Types.BIGINT,Types.BIGINT };
for (int i = 0; i < 3; i++) {
assertEquals("Unexpected parameter type",expectedTypes[i],pmd.getParameterType(i+1));
assertEquals("Derby ? args are nullable",// Why is that? Cf. logic in ParameterNode.setType
ParameterMetaData.parameterNullable,pmd.isNullable(i+1));
}
ps.close();
}
项目:gemfirexd-oss
文件:DRDAConnThread.java
private void writesqlDOPTGRP(ResultSetMetaData rsMeta,ParameterMetaData pMeta,int jdbcelemNum,boolean rtnOutput)
throws DRDAProtocolException,sqlException
{
writer.writeByte(0);
//sqlUNAMED
writer.writeShort(0);
//sqlName
writeVCMorVCS(rtnOutput ? rsMeta.getColumnName(jdbcelemNum) : null);
//sqlLabel
writeVCMorVCS(null);
//sqlComments
writeVCMorVCS(null);
//sqlDUDTGRP
writesqlUDTGRP(rsMeta,pMeta,jdbcelemNum,rtnOutput);
//sqlDXGRP
writesqlDXGRP(rsMeta,rtnOutput);
}
/**
* statementにパラメータを設定します。
* @param st ステートメント。
* @param param パラメータ。
* @throws Exception 例外。
*/
public void setParameter(final PreparedStatement st,final Map<String,Object> param) throws Exception {
if (this.paramnames != null && param != null) {
int idx = 1;
ParameterMetaData Meta = getParameterMetaData(st);
for (String p : this.paramnames) {
Object v = this.getParam(p,param);
if (log.isDebugEnabled()) {
log.debug(idx + " :" + p + "=" + v);
}
if (v == null) {
st.setNull(idx,this.getParameterType(Meta,idx));
} else {
if (v instanceof FileObject) {
log.debug("valueClass=" + v.getClass().getName());
this.setBlobData(st,idx,(FileObject) v,Meta);
} else {
st.setobject(idx,v);
}
}
idx++;
}
}
}
项目:the-vigilantes
文件:ConnectionTest.java
private void testInterfaceImplementation(Connection conntocheck) throws Exception {
Method[] dbmdMethods = java.sql.DatabaseMetaData.class.getmethods();
// can't do this statically,as we return different
// implementations depending on JDBC version
DatabaseMetaData dbmd = conntocheck.getMetaData();
checkInterfaceImplemented(dbmdMethods,dbmd.getClass(),dbmd);
Statement stmttocheck = conntocheck.createStatement();
checkInterfaceImplemented(java.sql.Statement.class.getmethods(),stmttocheck.getClass(),stmttocheck);
PreparedStatement pStmttocheck = conntocheck.prepareStatement("SELECT 1");
ParameterMetaData paramMd = pStmttocheck.getParameterMetaData();
checkInterfaceImplemented(java.sql.PreparedStatement.class.getmethods(),pStmttocheck.getClass(),pStmttocheck);
checkInterfaceImplemented(java.sql.ParameterMetaData.class.getmethods(),paramMd.getClass(),paramMd);
pStmttocheck = ((com.MysqL.jdbc.Connection) conntocheck).serverPrepareStatement("SELECT 1");
checkInterfaceImplemented(java.sql.PreparedStatement.class.getmethods(),pStmttocheck);
ResultSet tocheckRs = conntocheck.createStatement().executeQuery("SELECT 1");
checkInterfaceImplemented(java.sql.ResultSet.class.getmethods(),tocheckRs.getClass(),tocheckRs);
tocheckRs = conntocheck.createStatement().executeQuery("SELECT 1");
checkInterfaceImplemented(java.sql.ResultSetMetaData.class.getmethods(),tocheckRs.getMetaData().getClass(),tocheckRs.getMetaData());
if (versionMeetsMinimum(5,0)) {
createProcedure("interfaceImpl","(IN p1 INT)\nBEGIN\nSELECT 1;\nEND");
CallableStatement cstmt = conntocheck.prepareCall("{CALL interfaceImpl(?)}");
checkInterfaceImplemented(java.sql.CallableStatement.class.getmethods(),cstmt.getClass(),cstmt);
}
checkInterfaceImplemented(java.sql.Connection.class.getmethods(),conntocheck.getClass(),conntocheck);
}
项目:the-vigilantes
文件:ServerPreparedStatement.java
/**
* @see java.sql.PreparedStatement#getParameterMetaData()
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterFields,this.parameterCount,getExceptionInterceptor());
}
return this.parameterMetaData;
}
}
项目:the-vigilantes
文件:CallableStatement.java
项目:the-vigilantes
文件:PreparedStatement.java
/**
* @see PreparedStatement#getParameterMetaData()
*/
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
if (this.connection.getGenerateSimpleParameterMetadata()) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterCount);
} else {
this.parameterMetaData = new MysqLParameterMetadata(null,getExceptionInterceptor());
}
}
return this.parameterMetaData;
}
}
项目:the-vigilantes
文件:PreparedStatementWrapper.java
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
if (this.wrappedStmt != null) {
return ((PreparedStatement) this.wrappedStmt).getParameterMetaData();
}
throw sqlError.createsqlException("No operations allowed after statement closed",sqlError.sql_STATE_GENERAL_ERROR,this.exceptionInterceptor);
} catch (sqlException sqlEx) {
checkAndFireConnectionError(sqlEx);
}
return null;
}
项目:Equella
文件:JdbcQueryDelegate.java
@Override
public MetadataBean getParameterMetadata(String query,final List<Object> params)
{
try
{
query = processQuery(query);
return (MetadataBean) new JdbcTemplate(getDataSourceHolder().getDataSource()).execute(query,new PreparedStatementCallback()
{
@Override
public Object doInPreparedStatement(PreparedStatement statement) throws sqlException,DataAccessException
{
addParamsToStatement(statement,params);
try
{
ParameterMetaData parameterMetaData = statement.getParameterMetaData();
return new MetadataBean(parameterMetaData);
}
catch( sqlException sqle )
{
return null;
}
}
});
}
catch( Exception e )
{
String msg = CurrentLocale.get("com.tle.core.reporting.error.parameter.Metadata") + query;
LOGGER.error(msg,e);
throw new RuntimeException(msg,e);
}
}
项目:OpenVertretung
文件:ConnectionTest.java
项目:OpenVertretung
文件:ServerPreparedStatement.java
/**
* @see java.sql.PreparedStatement#getParameterMetaData()
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterFields,getExceptionInterceptor());
}
return this.parameterMetaData;
}
}
项目:OpenVertretung
文件:CallableStatement.java
项目:OpenVertretung
文件:PreparedStatement.java
/**
* @see PreparedStatement#getParameterMetaData()
*/
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
if (this.connection.getGenerateSimpleParameterMetadata()) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterCount);
} else {
this.parameterMetaData = new MysqLParameterMetadata(null,getExceptionInterceptor());
}
}
return this.parameterMetaData;
}
}
项目:OpenVertretung
文件:PreparedStatementWrapper.java
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
if (this.wrappedStmt != null) {
return ((PreparedStatement) this.wrappedStmt).getParameterMetaData();
}
throw sqlError.createsqlException("No operations allowed after statement closed",this.exceptionInterceptor);
} catch (sqlException sqlEx) {
checkAndFireConnectionError(sqlEx);
}
return null;
}
项目:lams
文件:ServerPreparedStatement.java
/**
* @see java.sql.PreparedStatement#getParameterMetaData()
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterFields,getExceptionInterceptor());
}
return this.parameterMetaData;
}
}
项目:lams
文件:CallableStatement.java
项目:lams
文件:PreparedStatement.java
/**
* @see PreparedStatement#getParameterMetaData()
*/
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
if (this.connection.getGenerateSimpleParameterMetadata()) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterCount);
} else {
this.parameterMetaData = new MysqLParameterMetadata(null,getExceptionInterceptor());
}
}
return this.parameterMetaData;
}
}
项目:lams
文件:PreparedStatementWrapper.java
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
if (this.wrappedStmt != null) {
return ((PreparedStatement) this.wrappedStmt).getParameterMetaData();
}
throw sqlError.createsqlException("No operations allowed after statement closed",this.exceptionInterceptor);
} catch (sqlException sqlEx) {
checkAndFireConnectionError(sqlEx);
}
return null;
}
项目:ProyectoPacientes
文件:ConnectionTest.java
项目:ProyectoPacientes
文件:ServerPreparedStatement.java
/**
* @see java.sql.PreparedStatement#getParameterMetaData()
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterFields,getExceptionInterceptor());
}
return this.parameterMetaData;
}
}
项目:ProyectoPacientes
文件:CallableStatement.java
项目:ProyectoPacientes
文件:PreparedStatement.java
/**
* @see PreparedStatement#getParameterMetaData()
*/
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
if (this.connection.getGenerateSimpleParameterMetadata()) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterCount);
} else {
this.parameterMetaData = new MysqLParameterMetadata(null,getExceptionInterceptor());
}
}
return this.parameterMetaData;
}
}
项目:ProyectoPacientes
文件:PreparedStatementWrapper.java
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
if (this.wrappedStmt != null) {
return ((PreparedStatement) this.wrappedStmt).getParameterMetaData();
}
throw sqlError.createsqlException("No operations allowed after statement closed",this.exceptionInterceptor);
} catch (sqlException sqlEx) {
checkAndFireConnectionError(sqlEx);
}
return null;
}
项目:BibliotecaPS
文件:ConnectionTest.java
项目:BibliotecaPS
文件:ServerPreparedStatement.java
/**
* @see java.sql.PreparedStatement#getParameterMetaData()
*/
@Override
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterFields,getExceptionInterceptor());
}
return this.parameterMetaData;
}
}
项目:BibliotecaPS
文件:CallableStatement.java
项目:BibliotecaPS
文件:PreparedStatement.java
/**
* @see PreparedStatement#getParameterMetaData()
*/
public ParameterMetaData getParameterMetaData() throws sqlException {
synchronized (checkClosed().getConnectionMutex()) {
if (this.parameterMetaData == null) {
if (this.connection.getGenerateSimpleParameterMetadata()) {
this.parameterMetaData = new MysqLParameterMetadata(this.parameterCount);
} else {
this.parameterMetaData = new MysqLParameterMetadata(null,getExceptionInterceptor());
}
}
return this.parameterMetaData;
}
}
项目:BibliotecaPS
文件:PreparedStatementWrapper.java
public ParameterMetaData getParameterMetaData() throws sqlException {
try {
if (this.wrappedStmt != null) {
return ((PreparedStatement) this.wrappedStmt).getParameterMetaData();
}
throw sqlError.createsqlException("No operations allowed after statement closed",this.exceptionInterceptor);
} catch (sqlException sqlEx) {
checkAndFireConnectionError(sqlEx);
}
return null;
}
protected static Signature signature(ResultSetMetaData MetaData,ParameterMetaData parameterMetaData,String sql,Meta.StatementType statementType) throws sqlException {
final CursorFactory cf = CursorFactory.LIST; // because JdbcResultSet#frame
return new Signature(columns(MetaData),sql,parameters(parameterMetaData),cf,statementType);
}
@Test public void testPrepareSetsMaxRows() throws Exception {
final String id = UUID.randomUUID().toString();
final String sql = "SELECT * FROM FOO";
final int maxRows = 500;
final ConnectionHandle ch = new ConnectionHandle(id);
final AtomicInteger statementIdGenerator = new AtomicInteger(0);
JdbcMeta Meta = Mockito.mock(JdbcMeta.class);
Connection connection = Mockito.mock(Connection.class);
PreparedStatement statement = Mockito.mock(PreparedStatement.class);
ResultSetMetaData resultSetMetaData = Mockito.mock(ResultSetMetaData.class);
ParameterMetaData parameterMetaData = Mockito.mock(ParameterMetaData.class);
@SuppressWarnings("unchecked")
Cache<Integer,StatementInfo> statementCache =
(Cache<Integer,StatementInfo>) Mockito.mock(Cache.class);
Mockito.when(Meta.getStatementIdGenerator()).thenReturn(statementIdGenerator);
Mockito.when(Meta.getStatementCache()).thenReturn(statementCache);
Mockito.when(Meta.getConnection(id)).thenReturn(connection);
Mockito.when(connection.prepareStatement(sql)).thenReturn(statement);
Mockito.when(statement.isWrapperFor(AvaticaPreparedStatement.class)).thenReturn(false);
Mockito.when(statement.getMetaData()).thenReturn(resultSetMetaData);
Mockito.when(statement.getParameterMetaData()).thenReturn(parameterMetaData);
// Call the real methods
Mockito.doCallRealMethod().when(Meta).setMaxRows(statement,maxRows);
Mockito.doCallRealMethod().when(Meta).prepare(ch,maxRows);
Meta.prepare(ch,maxRows);
Mockito.verify(statement).setMaxRows(maxRows);
}
项目:calcite-avatica
文件:RemoteDriverMockTest.java
private void checkStatementExecuteQuery(Connection connection,boolean prepare) throws sqlException {
final String sql = "select * from (\n"
+ " values (1,'a'),(null,'b'),(3,'c')) as t (c1,c2)";
final Statement statement;
final ResultSet resultSet;
final ParameterMetaData parameterMetaData;
if (prepare) {
final PreparedStatement ps = connection.prepareStatement(sql);
statement = ps;
parameterMetaData = ps.getParameterMetaData();
resultSet = ps.executeQuery();
} else {
statement = connection.createStatement();
parameterMetaData = null;
resultSet = statement.executeQuery(sql);
}
if (parameterMetaData != null) {
assertthat(parameterMetaData.getParameterCount(),equalTo(0));
}
final ResultSetMetaData MetaData = resultSet.getMetaData();
assertEquals(2,MetaData.getColumnCount());
assertEquals("C1",MetaData.getColumnName(1));
assertEquals("C2",MetaData.getColumnName(2));
assertTrue(resultSet.next());
assertTrue(resultSet.next());
assertTrue(resultSet.next());
assertFalse(resultSet.next());
resultSet.close();
statement.close();
connection.close();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。