Skip to content

Commit

Permalink
optimize column retrieval
Browse files Browse the repository at this point in the history
  • Loading branch information
zspitzer committed Sep 25, 2023
1 parent 21494b5 commit 0a9a276
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
6 changes: 5 additions & 1 deletion system/services/database/DbInfoService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ component {
public query function getTableColumns( required string tableName, required string dsn, boolean detail=false ) {
var columns = "";
var attrCol = {
type: ( variables.hasModernDbInfo && !detail ) ? "columns_minimal" : "columns",
type: ( variables.hasModernDbInfo && !arguments.detail ) ? "columns_minimal" : "columns",
name: "columns",
table: arguments.tableName,
datasource: arguments.dsn
Expand Down Expand Up @@ -106,4 +106,8 @@ component {

return constraints;
}

public boolean function hasModernDbInfo(){
return variables.hasModernDbInfo;
}
}
42 changes: 39 additions & 3 deletions system/services/presideObjects/SqlSchemaSynchronizer.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ component {
dbVersion.append( obj.sql.table.version );
}
}
StructDelete( variables, "columnCache" ); // cache no longer required, release memory
dbVersion.sort( "text" );
dbVersion = Hash( dbVersion.toList() );
if ( ( versions.db.db ?: "" ) neq dbVersion ) {
Expand Down Expand Up @@ -167,7 +168,7 @@ component {
) {
var adapter = _getAdapter( dsn = arguments.dsn );
var tableExists = _tableExists( tableName=arguments.tableName, dsn=arguments.dsn );
var tableColumns = tableExists ? QueryColumnData( _getTableColumns( tableName=arguments.tableName, dsn=arguments.dsn ), "COLUMN_NAME" ) : [];
var tableColumns = tableExists ? _getTableColumns( tableName=arguments.tableName, dsn=arguments.dsn ) : [];
var columnSql = "";
var colName = "";
var column = "";
Expand Down Expand Up @@ -346,7 +347,7 @@ component {
, required boolean skipSync

) {
var columnsFromDb = _getTableColumns( tableName=arguments.tableName, dsn=arguments.dsn, detail=true );
var columnsFromDb = _getTableColumnsWithForeignKeys( tableName=arguments.tableName, dsn=arguments.dsn, detail=true );
var indexesFromDb = _getTableIndexes( tableName=arguments.tableName, dsn=arguments.dsn );
var dbColumnNames = ValueList( columnsFromDb.column_name );
var colsSql = arguments.generatedSql.columns;
Expand Down Expand Up @@ -702,7 +703,30 @@ component {
return variables._tableCache[ arguments.dsn ][ arguments.tableName ] ?: false;
}

private query function _getTableColumns() {
private array function _getTableColumns() {
try {
if ( _getDbInfoService().hasModernDbInfo() ){
// with the faster version, we can fetch the entire schema in one call.
if ( !StructKeyExists( variables, "columnCache" )){
variables.columnCache = _getTableColumnCache( argumentCollection = arguments );
}
if ( StructKeyExists( variables.columnCache, arguments.tableName ) ) {
return variables.columnCache[ arguments.tableName ];
} else {
return [];
}
}
var tableColumns = _getDbInfoService().getTableColumns( argumentCollection = arguments );
return QueryColumnData( tableColumns, "COLUMN_NAME" );
} catch( any e ) {
if ( e.message contains "there is no table that match the following pattern" ) {
return [];
}
rethrow;
}
}

private query function _getTableColumnsWithForeignKeys() {
try {
return _getDbInfoService().getTableColumns( argumentCollection = arguments );
} catch( any e ) {
Expand Down Expand Up @@ -771,6 +795,18 @@ component {
}
}

private struct function _getTableColumnCache(){
var srcColumns = _getDbInfoService().getTableColumns( tableName="%", dsn=arguments.dsn, detail=false );
var columns = {};
loop query=srcColumns {
if ( !StructKeyExists( columns, srcColumns.table_name ) ) {
columns[ srcColumns.table_name ] = [];
}
ArrayAppend( columns[ srcColumns.table_name ], srcColumns.column_name );
}
return columns;
}



// GETTERS AND SETTERS
Expand Down

0 comments on commit 0a9a276

Please sign in to comment.