Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,5 @@ UpgradeLog*.htm

# Microsoft Fakes
FakesAssemblies/
*.bak
/Scripts
2 changes: 2 additions & 0 deletions SQLCC.Core/Objects/DbCodeSegment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ namespace SQLCC.Core.Objects
{
public class DbCodeSegment
{
public string SchemaName { get; set; }

public string ObjectName { get; set; }

public int LinesOfCode { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion SQLCC.Impl.HtmlCodeHighlighter/HtmlOutputProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ private void WriteAllDbObjectFiles(List<DbObject> objects, string baseLocation,

foreach (var obj in objects)
{
File.WriteAllText(Path.Combine(codeCoverageLocation, obj.Name + ".html"), template.Replace("[CODE]", obj.CodeHighlighted));
File.WriteAllText(Path.Combine(codeCoverageLocation, $"{obj.Name}.html"), template.Replace("[CODE]", obj.CodeHighlighted));
}
}

Expand Down
104 changes: 104 additions & 0 deletions SQLCC.Impl.HtmlCodeHighlighter/code.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" media="screen" href="scripts/css/smoothness/jquery-ui-1.8.22.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="scripts/jqgrid/css/ui.jqgrid.css" />

<style>
html, body {
margin: 0;
padding: 0;
font-family:sans-serif;
}
</style>

<script src="scripts/jqgrid/js/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="scripts/jqgrid/js/i18n/grid.locale-en.js" type="text/javascript"></script>
<script src="scripts/jqgrid/js/jquery.jqGrid.min.js" type="text/javascript"></script>

<script type="text/javascript">
var sqlcc_objects = []; // create array.
var codeCoverage = location.hash.replace('#','');
document.write('<scr' + 'ipt src="' + codeCoverage + '/sqlcc.js"></scr' + 'ipt>');
</script>

</head>

<body>

<iframe width="100%" height="600" src="empty.html" name="iframe" id="iframe" frameBorder="0"></iframe>
<table id="list4"></table>
<div id="pager2"></div>
<a href="default.html">Main</a>

<script>
function createLink(cell) {
name = cell.split(".")[1]
return '<a href="' + codeCoverage + '/' + cell + '.html" target="iframe">'+name+'</a>';
}
function roundNumber(num, dec) {
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
return result;
}
function percent(cell) {
return roundNumber(cell * 100,2);
}

jQuery("#list4").jqGrid({
datatype: "local",
height: 230,
colNames: ['Type', 'Schema', 'Object Name','FLOC', 'LOC','Characters', '% Covered'],
colModel: [
{name:'Type',index:'Type', width:10},
{name:'Schema',index:'Schema', width:5},
{name:'Name',index:'Name', width:65, formatter:createLink},
{name:'TotalFloc',index:'TotalFloc', width:5, sorttype:"int"},
{name:'TotalLoc',index:'TotalLoc', width:5, sorttype:"int"},
{name:'TotalCharacters',index:'TotalCharacters', width:5, sorttype:"int"},
{name:'CoveredPercent',index:'CoveredPercent', width:5, sorttype:"float",formatter:percent}
],
/*
colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
colModel:[
{name:'id',index:'id', width:60, sorttype:"int"},
{name:'invdate',index:'invdate', width:90, sorttype:"date"},
{name:'name',index:'name', width:100},
{name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
{name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},
{name:'total',index:'total', width:80,align:"right",sorttype:"float"},
{name:'note',index:'note', width:150, sortable:false}
],*/
autowidth: true,
caption: "SQL Code Coverage Objects",
beforeSelectRow: function(rowid, e) {
return false;
},
pager: '#pager2',
rowNum: 10
});
var mydata = sqlcc_objects[codeCoverage];
/*
var mydata = [
{id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
{id:"4",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"5",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"6",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
{id:"7",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
];
*/
for(var i=0;i<=mydata.length;i++)
jQuery("#list4").jqGrid('addRowData',i+1,mydata[i]);

$("#list4").setGridParam({sortname:'Name', sortorder: 'asc'}).trigger('reloadGrid');
$("#list4").jqGrid('filterToolbar', {stringResult: true, searchOnEnter: false, defaultSearch : "cn"});

</script>
</body>
</html>



Binary file modified SQLCC.Impl.HtmlCodeHighlighter/sqlcc_output.zip
Binary file not shown.
11 changes: 9 additions & 2 deletions SQLCC.Impl.MsSqlProvider/MsSqlDbTraceCodeFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,15 @@ public override string FormatCodeWithHighlights(string code, List<DbCodeSegment>
{
codeContents.Insert((lineOfCode.StartByte / 2) + offset, this.StartHighlightMarkUp);
offset += this.StartHighlightMarkUp.Length;
codeContents.Insert((lineOfCode.EndByte / 2) + offset, this.EndHighlightMarkUp);
offset += this.EndHighlightMarkUp.Length;
if (lineOfCode.EndByte == -1)
{
codeContents.Append(this.EndHighlightMarkUp);
}
else
{
codeContents.Insert((lineOfCode.EndByte / 2) + offset, this.EndHighlightMarkUp);
offset += this.EndHighlightMarkUp.Length;
}
}
return _dataScrubber.Scrub(codeContents.ToString(), "format.scrub");
}
Expand Down
9 changes: 6 additions & 3 deletions SQLCC.Impl.MsSqlProvider/MsSqlProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,13 @@ public override void StopTrace(string traceName)
public override List<DbCodeSegment> GetTraceCodeSegments(string traceName)
{
var trace = Path.Combine(_traceDir, string.Format(TraceFileFormat, traceName));
var codeTrace = _db.Fetch<DbCodeSegment>(@"SELECT DISTINCT LineNumber, Offset as StartByte, IntegerData2 as EndByte, ObjectName
var codeTrace = _db.Fetch<DbCodeSegment>(@"SELECT LineNumber, StartByte, EndByte, ObjectName, OBJECT_SCHEMA_NAME(ObjectID) SchemaName
FROM (
SELECT DISTINCT LineNumber, Offset as StartByte, IntegerData2 as EndByte, ObjectName, ObjectID
FROM ::fn_trace_gettable('" + trace + @"', default)
WHERE EventClass IN (40,41,42,43,44) AND Offset IS NOT NULL AND ObjectName IS NOT NULL
ORDER BY ObjectName, LineNumber ASC, StartByte ASC, IntegerData2 ASC;");
WHERE EventClass IN (40,41,42,43,44) AND Offset IS NOT NULL AND ObjectName IS NOT NULL
) cs
ORDER BY SchemaName, ObjectName, LineNumber ASC, StartByte ASC, EndByte ASC;");
return codeTrace;
}

Expand Down
2 changes: 1 addition & 1 deletion SQLCC/CodeCoverageProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public void ProcessAllCoverage(DbCodeCoverage codeCover)
{
foreach (var obj in codeCover.TotalObjects)
{
obj.CoveredSegments = codeCover.TraceCodeSegments.Where(p => p.ObjectName.Equals(obj.Name)).ToList();
obj.CoveredSegments = codeCover.TraceCodeSegments.Where(p => p.ObjectName.Equals(obj.Name.Split('.')[1]) && p.SchemaName.Equals(obj.Schema)).ToList();
obj.Set(ProcessObjectCoverage(obj));
obj.CodeHighlighted = _highlightCodeProvider.HighlightCode(obj.Code, obj.CoveredSegments);

Expand Down
7 changes: 6 additions & 1 deletion SQLCC/Commands/GenerateOutputCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,16 @@ public GenerateOutputCommand(DbProvider dbProvider, DbTraceCodeFormatter dbCodeF

public void Execute()
{
var objects = _dbProvider.GetAllObjects();
foreach (var o in objects)
{
o.Name = $"{o.Schema}.{o.Name}";
}
var codeCoverageProcessor = new CodeCoverageProcessor(_dbCodeFormatter, _codeHighlighter);
var codeCover = new DbCodeCoverage();

codeCover.Name = _traceName;
codeCover.TotalObjects = _dbProvider.GetAllObjects();
codeCover.TotalObjects = objects;
codeCover.TraceCodeSegments = _dbProvider.GetTraceCodeSegments(_traceName);

codeCoverageProcessor.ProcessAllCoverage(codeCover);
Expand Down
1 change: 0 additions & 1 deletion SQLCC/Commands/StartCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ public void Execute()
throw new ApplicationException("You cannot start more than one trace at a time!");
}

_outputProvider.SetUp(_traceName);
_dbProvider.StartTrace(_traceName);
}
}
Expand Down
60 changes: 40 additions & 20 deletions SQLCC/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,36 +31,56 @@ static void Main(string[] args)

var command = arguments["action"].ToLower().Trim();

var traceName = arguments.ContainsKey("traceFileName") ? arguments["traceFileName"] : null;
var traceName = arguments.ContainsKey("traceFileName") ? arguments["traceFileName"] : null;
switch (command)
{
case "generate":
case "generate":
{
RequiredAttributes(arguments,
"traceFileName"
);

var generateCommand = new GenerateOutputCommand(dbProvider, dbCodeFormatter, codeHighlighter, outputProvider, traceName);
generateCommand.Execute();
break;
}

case "start":
{
traceName = traceName ?? DateTime.Now.ToString("yyyyMMddHHmmss");
var startCommand = new StartCommand(outputProvider, dbProvider, traceName);
startCommand.Execute();

break;
}

case "stop":
{
traceName = traceName ?? DateTime.Now.ToString("yyyyMMddHHmmss");
var stopCommand = new StopCommand(dbProvider, outputProvider, traceName);
stopCommand.Execute();

break;
}

case "execute":
{
RequiredAttributes(arguments,
"traceFileName"
);

var generateCommand = new GenerateOutputCommand(dbProvider, dbCodeFormatter, codeHighlighter, outputProvider, traceName);
generateCommand.Execute();
break;

case "execute":

RequiredAttributes(arguments,
"target"
);

traceName = traceName ?? DateTime.Now.ToString("yyyyMMddHHmmss");
var startCommand = new StartCommand(outputProvider, dbProvider, traceName);
startCommand.Execute();
"target"
);

traceName = traceName ?? DateTime.Now.ToString("yyyyMMddHHmmss");
var startCommand = new StartCommand(outputProvider, dbProvider, traceName);
startCommand.Execute();

var executeCommand = new ExecuteCommand(arguments["target"], arguments.ContainsKey("targetArgs") ? arguments["targetArgs"] : string.Empty);
executeCommand.Execute();

var stopCommand = new StopCommand(dbProvider, outputProvider, traceName);
stopCommand.Execute();

break;
break;
}
}

}
Expand Down
2 changes: 1 addition & 1 deletion SQLCC/floc.scrub
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
([\n\r][\s]+) \n Erase white space at beginning of file.
([\t]+|[ ]+) Erase extra spaces
/\*(?>(?:(?!\*/|/\*).)*)(?>(?:/\*(?>(?:(?!\*/|/\*).)*)\*/(?>(?:(?!\*/|/\*).)*))*).*?\*/|--.*?\r?[\n] Erase comments
/\*(?>(?:(?!\*/|/\*).)*)(?>(?:/\*(?>(?:(?!\*/|/\*).)*)\*/(?>(?:(?!\*/|/\*).)*))*).*?\*/|--(?!<SQLCC>).*?\r?[\n] Erase comments
[\r\n]+ \n Replace extra new lines
4 changes: 2 additions & 2 deletions SQLCC/format.scrub
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
([\s]*END(;)*[\s]*\z) {0}$1{1} Last end statement.
([\s]*BEGIN[\s]*)({0}) $2$1 If there is a BEGIN statement near the start of coverage, include BEGIN.
({1})([\s]*END[\s]*) $2$1 If there is an END statement near the end of coverage, include END.
{1}([\s]*(--.*)*[\s]*(begin|end)*[\s]*(--.*)*[\s]*){0} $1 Include begin/end if it is surrounded by comments or just white-space. Also include comments.
(end)([\s]*(--.*)*[\s]*){0} $1{0}$2 Cover up until end statement.
{1}([\s]*(--.*)[\s]*(begin|end)*[\s]*(--.*)[\s]*){0} $1 Include begin/end if it is surrounded by comments or just white-space. Also include comments.
(\bend\b)([\s]|(--.*$)|(/\*.*\*/))*{0} $1{0}$2 Cover up until end statement.
(([\s]*ELSE[\s]*)[\s]*(--.*)*[\s]*){0} {0}$1 If there is an ELSE statemenet that was hit, cover this as well.
{1}([\s]*(declare[\s]+.+)+[\n\r]+([\s]*declare[\s]+.+)*[\s]*) $1{1} DECLARE statements are not covered since profiler does not capture them if there is no default value.
([\s]*(declare[\s]+.+)+[\n\r]+([\s]*declare[\s]+.+)*[\s]*){0} {0}$1 DECLARE statements are not covered since profiler does not capture them if there is no default value.
Expand Down