Implement getTablePrivileges. (firebird-sdbc)
Change-Id: Id5bb79fdd01014594582de2bad6e16142259b0ce
This commit is contained in:
@@ -1239,14 +1239,95 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getBestRowIdentifier(
|
|||||||
(void) nullable;
|
(void) nullable;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
|
uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
|
||||||
const Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern ) throw(SQLException, RuntimeException)
|
const Any& aCatalog,
|
||||||
|
const OUString& sSchemaPattern,
|
||||||
|
const OUString& sTableNamePattern)
|
||||||
|
throw(SQLException, RuntimeException)
|
||||||
{
|
{
|
||||||
(void) catalog;
|
(void) aCatalog;
|
||||||
(void) schemaPattern;
|
(void) sSchemaPattern;
|
||||||
(void) tableNamePattern;
|
|
||||||
return NULL;
|
SAL_INFO("connectivity.firebird", "getTablePrivileges() with "
|
||||||
|
"TableNamePattern: " << sTableNamePattern);
|
||||||
|
|
||||||
|
ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
|
||||||
|
uno::Reference< XResultSet > xResultSet = pResultSet;
|
||||||
|
uno::Reference< XStatement > statement = m_pConnection->createStatement();
|
||||||
|
|
||||||
|
static const OUString wld("%");
|
||||||
|
OUStringBuffer queryBuf(
|
||||||
|
"SELECT "
|
||||||
|
"priv.RDB$RELATION_NAME, " // 1
|
||||||
|
"priv.RDB$GRANTOR," // 2
|
||||||
|
"priv.RDB$USER, " // 3 Grantee
|
||||||
|
"priv.RDB$PRIVILEGE, " // 4
|
||||||
|
"priv.RDB$GRANT_OPTION " // 5 is Grantable
|
||||||
|
"FROM RDB$USER_PRIVILEGES priv ");
|
||||||
|
// "WHERE (priv.RDB$USER = ?????????)"
|
||||||
|
|
||||||
|
if (!sTableNamePattern.isEmpty())
|
||||||
|
{
|
||||||
|
OUString sAppend;
|
||||||
|
if (sTableNamePattern.match(wld))
|
||||||
|
sAppend = "AND priv.RDB$RELATION_NAME LIKE '%' ";
|
||||||
|
else
|
||||||
|
sAppend = "AND priv.RDB$RELATION_NAME = '%' ";
|
||||||
|
|
||||||
|
queryBuf.append(sAppend.replaceAll(wld, sTableNamePattern));
|
||||||
|
}
|
||||||
|
queryBuf.append(" ORDER BY priv.RDB$RELATION_TYPE, "
|
||||||
|
"priv.RDB$RELATION_NAME, "
|
||||||
|
"priv.RDB$PRIVILEGE");
|
||||||
|
|
||||||
|
OUString query = queryBuf.makeStringAndClear();
|
||||||
|
|
||||||
|
uno::Reference< XResultSet > rs = statement->executeQuery(query.getStr());
|
||||||
|
uno::Reference< XRow > xRow( rs, UNO_QUERY_THROW );
|
||||||
|
ODatabaseMetaDataResultSet::ORows aResults;
|
||||||
|
|
||||||
|
while( rs->next() )
|
||||||
|
{
|
||||||
|
ODatabaseMetaDataResultSet::ORow aCurrentRow(7);
|
||||||
|
|
||||||
|
// 1. TABLE_CAT
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator());
|
||||||
|
// 2. TABLE_SCHEM
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator());
|
||||||
|
|
||||||
|
// 3. TABLE_NAME
|
||||||
|
{
|
||||||
|
OUString sTableName = xRow->getString(1);
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator(sTableName));
|
||||||
|
}
|
||||||
|
// 4. GRANTOR
|
||||||
|
{
|
||||||
|
OUString sGrantor = xRow->getString(2);
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator(sGrantor));
|
||||||
|
}
|
||||||
|
// 5. GRANTEE
|
||||||
|
{
|
||||||
|
OUString sGrantee = xRow->getString(3);
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator(sGrantee));
|
||||||
|
}
|
||||||
|
// 6. Privilege
|
||||||
|
{
|
||||||
|
OUString sPrivilege = xRow->getString(4);
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator(sPrivilege));
|
||||||
|
}
|
||||||
|
// 7. IS_GRANTABLE
|
||||||
|
{
|
||||||
|
sal_Bool bIsGrantable = xRow->getBoolean(5);
|
||||||
|
aCurrentRow.push_back(new ORowSetValueDecorator(bIsGrantable));
|
||||||
|
}
|
||||||
|
|
||||||
|
aResults.push_back(aCurrentRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
pResultSet->setRows( aResults );
|
||||||
|
|
||||||
|
return xResultSet;
|
||||||
}
|
}
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference(
|
uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference(
|
||||||
|
Reference in New Issue
Block a user