package lucee.runtime.type.query; import lucee.commons.lang.FormatUtil; import lucee.commons.lang.StringUtil; import lucee.runtime.PageContext; import lucee.runtime.db.SQL; import lucee.runtime.dump.DumpData; import lucee.runtime.dump.DumpProperties; import lucee.runtime.dump.DumpTable; import lucee.runtime.exp.CasterException; import lucee.runtime.exp.PageException; import lucee.runtime.op.Caster; import lucee.runtime.type.Collection; import lucee.runtime.type.Struct; import lucee.runtime.type.StructImpl; import lucee.runtime.type.Collection.Key; public class QueryStruct extends StructImpl implements QueryResult { private static final long serialVersionUID = -2123873025169506446L; private final SQL sql; private long executionTime; private final String template; private final String name; private String cacheType; private int updateCount; private Key[] columnNames; public QueryStruct(String name, SQL sql, String template) { super(Struct.TYPE_LINKED); this.name=name; this.sql=sql; this.template=template; } @Override public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) { DumpTable dt= (DumpTable) super.toDumpData(pageContext, maxlevel, dp); StringBuilder comment=new StringBuilder(); //table.appendRow(1, new SimpleDumpData("SQL"), new SimpleDumpData(sql.toString())); String template=getTemplate(); if(!StringUtil.isEmpty(template)) comment.append("Template: ").append(template).append("\n"); int top = dp.getMaxlevel(); comment.append("Execution Time: ").append(Caster.toString(FormatUtil.formatNSAsMSDouble(getExecutionTime()))).append(" ms \n"); comment.append("Record Count: ").append(Caster.toString(size())); if ( size() > top ) comment.append( " (showing top " ).append( Caster.toString( top ) ).append( ")" ); comment.append("\n"); comment.append("Cached: ").append(isCached()?"Yes\n":"No\n"); if(isCached()) { String ct=getCacheType(); comment.append("Cache Type: ").append(ct).append("\n"); } SQL sql=getSql(); if(sql!=null) comment.append("SQL: ").append("\n").append(StringUtil.suppressWhiteSpace(sql.toString().trim())).append("\n"); dt.setTitle("Struct (from Query)"); if(dp.getMetainfo())dt.setComment(comment.toString()); return dt; } @Override public synchronized Collection duplicate(boolean deepCopy) { QueryStruct qa = new QueryStruct(name,sql,template); qa.cacheType=cacheType; qa.columnNames=columnNames; qa.executionTime=executionTime; qa.updateCount=updateCount; copy(this,qa,deepCopy); return qa; } public SQL getSql() { return sql; } public void setCacheType(String cacheType) { this.cacheType=cacheType; } public String getCacheType() { return cacheType; } @Override public boolean isCached() { return cacheType!=null; } public long getExecutionTime() { return executionTime; } public void setExecutionTime(long executionTime) { this.executionTime=executionTime; } public String getTemplate() { return template; } public String getName() { return name; } @Override public int getRecordcount() { return size(); } @Override public int getColumncount() { return columnNames==null?0:columnNames.length; } @Override public int getUpdateCount() { return updateCount; } @Override public void setUpdateCount(int updateCount) { this.updateCount = updateCount; } @Override public Key[] getColumnNames() { return columnNames; } @Override public void setColumnNames(Key[] columnNames) throws PageException{ this.columnNames=columnNames; } public static QueryStruct toQueryStruct(lucee.runtime.type.Query q, Key columnName) throws PageException { QueryStruct qs = new QueryStruct(q.getName(), q.getSql(), q.getTemplate()); qs.setCacheType(q.getCacheType()); qs.setColumnNames(q.getColumnNames()); qs.setExecutionTime(q.getExecutionTime()); qs.setUpdateCount(q.getUpdateCount()); int rows=q.getRecordcount(); if(rows==0) return qs; Key[] columns = q.getColumnNames(); Struct tmp; for(int r=1;r<=rows;r++) { tmp=new StructImpl(); qs.set(Caster.toKey(q.getAt(columnName, r)), tmp); for(Key c:columns) { tmp.setEL(c, q.getAt(c, r,null)); } } return qs; } }