INTERNAL : apply new Database schema 49/23449/1
authorwoojin <woojin2.jung@samsung.com>
Wed, 25 Jun 2014 16:14:10 +0000 (01:14 +0900)
committerwoojin <woojin2.jung@samsung.com>
Wed, 25 Jun 2014 16:14:10 +0000 (01:14 +0900)
apply new Database schema : callstack unit, callstack data, function entry, function exit, function sample, profiling data, profiling child data
use new database handling APIs
calltrace table no longer has LogData
function entry, function exit, function sample are saved into separate DB table

Change-Id: I84380e174901252f99753df27fa3e54d317568b7
Signed-off-by: woojin <woojin2.jung@samsung.com>
28 files changed:
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AnalyzerManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/database/DBConstants.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/database/SqlConnectionManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/OpenTraceHandler.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/listeners/TableTooltipListener.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/Project.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/sql/DBTableManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/sql/SqlManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/logparser/SWAPLogParser.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/model/data/ProfileData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackInserter.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackUnit.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackUnitDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionSampleDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfiler.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingChildDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/TimelinePage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceDataManager.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionEntryDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionExitDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/StopLogProcessor.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/profiling/UIFunctionProfilingDataChecker.java

index 0df427a..0db2f1d 100755 (executable)
@@ -172,7 +172,7 @@ public class AnalyzerManager {
                StopProcessManager.clear();
                // UserFunctionManager.getInstance().clear();
                LogDataFactory.clean();
-               FunctionUsageProfiler.clear();
+               FunctionUsageProfiler.getInstance().clear();
                FunctionUsageProfiler.getInstance().stopThread();
                RangeDataManager.getInstance().initRange();
                startBinaryAddr = -1;
index cd34919..1b19797 100644 (file)
@@ -41,7 +41,7 @@ public class DBConstants {
        public static final String UNLIMITTED_ARRAY = "ARRAY[]";//$NON-NLS-1$
 
        // types constant
-       public static final String DBTYPE_INT1 = "TYNYINT";//$NON-NLS-1$
+       public static final String DBTYPE_INT1 = "TINYINT";//$NON-NLS-1$
        public static final String DBTYPE_INT2 = "SMALLINT";//$NON-NLS-1$
        public static final String DBTYPE_INT4 = "INTEGER";//$NON-NLS-1$
        public static final String DBTYPE_INT8 = "BIGINT";//$NON-NLS-1$
index 3bbf117..8ed6ff0 100644 (file)
@@ -481,6 +481,9 @@ public class SqlConnectionManager {
                                                        } else if (rsMetaData.getColumnTypeName(i)
                                                                        .contains(DBConstants.BOOLEAN)) {
                                                                rowData.add(Boolean.valueOf(rs.getBoolean(i)));
+                                                       } else if (rsMetaData.getColumnTypeName(i)
+                                                                       .contains(DBConstants.DBTYPE_INT1)) {
+                                                               rowData.add(Byte.valueOf(rs.getByte(i)));                                                               
                                                        } else {
                                                                DA_LOG.error("undefined type : "
                                                                                + rsMetaData.getColumnTypeName(i));
index 4d9bcf9..70a2d85 100644 (file)
@@ -55,8 +55,9 @@ import org.tizen.dynamicanalyzer.swap.channel.data.LibraryObject;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfo;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
 import org.tizen.dynamicanalyzer.swap.logparser.DataManagerRegistry;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackData;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnitDBTable;
 import org.tizen.dynamicanalyzer.ui.network.data.NetworkDataManager;
 import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
@@ -68,7 +69,9 @@ import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingChildData;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingChildDataDBTable;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingDataDBTable;
 import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.toolbar.opentrace.OpenTraceProgressManager;
@@ -190,53 +193,26 @@ public class OpenTraceHandler extends AbstractHandler {
                AnalyzerUtil.executeCommand(ClearHandler.ID);
        }
 
-       private boolean loadCallStackData() {
-               boolean isSuccess = true;
-               List<List<String>> dbInfo = SqlManager.getInstance()
-                               .getCallStackDataFromTable();
-               if (null == dbInfo) {
-                       DA_LOG.debug("failed - loadCallStackData");
-                       isSuccess = false;
-               } else {
-                       for (int i = 0; i < dbInfo.size(); i++) {
-                               List<String> pInfo = dbInfo.get(i);
-                               int seq = Integer.parseInt(pInfo.get(0));
-                               String addrs = pInfo.get(1);
-                               if (null == addrs) {
-                                       continue;
-                               }
-                               String[] splitAddrs = addrs.split(CommonConstants.SLASH);
-                               CallStackData csd = new CallStackData(seq);
-                               List<Long> addrList = csd.getAddrs();
-                               int size = splitAddrs.length;
-                               for (int j = 0; j < size; j++) {
-                                       long addr = Long.parseLong(splitAddrs[j]);
-                                       addrList.add(addr);
-                               }
-                               AnalyzerManager.getCallstackManager()
-                                               .getCallStackDataBySeqMap().put(seq, csd);
-                       }
-               }
-               return isSuccess;
-       }
-
        private boolean loadCallStackApis() {
                boolean isSuccess = true;
-               List<List<String>> dbInfo = SqlManager.getInstance()
-                               .setloadCallStackApis();
-               if (null == dbInfo) {
+               List<List<Object>> callStackUnits = 
+                               CallStackInserter.getInstance().getCallStackUnitTable()
+                               .getCallStackUnitsFromDB(); 
+               if (null == callStackUnits) {
                        DA_LOG.debug("failed - loadCallStackApis");
                        isSuccess = false;
                } else {
                        BaseCallstackManager callstackManager = AnalyzerManager
                                        .getCallstackManager();
-                       for (int i = 0; i < dbInfo.size(); i++) {
-                               List<String> pInfo = dbInfo.get(i);
-                               long addr = Long.parseLong(pInfo.get(0));
-                               String api = pInfo.get(1);
-                               int pid = Integer.parseInt(pInfo.get(2));
-                               long time = Long.parseLong(pInfo.get(3));
-                               CallStackUnit csa = new CallStackUnit(addr, api, pid, time);
+                       for (int i = 0; i < callStackUnits.size(); i++) {
+                               List<Object> callStackUnit = callStackUnits.get(i);
+                               int pid = (Integer) callStackUnit.get(CallStackUnitDBTable.COLUMN.PID.index);
+                               String functionName = (String) callStackUnit
+                                               .get(CallStackUnitDBTable.COLUMN.FUNCTIONNAME.index);
+                               String path = (String) callStackUnit
+                                               .get(CallStackUnitDBTable.COLUMN.BINARYPATH.index);
+                               long addr = (Long) callStackUnit.get(CallStackUnitDBTable.COLUMN.PCADDR.index);
+                               CallStackUnit csa = new CallStackUnit(addr, pid, functionName, path);
                                callstackManager.getCallStackApiAddrByPidMap(pid)
                                                .put(addr, csa);
                        }
@@ -407,74 +383,95 @@ public class OpenTraceHandler extends AbstractHandler {
 
        private boolean loadProfilingData() {
                boolean isSuccess = true;
-               List<List<String>> dbInfo = SqlManager.getInstance()
-                               .setloadProfilingData();
-               if (null == dbInfo) {
+               List<List<Object>> profilingDatas = FunctionUsageProfiler.getInstance()
+                               .getProfilingDataTable().getProfilingDataFromDB();
+               if (null == profilingDatas) {
                        DA_LOG.debug("failed - loadProfilingData");
                        isSuccess = false;
                } else {
-                       for (int i = 0; i < dbInfo.size(); i++) {
-                               List<String> pInfo = dbInfo.get(i);
-                               int pid = Integer.parseInt(pInfo.get(ProfilingData.PID_INDEX));
+                       for (int i = 0; i < profilingDatas.size(); i++) {
+                               List<Object> profilingData = profilingDatas.get(i);
+                               int pid = (Integer) profilingData.get(ProfilingDataDBTable.COLUMN.PID.index);
                                // possibility of extensions - network, efl, db, etc...
                                ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
                                                .getProfileDataMakerByPid(pid);
-                               ProfilingData fupData = new ProfilingData(pInfo, profiler);
-                               String seq = pInfo.get(ProfilingData.SEQUENCE_INDEX);
-                               profiler.getProfilingDataMap().put(Integer.parseInt(seq),
-                                               fupData);
-                               String symbol = pInfo.get(ProfilingData.KEY_INDEX);
-                               profiler.getSymbolSeqHash().put(symbol, seq);
+                               int seq = (Integer) profilingData.get(ProfilingDataDBTable.COLUMN.SEQ.index);
+                               byte type = (Byte) profilingData.get(ProfilingDataDBTable.COLUMN.TYPE.index);
+                               int exCount = (Integer) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.EXCOUNT.index);
+                               int inCount = (Integer) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.INCOUNT.index);
+                               int callCount = (Integer) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.CALLCOUNT.index);
+                               long inElapsedTime = (Long) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.INCLEXETIME.index);
+                               long exElapsedTime = (Long) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.EXCLEXETIME.index);
+                               String name;
+                               ProfilingData fupData = null;
+                               switch (type) {
+                               case ProfilingData.TYPE_APPLICATION:
+                                       name = (String) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.BINARYPATH.index);
+                                       fupData = new ProfilingData(seq, name, exCount, inCount, callCount,
+                                                       inElapsedTime, exElapsedTime, profiler);
+                                       profiler.setAppBin(fupData);
+                                       break;
+                               case ProfilingData.TYPE_DEPENDENTLIBRARY:
+                                       name = (String) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.BINARYPATH.index);
+                                       fupData = new ProfilingData(seq, name, exCount, inCount, callCount,
+                                                       inElapsedTime, exElapsedTime, profiler);                                        
+                                       profiler.setDependentLib(fupData);
+                                       break;
+                               case ProfilingData.TYPE_LIBRARY:
+                                       name = (String) profilingData
+                                               .get(ProfilingDataDBTable.COLUMN.BINARYPATH.index);
+                                       fupData = new ProfilingData(seq, name, exCount, inCount, callCount,
+                                                       inElapsedTime, exElapsedTime, profiler);
+                                       break;
+                               case ProfilingData.TYPE_FUNCTION:
+                                       name = (String) profilingData
+                                       .get(ProfilingDataDBTable.COLUMN.FUNCTIONNAME.index);
+                                       fupData = new ProfilingData(seq, name, exCount, inCount, callCount,
+                                                       inElapsedTime, exElapsedTime, profiler);                                                                        
+                                       break;
+                               default: // never goes here
+                                       System.out.println("invalid profiling data type");
+                                       break;
+                               }
+
+                               profiler.getProfilingDataMap().put(seq, fupData);
                                UIDataManager.getInstance().getfunctionProfilingDataChecker()
                                                .addProfilingData(fupData);
                                // restore total sample count
                                profiler.setTotalSampleCount(profiler.getTotalSampleCount()
                                                + fupData.getExCount());
                        }
-
-                       List<Integer> pids = FunctionUsageProfiler.getInstance()
-                                       .getPidsOfProfileDataMakerMap();
-                       for (int i = 0; i < pids.size(); i++) {
-                               ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
-                                               .getProfileDataMakerByPid(pids.get(i));
-                               ProfilingData ab = profiler
-                                               .getProfilingDataByKey(FunctionUsageProfiler.APPLICATION_KEY);
-                               profiler.setAppBin(ab);
-                               ProfilingData dl = profiler
-                                               .getProfilingDataByKey(FunctionUsageProfiler.DEPENDENT_LIB_KEY);
-                               profiler.setDependentLib(dl);
-                       }
                }
                return isSuccess;
        }
 
        private boolean loadProfilingChildData() {
                boolean isSuccess = true;
-               List<List<String>> dbInfo = SqlManager.getInstance()
-                               .setloadProfilingChildData();
-               if (null == dbInfo) {
+               List<List<Object>> profilingChilds = FunctionUsageProfiler.getInstance()
+                               .getProfilingChildDataTable().getProfilingChildDataFromDB();
+               if (null == profilingChilds) {
                        DA_LOG.debug("failed - loadProfilingChildData");
                        isSuccess = false;
                } else {
-                       for (int i = 0; i < dbInfo.size(); i++) {
-                               List<String> data = dbInfo.get(i);
-                               if (data.size() < 2) { // why?
-                                       continue;
-                               }
-                               int pid = Integer.parseInt(data.get(1)); // 1 == PID_INDEX
-                               String seqs = data.get(2); // 2 == CHILDLIST_INDEX
-                               String[] splitSeqs = seqs.split(CommonConstants.SLASH);
-                               List<Integer> childData = new ArrayList<Integer>();
-                               for (int ii = 0; ii < splitSeqs.length; ii++) {
-                                       childData.add(Integer.parseInt(splitSeqs[ii]));
-                               }
-                               int key = Integer.parseInt(data.get(0));
+                       for (int i = 0; i < profilingChilds.size(); i++) {
+                               List<Object> data = profilingChilds.get(i);
+                               int parentSeq = (Integer) data.get(ProfilingChildDataDBTable.COLUMN.SEQ.index);                         
+                               int pid = (Integer) data.get(ProfilingChildDataDBTable.COLUMN.PID.index);
+                               int childSeq = (Integer) data
+                                               .get(ProfilingChildDataDBTable.COLUMN.CHILDSEQ.index);
+
                                ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
                                                .getProfileDataMakerByPid(pid);
-                               ProfilingData parent = profiler.getProfilingDataMap().get(key);
+                               ProfilingData parent = profiler.getProfilingDataMap().get(parentSeq);
                                ProfilingChildData child = parent.getChildData();
-                               child.getChildren().addAll(childData);
-                               profiler.getChildListMap().put(data.get(0), child);
+                               child.getChildren().add(childSeq);
                        }
                }
                return isSuccess;
index 50b51df..89c6f0e 100644 (file)
@@ -62,10 +62,9 @@ import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfo;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData;
-import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
-import org.tizen.dynamicanalyzer.swap.model.data.UserFunctionData;
 import org.tizen.dynamicanalyzer.swap.platform.BinarySettingData;
 import org.tizen.dynamicanalyzer.swap.platform.BinarySettingManager;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
@@ -222,18 +221,13 @@ public class TableTooltipListener implements Listener {
                        libName = pData.getLibName();
                        break;
                case AnalyzerConstants.TYPE_TABLE_CALLTRACE:
-                       data = tableData.getLogData();
-                       if (data instanceof UserFunctionData) {
-                               addr = ((UserFunctionData) data).getCallerPcAddr();
-                               libName = ((UserFunctionData) data).getLibName();
-                       } else if (data instanceof ProfileData) {
-                               addr = ((ProfileData) data).getCallerPcAddr();
-                               libName = ((ProfileData) data).getLibName();
-                       }
-                       pid = data.getPid();
-                       time = data.getTime();
+                       List<Object> calltraceData = tableData.getData();
+                       addr = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.CALLERPCADDR.index);
+                       libName = (String) calltraceData.get(FunctionEntryDBTable.COLUMN.BINARYPATH.index);
+                       pid = (Integer) calltraceData.get(FunctionEntryDBTable.COLUMN.PID.index);
+                       time = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
                        break;
-               default: // normal
+               default: // normal (in case table has LogData)
                        data = tableData.getLogData();
                        ProbeCommonData wData = (ProbeCommonData) data;
                        addr = wData.getCallerPcAddr();
@@ -256,16 +250,11 @@ public class TableTooltipListener implements Listener {
 
                switch (tableData.getType()) {
                case AnalyzerConstants.TYPE_TABLE_CALLTRACE:
-                       LogData data = tableData.getLogData();
-                       if (data instanceof UserFunctionData) {
-                               addr = ((UserFunctionData) data).getPcAddr();
-                               libName = ((UserFunctionData) data).getLibName();
-                       } else if (data instanceof ProfileData) {
-                               addr = ((ProfileData) data).getPcAddr();
-                               libName = ((ProfileData) data).getLibName();
-                       }
-                       pid = data.getPid();
-                       time = data.getTime();
+                       List<Object> calltraceData = tableData.getData();
+                       addr = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.PCADDR.index);
+                       libName = (String) calltraceData.get(FunctionEntryDBTable.COLUMN.BINARYPATH.index);
+                       pid = (Integer) calltraceData.get(FunctionEntryDBTable.COLUMN.PID.index);
+                       time = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
                        break;
                default:
                        /*
@@ -537,12 +526,8 @@ public class TableTooltipListener implements Listener {
                        libName = pData.getLibName();
                        break;
                case AnalyzerConstants.TYPE_TABLE_CALLTRACE:
-                       LogData data = tableData.getLogData();
-                       if (data instanceof UserFunctionData) {
-                               libName = ((UserFunctionData) data).getLibName();
-                       } else if (data instanceof ProfileData) {
-                               libName = ((ProfileData) data).getLibName();
-                       }
+                       List<Object> calltraceData = tableData.getData();
+                       libName = (String) calltraceData.get(FunctionEntryDBTable.COLUMN.BINARYPATH.index);
                        break;
                default: // normal
                        ProbeCommonData wData = (ProbeCommonData) tableData.getLogData();
index 15ccca6..f3e85cc 100755 (executable)
@@ -58,6 +58,7 @@ import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfo;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
 import org.tizen.dynamicanalyzer.swap.logparser.DataManagerRegistry;
 import org.tizen.dynamicanalyzer.swap.model.DATime;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.util.DALogger;
@@ -302,6 +303,7 @@ public class Project {
 
                // create table
                DataManagerRegistry.createDBTables();
+               CallStackInserter.getInstance().createTables();
                SqlManager.getInstance().createTables();
                SqlManager.getInstance().createProbeTable();
        }
index c79e498..2b166b6 100755 (executable)
@@ -36,12 +36,8 @@ public class DBTableManager {
        public static DBTableManager instance = null;
 
        private static final String TABLE_NAME_PROJECT = "project";//$NON-NLS-1$
-       private static final String TABLE_NAME_CALLSTACK_UNITS = "CallstackUnits";//$NON-NLS-1$
-       private static final String TABLE_NAME_CALLSTACK_DATA = "CallstackData";//$NON-NLS-1$
        private static final String TABLE_NAME_FAILED_DATA = "FailedData";//$NON-NLS-1$
        private static final String TABLE_NAME_LEAK_DATA = "LeakData";//$NON-NLS-1$
-       private static final String TABLE_NAME_PROFILING_DATA = "ProfilingData";//$NON-NLS-1$
-       private static final String TABLE_NAME_PROFILING_CHILD_DATA = "ProfilingChildData";//$NON-NLS-1$
        private static final String TABLE_NAME_TARGET_INFO = "TargetInfo";//$NON-NLS-1$
        private static final String TABLE_NAME_PROCESS_INFO = "ProcessInfo";//$NON-NLS-1$
        private static final String TABLE_NAME_LIB_OBJ = "LibraryObject";//$NON-NLS-1$
@@ -52,16 +48,12 @@ public class DBTableManager {
        private static List<DBTableInfo> tableInfos;
 
        public static final int TABLE_INDEX_PROJECT = 0;
-       public static final int TABLE_INDEX_CALLSTACK_UNITS = 1;
-       public static final int TABLE_INDEX_CALLSTACK_DATA = 2;
-       public static final int TABLE_INDEX_FAILED_DATA = 3;
-       public static final int TABLE_INDEX_LEAK_DATA = 4;
-       public static final int TABLE_INDEX_PROFILING_DATA = 5;
-       public static final int TABLE_INDEX_PROFILING_CHILD_DATA = 6;
-       public static final int TABLE_INDEX_TARGET_INFO = 7;
-       public static final int TABLE_INDEX_PROCESS_INFO = 8;
-       public static final int TABLE_INDEX_LIB_OBJ = 9;
-       public static final int TABLE_INDEX_APINAME = 10;
+       public static final int TABLE_INDEX_FAILED_DATA = 1;
+       public static final int TABLE_INDEX_LEAK_DATA = 2;
+       public static final int TABLE_INDEX_TARGET_INFO = 3;
+       public static final int TABLE_INDEX_PROCESS_INFO = 4;
+       public static final int TABLE_INDEX_LIB_OBJ = 5;
+       public static final int TABLE_INDEX_APINAME = 6;
        // public static final int TABLE_INDEX_CONTEXT_SWITCH_DATA = 12;
        // public static final int TABLE_INDEX_FUNCTION_CALL_DATA = 13;
 
@@ -184,27 +176,6 @@ public class DBTableManager {
                        tableInfos.add(projectInfo);
                }
 
-               // "callstack units" table info block
-               {
-                       String[] names = { CUSTOM_COLUMN_ADDR, CUSTOM_COLUMN_API,
-                                       COMMON_COLUMN_PID, COMMON_COLUMN_TIME };
-                       String[] options = { "not null", EMPTY, EMPTY, EMPTY };
-                       String[] types = { TEXT, "VARCHAR(256)", TEXT, TEXT };
-                       DBTableInfo callstackUnitsTableInfo = new DBTableInfo(
-                                       TABLE_NAME_CALLSTACK_UNITS, names, options, types);
-                       tableInfos.add(callstackUnitsTableInfo);
-               }
-
-               // "callstack data" table info block
-               {
-                       String[] names = { CUSTOM_COLUMN_SEQ, CUSTOM_COLUMN_CALLSTACK };
-                       String[] options = { NOT_NULL, EMPTY };
-                       String[] types = { INTEGER, "VARCHAR(1024)" };
-                       DBTableInfo callstackDataTableInfo = new DBTableInfo(
-                                       TABLE_NAME_CALLSTACK_DATA, names, options, types);
-                       tableInfos.add(callstackDataTableInfo);
-               }
-
                // "failed data" table info block
                {
                        String[] names = { "Rid", "MsgId", "SeqNumber", "Time", "ApiName",
@@ -234,33 +205,6 @@ public class DBTableManager {
                        tableInfos.add(leakDataTableInfo);
                }
 
-               // "profiling data" table info block
-               {
-                       String[] names = { CUSTOM_COLUMN_SEQ, CUSTOM_COLUMN_PID,
-                                       CUSTOM_COLUMN_NAME, CUSTOM_COLUMN_EXCOUNT,
-                                       CUSTOM_COLUMN_INCOUNT, CUSTOM_COLUMN_CALL_COUNT,
-                                       CUSTOM_COLUMN_PARENT, CUSTOM_COLUMN_KEY,
-                                       CUSTOM_COLUMN_INCL_EXETIME, CUSTOM_COLUMN_EXCL_EXETIME };
-                       String[] options = { NOT_NULL, NOT_NULL, EMPTY, EMPTY, EMPTY,
-                                       EMPTY, EMPTY, EMPTY, EMPTY, EMPTY };
-                       String[] types = { TEXT, TEXT, "VARCHAR(512)", TEXT, TEXT, TEXT,
-                                       "VARCHAR(512)", "VARCHAR(512)", TEXT, TEXT };
-                       DBTableInfo profilingDataTableInfo = new DBTableInfo(
-                                       TABLE_NAME_PROFILING_DATA, names, options, types);
-                       tableInfos.add(profilingDataTableInfo);
-               }
-
-               // "profiling child data" table info block
-               {
-                       String[] names = { CUSTOM_COLUMN_SEQ, CUSTOM_COLUMN_PID,
-                                       CUSTOM_COLUMN_CHILD_LIST };
-                       String[] options = { NOT_NULL, NOT_NULL, EMPTY };
-                       String[] types = { TEXT, TEXT, "VARCHAR(1024)" };
-                       DBTableInfo profilingChildTableInfo = new DBTableInfo(
-                                       TABLE_NAME_PROFILING_CHILD_DATA, names, options, types);
-                       tableInfos.add(profilingChildTableInfo);
-               }
-
                // target info
                {
                        String[] names = { TARGET_INFO_SYS_MEM_SIZE,
index 11b9064..011b939 100755 (executable)
@@ -37,17 +37,13 @@ import java.sql.SQLException;
 import java.sql.SQLWarning;
 import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
-import org.tizen.dynamicanalyzer.common.GlobalInformation;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.project.Project;
-import org.tizen.dynamicanalyzer.swap.callstack.BaseCallstackManager;
 import org.tizen.dynamicanalyzer.swap.channel.control.DeviceStatusInfo;
 import org.tizen.dynamicanalyzer.swap.channel.data.ApiNameManager;
 import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
@@ -57,16 +53,10 @@ import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory;
 import org.tizen.dynamicanalyzer.swap.model.format.LogFormat;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackData;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
 import org.tizen.dynamicanalyzer.ui.summary.failed.FailedChecker;
 import org.tizen.dynamicanalyzer.ui.summary.failed.FailedData;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakData;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;
-import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
-import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
-import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingChildData;
-import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.util.DALogger;
 
@@ -737,131 +727,6 @@ public class SqlManager {
                return true;
        }
 
-       public void saveCallStackUnits() {
-               BaseCallstackManager callstackManager = AnalyzerManager
-                               .getCallstackManager();
-               DBTableInfo unitTableInfo = DBTableManager.getInstance().getTableInfo(
-                               DBTableManager.TABLE_INDEX_CALLSTACK_UNITS);
-               List<List<String>> insetData = new ArrayList<List<String>>();
-               String insertQuery = unitTableInfo.insertQuery();
-               List<CallStackUnit> callstackUnits = new ArrayList<CallStackUnit>();
-               List<Integer> pids = callstackManager.getPidsOfCallstackApiAddrMap();
-               int size = pids.size();
-               for (int i = 0; i < size; i++) {
-                       callstackUnits.addAll(callstackManager.getCallStackApiAddrByPidMap(
-                                       pids.get(i)).values());
-               }
-
-               size = callstackUnits.size();
-               for (int i = 0; i < size; i++) {
-                       List<String> insertRowData = new ArrayList<String>();
-                       try {
-                               CallStackUnit saveData = callstackUnits.get(i);
-                               insertRowData.add(Long.toString(saveData.getAddr()));
-                               insertRowData.add(saveData.getSymbol());
-                               insertRowData.add(Integer.toString(saveData.getPid()));
-                               insertRowData.add(Long.toString(saveData.getTime()));
-                       } catch (ArrayIndexOutOfBoundsException e) {
-                               e.printStackTrace();
-                       }
-                       insetData.add(insertRowData);
-               }
-               insertQuery(insertQuery, insetData);
-       }
-
-       public void saveCallStackData() {
-               DBTableInfo callstackData = DBTableManager.getInstance().getTableInfo(
-                               DBTableManager.TABLE_INDEX_CALLSTACK_DATA);
-               List<List<String>> insetData = new ArrayList<List<String>>();
-               String insertQuery = callstackData.insertQuery();
-               Collection<CallStackData> col = AnalyzerManager.getCallstackManager()
-                               .getCallStackDataBySeqMap().values();
-               List<CallStackData> callstackDataList = new ArrayList<CallStackData>();
-               callstackDataList.addAll(col);
-               int size = callstackDataList.size();
-               for (int i = 0; i < size; i++) {
-                       List<String> insetRowData = new ArrayList<String>();
-                       int seq = callstackDataList.get(i).getSeq();
-                       String addrs = makeSaveFormat(callstackDataList.get(i).getAddrs());
-                       try {
-                               insetRowData.add(Integer.toString(seq));
-                               insetRowData.add(addrs);
-                       } catch (ArrayIndexOutOfBoundsException e) {
-                               e.printStackTrace();
-                       }
-                       insetData.add(insetRowData);
-               }
-               insertQuery(insertQuery, insetData);
-       }
-
-       public void saveProfilingData() {
-               List<Integer> pids = FunctionUsageProfiler.getInstance()
-                               .getPidsOfProfileDataMakerMap();
-               for (int i = 0; i < pids.size(); i++) {
-                       ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
-                                       .getProfileDataMakerByPid(pids.get(i));
-                       Map<Integer, ProfilingData> profilingDataMap = profiler
-                                       .getProfilingDataMap();
-                       List<ProfilingData> pDataList = new ArrayList<ProfilingData>();
-                       pDataList.addAll(profilingDataMap.values());
-
-                       DBTableInfo profilingData = DBTableManager.getInstance()
-                                       .getTableInfo(DBTableManager.TABLE_INDEX_PROFILING_DATA);
-                       String insertQuery = profilingData.insertQuery();
-
-                       List<List<String>> insetData = new ArrayList<List<String>>();
-                       int size = profilingData.getColumnNames().length;
-                       int count = pDataList.size();
-                       for (int j = 0; j < count; j++) {
-                               List<String> input = pDataList.get(j).getSaveData();
-                               List<String> insetRowData = new ArrayList<String>();
-                               int dataSize = input.size();
-                               for (int ii = 0; ii < size; ii++) {
-                                       if (ii >= dataSize) {
-                                               insetRowData.add(CommonConstants.EMPTY);
-                                       } else {
-                                               insetRowData.add(input.get(ii));
-                                       }
-                               }
-                               insetData.add(insetRowData);
-                       }
-                       insertQuery(insertQuery, insetData);
-               }
-       }
-
-       public void saveProfilingChildData() {
-               List<Integer> pids = FunctionUsageProfiler.getInstance()
-                               .getPidsOfProfileDataMakerMap();
-               for (int i = 0; i < pids.size(); i++) {
-                       ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
-                                       .getProfileDataMakerByPid(pids.get(i));
-                       Map<String, ProfilingChildData> profilingDataMap = profiler
-                                       .getChildListMap();
-                       List<ProfilingChildData> pDataList = new ArrayList<ProfilingChildData>();
-                       pDataList.addAll(profilingDataMap.values());
-
-                       DBTableInfo profilingChildData = DBTableManager.getInstance()
-                                       .getTableInfo(
-                                                       DBTableManager.TABLE_INDEX_PROFILING_CHILD_DATA);
-
-                       List<List<String>> insetData = new ArrayList<List<String>>();
-                       int count = pDataList.size();
-                       for (int j = 0; j < count; j++) {
-                               ProfilingChildData data = pDataList.get(j);
-                               String seqStr = makeLoadFormat(data.getChildren());
-                               List<String> insetRowData = new ArrayList<String>();
-                               if (null == seqStr || seqStr.isEmpty()) {
-                                       continue;
-                               }
-                               insetRowData.add(data.getSeq());
-                               insetRowData.add(Integer.toString(data.getPid()));
-                               insetRowData.add(seqStr);
-                               insetData.add(insetRowData);
-                       }
-                       insertQuery(profilingChildData.insertQuery(), insetData);
-               }
-       }
-
        /**
         * select query function
         * 
@@ -1217,34 +1082,6 @@ public class SqlManager {
        }
 
        // openTraceHandler
-       public List<List<String>> getCallStackDataFromTable() {
-               return selectQuery(
-                               null,
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(DBTableManager.TABLE_INDEX_CALLSTACK_DATA)
-                                               .getColumnNames(),
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(DBTableManager.TABLE_INDEX_CALLSTACK_DATA)
-                                               .getTableName(), null);
-       }
-
-       public List<List<String>> setloadCallStackApis() {
-               return selectQuery(
-                               null,
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(
-                                                               DBTableManager.TABLE_INDEX_CALLSTACK_UNITS)
-                                               .getColumnNames(),
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(
-                                                               DBTableManager.TABLE_INDEX_CALLSTACK_UNITS)
-                                               .getTableName(), null);
-       }
-
        public List<List<String>> loadTargetInfo() {
                return selectQuery(
                                null,
@@ -1305,34 +1142,6 @@ public class SqlManager {
                                                .getTableName(), null);
        }
 
-       public List<List<String>> setloadProfilingData() {
-               return selectQuery(
-                               null,
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(DBTableManager.TABLE_INDEX_PROFILING_DATA)
-                                               .getColumnNames(),
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(DBTableManager.TABLE_INDEX_PROFILING_DATA)
-                                               .getTableName(), null);
-       }
-
-       public List<List<String>> setloadProfilingChildData() {
-               return selectQuery(
-                               null,
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(
-                                                               DBTableManager.TABLE_INDEX_PROFILING_CHILD_DATA)
-                                               .getColumnNames(),
-                               DBTableManager
-                                               .getInstance()
-                                               .getTableInfo(
-                                                               DBTableManager.TABLE_INDEX_PROFILING_CHILD_DATA)
-                                               .getTableName(), null);
-       }
-
        public List<String> getPids() {
                List<List<String>> dbInfo = selectQuery(null,
                                new String[] { "distinct pid" }, "ProcessInfo", null);
@@ -1656,44 +1465,4 @@ public class SqlManager {
                }
                return 0;
        }
-
-       private String makeSaveFormat(List<Long> input) {
-               if (null == input || input.isEmpty()) {
-                       return null;
-               }
-
-               int size = input.size();
-               StringBuffer str = new StringBuffer();
-               for (int i = 0; i < size; i++) {
-                       try {
-                               str.append(input.get(i));
-                       } catch (OutOfMemoryError e) {
-                               e.printStackTrace();
-                       }
-                       if (i + 1 == size) {
-                               break;
-                       } else {
-                               str.append(CommonConstants.SLASH);
-                       }
-               }
-               return str.toString();
-       }
-
-       private String makeLoadFormat(List<Integer> input) {
-               if (null == input || input.isEmpty()) {
-                       return null;
-               }
-
-               int size = input.size();
-               StringBuffer str = new StringBuffer();
-               for (int i = 0; i < size; i++) {
-                       str.append(input.get(i));
-                       if (i + 1 == size) {
-                               break;
-                       } else {
-                               str.append(CommonConstants.SLASH);
-                       }
-               }
-               return str.toString();
-       }
 }
index 92cdca2..4e5eab7 100755 (executable)
@@ -40,12 +40,7 @@ import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogInserter;
 import org.tizen.dynamicanalyzer.model.ImageInfo;
-import org.tizen.dynamicanalyzer.nl.InformationViewLabels;
-import org.tizen.dynamicanalyzer.swap.channel.control.BinaryInfo;
-import org.tizen.dynamicanalyzer.swap.channel.data.ApiNameManager;
 import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
-import org.tizen.dynamicanalyzer.swap.channel.data.LibraryObject;
-import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfo;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
 import org.tizen.dynamicanalyzer.swap.model.data.ContextSwitchData;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
@@ -53,7 +48,6 @@ import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
 import org.tizen.dynamicanalyzer.swap.model.data.ReplayData;
 import org.tizen.dynamicanalyzer.swap.model.data.ScreenShotData;
 import org.tizen.dynamicanalyzer.swap.model.data.SystemData;
-import org.tizen.dynamicanalyzer.swap.platform.BinarySettingManager;
 import org.tizen.dynamicanalyzer.ui.info.screenshot.SocketClient;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
@@ -71,6 +65,9 @@ public class SWAPLogParser implements Runnable {
        // private static boolean dropCallTraceLog = true;
        // private static boolean dropCallTraceLog = false;
        private static LogQueue logQueue = null;
+       
+       // map for matching exit log with entry log
+       private static HashMap<Integer, List<Integer>> functionEntryStackByTidMap = new HashMap<Integer, List<Integer>>();      
 
        private int SMALL_IMG_WIDTH = 40;
        private int SMALL_IMG_HEIGHT = 66;
@@ -85,6 +82,18 @@ public class SWAPLogParser implements Runnable {
                return logQueue;
        }
 
+       public List<Integer> getFunctionEntryStack(int tid) {
+               if (null == functionEntryStackByTidMap) {
+                       functionEntryStackByTidMap = new HashMap<Integer, List<Integer>>();
+               }
+               List<Integer> functionEntryStack = functionEntryStackByTidMap.get(tid);
+               if (null == functionEntryStack) {
+                       functionEntryStack = new ArrayList<Integer>();
+                       functionEntryStackByTidMap.put(tid, functionEntryStack);
+               }
+               return functionEntryStack;
+       }
+       
        public static synchronized void startLogParser() {
                getLogQueue().clear();
                // why here?
@@ -109,7 +118,7 @@ public class SWAPLogParser implements Runnable {
                                e.printStackTrace();
                        }
                }
-
+               functionEntryStackByTidMap.clear();
                DataManagerRegistry.stopThreads();
        }
 
@@ -144,6 +153,7 @@ public class SWAPLogParser implements Runnable {
                        }
                        LogData log = logLumb.get(i);
                        int id = log.getId();
+                       int seqNum = log.getSeq();                      
                        if (log instanceof SystemData) {
                                // System.out
                                // .println("=========systemData is slicing===========\n");
@@ -208,6 +218,20 @@ public class SWAPLogParser implements Runnable {
                                                // + AnalyzerUtil.toHexdecimal(processInfo
                                                // .getLowestAddress()));
        
+                                               List<Integer> functionStack = getFunctionEntryStack(pData.getTid());
+                                               // entry / exit pair matching
+                                               if (id == DataChannelConstants.MSG_FUNCTION_ENTRY) {
+                                                       functionStack.add(seqNum);
+                                               } else { // msg_function_exit
+                                                       int stackSize = functionStack.size();
+                                                       if (size > 0) {
+                                                               pData.setEntrySeq(functionStack.get(stackSize - 1));
+                                                               functionStack.remove(stackSize - 1);
+                                                       } else { // size <= 0 : bug (exit without entry)
+                                                               DA_LOG.error("function exit log without entry log");
+                                                       }
+                                               }
+                                               
                                                pushLog(log, logPack);
                                                        AnalyzerManager.getCallstackManager()
                                                                        .makeUserCallstack(
index 92950b2..22c632b 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com> 
  * Jooyoul Lee <jy.exe.lee@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -56,7 +57,8 @@ public class ProfileData extends LogData {
        String args = null; // function entry specific
        String ret = null;
        String apiName = null;
-
+       int entrySeq = -1; // for entry/exit log matching
+       
        int buildType = -1;
        String binaryPath = null;
 
@@ -258,6 +260,14 @@ public class ProfileData extends LogData {
                this.apiName = apiName;
        }
 
+       public int getEntrySeq() {
+               return entrySeq;
+       }
+       
+       public void setEntrySeq(int seq) {
+               this.entrySeq = seq;
+       }
+       
        @Override
        public void makePreparedStatement(PreparedStatement prep)
                        throws SQLException {
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackDataDBTable.java
new file mode 100644 (file)
index 0000000..2f3e9b5
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.info.callstack;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class CallStackDataDBTable extends DBTable {
+       private static final String TABLENAME="CallStackData";
+       private static final String queryto_withSeq = "where %s = %s";
+       //TODO: use Array type of DB
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               ORDER(1, "CallStackOrder"),
+               PCADDR(2, "PcAddr");
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public CallStackDataDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ORDER.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));             
+       }
+
+       public List<List<Object>> getCallStackAddrsFromDB(int seq) {
+               String where = String.format(queryto_withSeq, 
+                               COLUMN.SEQ.name, seq);
+               
+               List<String> selectColumn = new ArrayList<String>();
+               selectColumn.add(COLUMN.PCADDR.name);
+               
+               return selectData(selectColumn, where); 
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setInt(COLUMN.ORDER.index + 1, (Integer) (rowData.get(COLUMN.ORDER.index)));
+                               prep.setLong(COLUMN.PCADDR.index + 1, (Long) (rowData.get(COLUMN.PCADDR.index)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index d4481bb..507a663 100644 (file)
@@ -31,12 +31,7 @@ import java.util.List;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.sql.DBTableInfo;
-import org.tizen.dynamicanalyzer.sql.DBTableManager;
-import org.tizen.dynamicanalyzer.sql.SqlManager;
 
-// TODO: apply new DB schema, class, API
 // inserter thread for callstackdata, callstackunit
 public class CallStackInserter implements Runnable {
        private static CallStackInserter instance = null;
@@ -45,21 +40,41 @@ public class CallStackInserter implements Runnable {
        private static volatile Thread inserterThread = null;
        private static final int FULL_COUNT = 100;
        private static boolean stopTrace = false;
+       
+       private CallStackDataDBTable callStackDataTable = null;
+       private CallStackUnitDBTable callStackUnitTable = null;
 
+       public CallStackInserter() {
+               callStackDataTable = new CallStackDataDBTable();
+               callStackUnitTable = new CallStackUnitDBTable();
+       }
+       
        public synchronized static CallStackInserter getInstance() {
                if (null == instance) {
                        instance = new CallStackInserter();
                }
                return instance;
        }
+       
+       public CallStackDataDBTable getCallStackDataTable() {
+               return callStackDataTable;
+       }
+       
+       public CallStackUnitDBTable getCallStackUnitTable() {
+               return callStackUnitTable;
+       }
 
+       public void createTables() {
+               callStackDataTable.createTable();
+               callStackUnitTable.createTable();               
+       }
+       
        public synchronized void startInserterThread() {
                if (inserterThread == null) {
                        stopTrace = false;
                        inserterThread = new Thread(null, getInstance());
                        inserterThread.start();
                }
-
        }
 
        public void stopInserterThread() {
@@ -75,57 +90,58 @@ public class CallStackInserter implements Runnable {
        }
 
        private void saveCallStackUnits() {
-               DBTableInfo unitTableInfo = DBTableManager.getInstance().getTableInfo(
-                               DBTableManager.TABLE_INDEX_CALLSTACK_UNITS);
-               List<List<String>> insetData = new ArrayList<List<String>>();
-               String insertQuery = unitTableInfo.insertQuery();
+               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();
+
                CallStackUnit csu = null;
                int insertCount = FULL_COUNT;
 
                while ((csu = callstackUnitQueue.poll()) != null) {
-                       List<String> insetRowData = new ArrayList<String>();
+                       List<Object> insertRowData = new ArrayList<Object>();
                        try {
-                               insetRowData.add(Long.toString(csu.getAddr()));
-                               insetRowData.add(csu.getSymbol());
-                               insetRowData.add(Integer.toString(csu.getPid()));
-                               insetRowData.add(Long.toString(csu.getTime()));                         
+                               insertRowData.add(new Integer(csu.getPid()));
+                               insertRowData.add(csu.getFunctionName());
+                               insertRowData.add(csu.getPath());
+                               insertRowData.add(new Long(csu.getAddr()));
                        } catch (ArrayIndexOutOfBoundsException e) {
                                e.printStackTrace();
                        }
-                       insetData.add(insetRowData);
+                       insertData.add(insertRowData);
                        if ((insertCount-- <= 0) && (stopTrace == false)) {
                                break;
                        }
                }
-               if (insetData.size() > 0) {
-                       SqlManager.getInstance().insertQuery(insertQuery, insetData);
+               if (insertData.size() > 0) {
+                       callStackUnitTable.insertData(insertData);
                }
        }
 
        private void saveCallStackData() {
-               DBTableInfo callstackData = DBTableManager.getInstance().getTableInfo(
-                               DBTableManager.TABLE_INDEX_CALLSTACK_DATA);
-               List<List<String>> insetData = new ArrayList<List<String>>();
-               String insertQuery = callstackData.insertQuery();
+               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();
+
                CallStackData csd = null;
                int insertCount = FULL_COUNT;
 
                while ((csd = callstackDataQueue.poll()) != null) {
-                       List<String> insetRowData = new ArrayList<String>();
-                       String addrs = makeLongList2String(csd.getAddrs());
-                       try {
-                               insetRowData.add(Integer.toString(csd.getSeq()));
-                               insetRowData.add(addrs);
-                       } catch (ArrayIndexOutOfBoundsException e) {
-                               e.printStackTrace();
+                       List<Long> addrs = csd.getAddrs();
+                       int size = addrs.size();
+
+                       for(int i = 0; i < size; i++) {
+                               List<Object> insertRowData = new ArrayList<Object>();                           
+                               try {
+                                       insertRowData.add(new Long(csd.getSeq()));
+                                       insertRowData.add(new Integer(i));
+                                       insertRowData.add(new Long(addrs.get(i)));
+                               } catch (ArrayIndexOutOfBoundsException e) {
+                                       e.printStackTrace();
+                               }
+                               insertData.add(insertRowData);
                        }
-                       insetData.add(insetRowData);
                        if ((insertCount-- <= 0) && (stopTrace == false)) {
                                break;
                        }
                }
-               if (insetData.size() > 0) {
-                       SqlManager.getInstance().insertQuery(insertQuery, insetData);
+               if (insertData.size() > 0) {
+                       callStackDataTable.insertData(insertData);
                }
        }
 
@@ -158,27 +174,4 @@ public class CallStackInserter implements Runnable {
                saveCallStackUnits();
                saveCallStackData();
        }
-
-       public static String makeLongList2String(List<Long> input) {
-               if (null == input || input.isEmpty()) {
-                       return null;
-               }
-       
-               int size = input.size();
-               StringBuffer str = new StringBuffer();
-               for (int i = 0; i < size; i++) {
-                       try {
-                               str.append(input.get(i));
-                       } catch (OutOfMemoryError e) {
-                               e.printStackTrace();
-                       }
-                       if (i + 1 == size) {
-                               break;
-                       } else {
-                               str.append(CommonConstants.SLASH);
-                       }
-               }
-               return str.toString();
-       }
-
 }
\ No newline at end of file
index 537b126..0463f20 100644 (file)
@@ -77,6 +77,20 @@ public class CallStackUnit {
                makeCallstackData();
        }
 
+       /** using open trace **/
+       public CallStackUnit(long addr, int pid, String functionName, String path) {
+               address = addr;
+               functionStartAddress = addr;
+               originSymbol = CommonConstants.EMPTY;
+               this.time = -1;
+               
+               this.functionName = functionName;
+               this.path = path;               
+               offset = CommonConstants.EMPTY;
+               etc = CommonConstants.EMPTY;
+               this.pid = pid;
+       }
+               
        private void makeCallstackData() {
 
                String[] splitPath = originSymbol.split("\\(", 2); //$NON-NLS-1$
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackUnitDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackUnitDBTable.java
new file mode 100644 (file)
index 0000000..8a61bb3
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.info.callstack;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class CallStackUnitDBTable extends DBTable {
+       private static final String TABLENAME="CallStackUnits";
+       
+       public enum COLUMN {
+               PID(0, "PID"),
+               FUNCTIONNAME(1, "FunctionName"),
+               BINARYPATH(2, "BinaryPath"),
+               PCADDR(3, "PcAddr");
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public CallStackUnitDBTable() {
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.FUNCTIONNAME.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FUNCTION_NAME_LENGTH));
+               addColumn(new DBColumn(COLUMN.BINARYPATH.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FILEPATH_LENGTH));
+               addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));             
+       }
+
+       public List<List<Object>> getCallStackUnitsFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+
+                               String functionStr = clipString((String) (rowData.get(COLUMN.FUNCTIONNAME.index)),
+                                               DALimit.FUNCTION_NAME_LENGTH, rowData.get(COLUMN.PCADDR.index).toString());
+                               prep.setString(COLUMN.FUNCTIONNAME.index + 1, functionStr);
+                               
+                               String pathStr = clipString((String) (rowData.get(COLUMN.BINARYPATH.index)),
+                                               DALimit.FILEPATH_LENGTH, rowData.get(COLUMN.PCADDR.index).toString());
+                               prep.setString(COLUMN.BINARYPATH.index + 1, pathStr);
+                                                               
+                               prep.setLong(COLUMN.PCADDR.index + 1, (Long) (rowData.get(COLUMN.PCADDR.index)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index 35a0eb2..7c9e081 100644 (file)
@@ -39,15 +39,14 @@ import org.eclipse.swt.widgets.Composite;
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.model.TableInput;
-import org.tizen.dynamicanalyzer.sql.SqlManager;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.ui.file.FilePage;
 import org.tizen.dynamicanalyzer.ui.opengl.GLPage;
 import org.tizen.dynamicanalyzer.ui.page.ScreenshotTabComposite;
 import org.tizen.dynamicanalyzer.ui.range.RangePage;
 import org.tizen.dynamicanalyzer.ui.summary.SummaryPage;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
 import org.tizen.dynamicanalyzer.ui.userinterface.UIPage;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
@@ -130,7 +129,13 @@ public class CallstackTable extends DATableComposite {
                                pid = (Integer) leakData.get(1);
                                time = (Long) leakData.get(4);
                                libName = (String) leakData.get(7);
-                       } else {
+                       } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_CALLTRACE) {
+                               List<Object> calltraceData = tableData.getData();
+                               seqNum = ((Long) calltraceData.get(FunctionEntryDBTable.COLUMN.SEQ.index)).intValue();
+                               pid = (Integer) calltraceData.get(FunctionEntryDBTable.COLUMN.PID.index);
+                               time = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
+                               libName = (String) calltraceData.get(FunctionEntryDBTable.COLUMN.BINARYPATH.index);
+                       } else { // in case table has LogData
                                LogData logData = tableData.getLogData();
                                seqNum = logData.getSeq();
                                pid = logData.getPid();
@@ -148,25 +153,19 @@ public class CallstackTable extends DATableComposite {
                        CallStackData csd = cdMap.get(seqNum);
                        List<Long> addrs = null;
                        if (null == csd) { // callstackdata is not in memory, find from DB
-                               // TODO: apply new DB schema
-                               String callstackQuery = "where seqnumber = " + seqNum;
-                               List<List<String>> dbInfo = SqlManager.getInstance()
-                                               .selectQuery(null, new String[] { "callstack" }, 
-                                               "CallstackData", callstackQuery);
-                               if (null == dbInfo || 0 == dbInfo.size() 
-                                               || null == dbInfo.get(0)) { // not found
-                                       return;
-                               }
-                               String strAddrs = dbInfo.get(0).get(0);
-                               if (null == strAddrs) {
+                               List<List<Object>> callStackAddrs = 
+                                               CallStackInserter.getInstance().getCallStackDataTable()
+                                               .getCallStackAddrsFromDB(seqNum); 
+
+                               if (null == callStackAddrs || 0 == callStackAddrs.size() 
+                                               || null == callStackAddrs.get(0)) { // not found
                                        return;
                                }
-                               String[] splitAddrs = strAddrs.split(CommonConstants.SLASH);
-                               int size = splitAddrs.length;
+
+                               int size = callStackAddrs.size();
                                addrs = new ArrayList<Long>(); 
-                               for (int j = 0; j < size; j++) {
-                                       long addr = Long.parseLong(splitAddrs[j]);
-                                       addrs.add(addr);
+                               for (int i = 0; i < size; i++) {
+                                       addrs.add((Long) callStackAddrs.get(i).get(0));
                                }
                        } else { // callstackdata is in memory
                                addrs = csd.getAddrs();
@@ -174,9 +173,14 @@ public class CallstackTable extends DATableComposite {
 
                        int size = addrs.size();
                        for (int i = 0; i < size; i++) {
+                               String hexAddr = Formatter.toHexString(addrs.get(i).toString());
                                CallStackUnit api = addrMap.get(addrs.get(i));
 
-                               String hexAddr = Formatter.toHexString(addrs.get(i).toString());
+                               if (null == api) {
+                                       DA_LOG.debug("callstackunit for addr : " + hexAddr + " not found");                                     
+                                       return;
+                               }
+
                                String path = api.getPath();
                                if (null == path) {
                                        DA_LOG.debug("callstackunit for addr : " + hexAddr + " not found");
index bbcc807..29f36f7 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com> 
  * Jooyoul Lee <jy.exe.lee@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -40,6 +41,7 @@ import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.nl.InformationViewLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite;
@@ -119,24 +121,30 @@ public class CallstackView extends DAViewComposite {
                                } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_LEAK) {
                                        List<Object> leakData = tableData.getData();
                                        startTime = (Long) leakData.get(4);
-                               } else {
+                               } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_CALLTRACE) {
+                                       List<Object> calltraceData = tableData.getData();
+                                       startTime = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
+                               } else { // in case table has LogData
                                        LogData startData = ((DATableDataFormat) selection[0]
                                                        .getData()).getLogData();
                                        startTime = startData.getTime();
                                }
                                long endTime = startTime;
+                               // TODO: need to review what below code does 
                                if (null != selection[selection.length - 1].getData()) {
-                                       DATableDataFormat lastTableData = (DATableDataFormat) selection[0]
+                                       DATableDataFormat lastTableData = (DATableDataFormat) selection[selection.length - 1]
                                                        .getData();
                                        if (lastTableData.getType() == AnalyzerConstants.TYPE_TABLE_FAILED) {
-                                               List<Object> failedData = tableData.getData();
+                                               List<Object> failedData = lastTableData.getData();
                                                endTime = (Long) failedData.get(1);
                                        } else if (lastTableData.getType() == AnalyzerConstants.TYPE_TABLE_LEAK) {
-                                               List<Object> leakData = tableData.getData();
+                                               List<Object> leakData = lastTableData.getData();
                                                endTime = (Long) leakData.get(4);
+                                       } else if (lastTableData.getType() == AnalyzerConstants.TYPE_TABLE_CALLTRACE) {
+                                               List<Object> calltraceData = lastTableData.getData();
+                                               endTime = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
                                        } else {
-                                               LogData endData = ((DATableDataFormat) selection[selection.length - 1]
-                                                               .getData()).getLogData();
+                                               LogData endData = lastTableData.getLogData();
                                                endTime = endData.getTime();
                                        }
                                }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionSampleDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionSampleDBTable.java
new file mode 100644 (file)
index 0000000..9a5b645
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.profiling;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class FunctionSampleDBTable extends DBTable {
+       private static final String TABLENAME="FunctionSample";
+       
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               SAMPLETIME(1, "SampleTime"),
+               PID(2, "PID"),
+               TID(3, "TID"),
+               PCADDR(4, "PcAddr"),
+               CPUNUM(5, "CpuNum");
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public FunctionSampleDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SAMPLETIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.CPUNUM.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));             
+       }
+
+       public List<List<Object>> getFunctionSampleFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }       
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setLong(COLUMN.SAMPLETIME.index + 1, (Long) (rowData.get(COLUMN.SAMPLETIME.index)));                               
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               prep.setLong(COLUMN.PCADDR.index + 1, (Long) (rowData.get(COLUMN.PCADDR.index)));
+                               prep.setByte(COLUMN.CPUNUM.index + 1, (Byte) (rowData.get(COLUMN.CPUNUM.index)));                               
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index 0e23e6f..ae8a93c 100644 (file)
@@ -49,7 +49,7 @@ import org.tizen.dynamicanalyzer.ui.toolbar.configuration.ConfigurationDialogDat
 
 public class FunctionUsageProfiler extends PageDataManager {
        // default sampling rate = 10 ms
-       public static long SAMPLE_TIME = -1;
+       public static long SAMPLE_TIME = 10;
        public static final String APPLICATION = SummaryLabels.FUNCTION_USAGE_PROFILER_APPLICATION;
        public static final String DEPENDENT_LIB = SummaryLabels.FUNCTION_USAGE_PROFILER_DEPENDENT_LIB;
        public static final String APPLICATION_KEY = "profiling_app_bin_key";//$NON-NLS-1$
@@ -57,9 +57,35 @@ public class FunctionUsageProfiler extends PageDataManager {
        public static final String UNKNOWN = CommonConstants.EMPTY;
 
        private static FunctionUsageProfiler instance = null;
-
+       private boolean isSetSamplePeriod = false;
+       
+       private ProfilingDataDBTable profilingDataTable = null;
+       private ProfilingChildDataDBTable profilingChildDataTable = null;
+       private FunctionSampleDBTable functionSampleTable = null;
+       
        private HashMap<Integer, ProfileDataMaker> profileDataMakerMap = null;
 
+       private FunctionUsageProfiler() {
+               profilingDataTable = new ProfilingDataDBTable();
+               addDBTable(profilingDataTable);
+               profilingChildDataTable = new ProfilingChildDataDBTable();
+               addDBTable(profilingChildDataTable);
+               functionSampleTable = new FunctionSampleDBTable();
+               addDBTable(functionSampleTable);
+       }
+       
+       public ProfilingDataDBTable getProfilingDataTable() {
+               return profilingDataTable;
+       }
+       
+       public ProfilingChildDataDBTable getProfilingChildDataTable() {
+               return profilingChildDataTable;
+       }
+       
+       public FunctionSampleDBTable getFunctionSampleTable() {
+               return functionSampleTable;
+       }       
+       
        /**
         * key: symbol(child) or file path (parent) - value : sequence num of
         * profiling data. all parent and child data is in
@@ -96,17 +122,112 @@ public class FunctionUsageProfiler extends PageDataManager {
                return instance;
        }
 
-       public static void clear() {
-               instance = null;
+       public void clear() {
+               isSetSamplePeriod = false;
+               if (profileDataMakerMap != null) {
+                       profileDataMakerMap.clear();                    
+               }
+       }
+       
+       public void saveProfilingData() {
+               List<Integer> pids = getPidsOfProfileDataMakerMap();
+               for (int i = 0; i < pids.size(); i++) {
+                       ProfileDataMaker profiler = getProfileDataMakerByPid(pids.get(i));
+                       Map<Integer, ProfilingData> profilingDataMap = profiler
+                                       .getProfilingDataMap();
+                       List<ProfilingData> pDataList = new ArrayList<ProfilingData>();
+                       pDataList.addAll(profilingDataMap.values());
+
+                       List<List<Object>> insertData = new ArrayList<List<Object>>();
+
+                       int count = pDataList.size();
+                       for (int j = 0; j < count; j++) {
+                               List<Object> insertRowData = new ArrayList<Object>();
+                               ProfilingData pData = pDataList.get(j);
+                               
+                               try {                           
+                                       insertRowData.add(new Integer(pData.getSequence()));
+                                       String key = pData.getKey();
+                                       byte type;
+                                       if (key.equals(APPLICATION_KEY)) {
+                                               type = ProfilingData.TYPE_APPLICATION;
+                                       } else if (key.equals(DEPENDENT_LIB_KEY)) {
+                                               type = ProfilingData.TYPE_DEPENDENTLIBRARY;
+                                       } else {
+                                               if (pData.isParent()) { // library
+                                                       type = ProfilingData.TYPE_LIBRARY;
+                                               } else { // function
+                                                       type = ProfilingData.TYPE_FUNCTION;
+                                               }
+                                       }
+                                       insertRowData.add(new Byte(type));
+                                       if (pData.isParent()) {
+                                               insertRowData.add(""); // function name is null for library type
+                                               insertRowData.add(pData.getName());
+                                       } else {
+                                               insertRowData.add(pData.getName());
+                                               insertRowData.add(""); // library path is null for function type
+                                       }
+                                       insertRowData.add(new Integer(pids.get(i)));
+                                       insertRowData.add(new Integer(pData.getSelfExCount()));
+                                       insertRowData.add(new Integer(pData.getInCount()));
+                                       insertRowData.add(new Integer(pData.getCallCount()));
+                                       insertRowData.add(new Long(pData.getElapsedTime()));
+                                       insertRowData.add(new Long(pData.getExclusiveElapsedTime()));                           
+                               } catch (ArrayIndexOutOfBoundsException e) {
+                                       e.printStackTrace();
+                               }                               
+                               insertData.add(insertRowData);
+                       }
+                       if (insertData.size() > 0) {
+                               profilingDataTable.insertData(insertData);
+                       }
+               }
+       }
+
+       public void saveProfilingChildData() {
+               List<Integer> pids = getPidsOfProfileDataMakerMap();
+               for (int i = 0; i < pids.size(); i++) {
+                       ProfileDataMaker profiler = getProfileDataMakerByPid(pids.get(i));
+                       Map<String, ProfilingChildData> profilingDataMap = profiler
+                                       .getChildListMap();
+                       List<ProfilingChildData> pDataList = new ArrayList<ProfilingChildData>();
+                       pDataList.addAll(profilingDataMap.values());
+
+                       List<List<Object>> insertData = new ArrayList<List<Object>>();
+                       int count = pDataList.size();
+                       for (int j = 0; j < count; j++) {
+                               ProfilingChildData data = pDataList.get(j);
+                               List<Integer> childList = data.getChildren();
+                               int childCount = childList.size();
+                               try {
+                                       for (int k = 0; k < childCount; k++)
+                                       {
+                                               List<Object> insertRowData = new ArrayList<Object>();                                           
+                                               insertRowData.add(Integer.valueOf(data.getSeq()));
+                                               insertRowData.add(new Integer(data.getPid()));
+                                               insertRowData.add(new Integer(childList.get(k)));
+                                               insertData.add(insertRowData);
+                                       }
+                               } catch (ArrayIndexOutOfBoundsException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+                       if (insertData.size() > 0) {
+                               profilingChildDataTable.insertData(insertData);
+                       }
+               }
        }
 
        @Override
        protected void makeData(LogPackage pack) {
-               if (SAMPLE_TIME < 0) {
+               // TODO: will get sample_time from Project.java
+               if (!isSetSamplePeriod) {
                        SAMPLE_TIME = ConfigurationDialogDataManager
                                        .getInstance()
                                        .getfeatureValue(
                                                        ConfigureLabels.FUNCTION_PROFILING_SAMPLING_PERIODIC);
+                       isSetSamplePeriod = true;                       
                }
 
                if (ConfigurationDialogDataManager.getInstance() // sampling is on
@@ -114,9 +235,11 @@ public class FunctionUsageProfiler extends PageDataManager {
                                                ConfigureLabels.FEATURE_FUNCTION_PROFILING) != 0) {
                        Logs logs = pack.getLogs(DataChannelConstants.MSG_DATA_SAMPLE);
                        if (null != logs && logs.getRawLogs().size() != 0) {
+                               List<List<Object>> insertData = new ArrayList<List<Object>>();                          
                                List<LogData> sample = logs.getLogs();
                                int size = sample.size();
                                for (int i = 0; i < size; i++) {
+                                       List<Object> insertRowData = new ArrayList<Object>();                                   
                                        ProfileData sampleLog = (ProfileData) sample.get(i);
                                        getInstance().getProfileDataMakerByPid(
                                                        sample.get(i).getPid())
@@ -143,6 +266,22 @@ public class FunctionUsageProfiler extends PageDataManager {
                                                        itr.remove();
                                                }
                                        }
+                                       // save to DB
+                                       try {
+                                               insertRowData.add(new Long(sampleLog.getSeq()));
+                                               insertRowData.add(new Long(sampleLog.getTime()));
+                                               insertRowData.add(new Integer(sampleLog.getPid()));
+                                               insertRowData.add(new Integer(sampleLog.getTid()));
+                                               insertRowData.add(new Long(sampleLog.getPcAddr()));
+                                               Integer cpuNum = new Integer(sampleLog.getCpuNum());
+                                               insertRowData.add(new Byte(cpuNum.byteValue()));
+                                       } catch (ArrayIndexOutOfBoundsException e) {
+                                               e.printStackTrace();
+                                       }
+                                       insertData.add(insertRowData);
+                               }
+                               if (insertData.size() > 0) {
+                                       functionSampleTable.insertData(insertData);
                                }
                        }
                } else { // sampling is off, callstackdata is not needed in memory
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingChildDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingChildDataDBTable.java
new file mode 100644 (file)
index 0000000..4298edc
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.profiling;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class ProfilingChildDataDBTable extends DBTable {
+       private static final String TABLENAME="ProfilingChildData";
+       // TODO: use Array type of DB
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),            
+               PID(1, "PID"),          
+               CHILDSEQ(2, "CHILD_SEQNUMBER");         
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public ProfilingChildDataDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));                
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CHILDSEQ.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               }
+
+       public List<List<Object>> getProfilingChildDataFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.SEQ.index + 1, (Integer) (rowData.get(COLUMN.SEQ.index)));                           
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.CHILDSEQ.index + 1, (Integer) (rowData.get(COLUMN.CHILDSEQ.index)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index b1d21f1..1acdb46 100644 (file)
@@ -3,9 +3,9 @@
  *
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
- * Contact: 
+ * Contact:
+ * WooJin Jung <woojin2.jung@samsung.com> 
  * Jooyoul Lee <jy.exe.lee@samsung.com>
- * WooJin Jung <woojin2.jung@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -30,7 +30,6 @@ package org.tizen.dynamicanalyzer.ui.summary.profiling;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
 
 public class ProfilingData {
@@ -46,6 +45,11 @@ public class ProfilingData {
        public static final int INCL_ELAPSED_TIME_INDEX = 8;
        public static final int EXCL_ELAPSED_TIME_INDEX = 9;
 
+       public static final byte TYPE_APPLICATION = 0;
+       public static final byte TYPE_DEPENDENTLIBRARY = 1;
+       public static final byte TYPE_FUNCTION = 2;
+       public static final byte TYPE_LIBRARY = 3;
+       
        private static int internalSeq = 0;
        private int seq = -1;
        private String name = null;
@@ -85,48 +89,18 @@ public class ProfilingData {
        }
 
        /** using open trace **/
-       public ProfilingData(List<String> input, ProfileDataMaker profiler) {
-               if (input.size() < DATA_FIELD_SIZE) {
-                       return;
-               }
-               seq = Integer.parseInt(input.get(SEQUENCE_INDEX));
-               name = input.get(NAME_INDEX);
-               exCount = Integer.parseInt(input.get(EXCOUNT_INDEX));
-               inCount = Integer.parseInt(input.get(INCOUNT_INDEX));
-               callCount = Integer.parseInt(input.get(CALLCOUNT_INDEX));
-               parent = input.get(PARENT_INDEX);
-               key = input.get(KEY_INDEX);
-               if (!input.get(INCL_ELAPSED_TIME_INDEX).isEmpty()) {
-                       inElapsedTime = Integer
-                                       .parseInt(input.get(INCL_ELAPSED_TIME_INDEX));
-               }
-               if (!input.get(EXCL_ELAPSED_TIME_INDEX).isEmpty()) {
-                       exElapsedTime = Integer
-                                       .parseInt(input.get(EXCL_ELAPSED_TIME_INDEX));
-               }
-
+       public ProfilingData(int seq, String name, int exCount, int inCount, int callCount,
+                       long inElapsedTime, long exElapsedTime, ProfileDataMaker profiler) {
+               this.seq = seq;
+               this.name = name;
+               this.exCount = exCount;
+               this.inCount = inCount;
+               this.callCount = callCount;
+               this.inElapsedTime = inElapsedTime;
+               this.exElapsedTime = exElapsedTime;
                this.profiler = profiler;
        }
 
-       /** using save trace **/
-       public List<String> getSaveData() {
-               List<String> output = new ArrayList<String>();
-               for (int i = 0; i < DATA_FIELD_SIZE; i++) {
-                       output.add(CommonConstants.EMPTY);
-               }
-               output.set(SEQUENCE_INDEX, Integer.toString(seq));
-               output.set(PID_INDEX, Integer.toString(profiler.getPid()));
-               output.set(NAME_INDEX, name);
-               output.set(EXCOUNT_INDEX, Integer.toString(exCount));
-               output.set(INCOUNT_INDEX, Integer.toString(inCount));
-               output.set(CALLCOUNT_INDEX, Integer.toString(callCount));
-               output.set(PARENT_INDEX, parent);
-               output.set(KEY_INDEX, key);
-               output.set(INCL_ELAPSED_TIME_INDEX, Long.toString(inElapsedTime));
-               output.set(EXCL_ELAPSED_TIME_INDEX, Long.toString(exElapsedTime));
-               return output;
-       }
-
        public void addChild(ProfilingData child) {
                int seq = child.getSequence();
                getChildData().getChildren().add(seq);
@@ -177,7 +151,11 @@ public class ProfilingData {
                }
                return exCount + count;
        }
-
+       // self ex count should be saved to DB
+       public int getSelfExCount() {
+               return exCount;
+       }
+       
        public void addExCount() {
                exCount++;
        }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingDataDBTable.java
new file mode 100644 (file)
index 0000000..f110874
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.profiling;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class ProfilingDataDBTable extends DBTable {
+       private static final String TABLENAME="ProfilingData";
+       
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               TYPE(1, "Type"),
+               FUNCTIONNAME(2, "FunctionName"),
+               BINARYPATH(3, "BinaryPath"),
+               PID(4, "PID"),
+               EXCOUNT(5, "ExCount"),
+               INCOUNT(6, "InCount"),
+               CALLCOUNT(7, "CallCount"),
+               INCLEXETIME(8, "InclExeTime"),
+               EXCLEXETIME(9, "ExclExeTime");
+                               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public ProfilingDataDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_INT4));             
+               addColumn(new DBColumn(COLUMN.TYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.FUNCTIONNAME.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FUNCTION_NAME_LENGTH));
+               addColumn(new DBColumn(COLUMN.BINARYPATH.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FILEPATH_LENGTH));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.EXCOUNT.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.INCOUNT.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CALLCOUNT.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.INCLEXETIME.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.EXCLEXETIME.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+       }
+
+       public List<List<Object>> getProfilingDataFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.SEQ.index + 1, (Integer) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setByte(COLUMN.TYPE.index + 1, (Byte) (rowData.get(COLUMN.TYPE.index)));
+
+                               String functionStr = clipString((String) (rowData.get(COLUMN.FUNCTIONNAME.index)),
+                                               DALimit.FUNCTION_NAME_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.FUNCTIONNAME.index + 1, functionStr);
+                               
+                               String pathStr = clipString((String) (rowData.get(COLUMN.BINARYPATH.index)),
+                                               DALimit.FILEPATH_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.BINARYPATH.index + 1, pathStr);
+
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.EXCOUNT.index + 1, (Integer) (rowData.get(COLUMN.EXCOUNT.index)));
+                               prep.setInt(COLUMN.INCOUNT.index + 1, (Integer) (rowData.get(COLUMN.INCOUNT.index)));
+                               prep.setInt(COLUMN.CALLCOUNT.index + 1, (Integer) (rowData.get(COLUMN.CALLCOUNT.index)));
+                               prep.setLong(COLUMN.INCLEXETIME.index + 1, (Long) (rowData.get(COLUMN.INCLEXETIME.index)));
+                               prep.setLong(COLUMN.EXCLEXETIME.index + 1, (Long) (rowData.get(COLUMN.EXCLEXETIME.index)));                             
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index 65129b2..07a54e3 100644 (file)
@@ -36,6 +36,7 @@ import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
 import org.tizen.dynamicanalyzer.shortcut.ShortCutManager;
 import org.tizen.dynamicanalyzer.swap.logparser.DataManagerRegistry;
 import org.tizen.dynamicanalyzer.ui.page.ScreenshotTabComposite;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.CallTraceDataManager;
 import org.tizen.dynamicanalyzer.ui.timeline.calltrace.CallTraceView;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineChartManager;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineView;
@@ -86,7 +87,7 @@ public class TimelinePage extends DAPageComposite {
                
                DataManagerRegistry.registerPageDataManager(TimelineChartManager.getInstance());
                DataManagerRegistry.registerPageDataManager(ReplayDataManager.getInstance());
-               
+               DataManagerRegistry.registerPageDataManager(CallTraceDataManager.getInstance());                
        }
 
        @Override
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceDataManager.java
new file mode 100644 (file)
index 0000000..8a472fa
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.timeline.calltrace;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
+import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
+import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
+import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
+import org.tizen.dynamicanalyzer.swap.logparser.Logs;
+import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
+
+public class CallTraceDataManager extends PageDataManager {
+       
+       private static CallTraceDataManager instance = null;
+
+       private FunctionEntryDBTable functionEntryTable = null;
+       private FunctionExitDBTable functionExitTable = null;   
+       
+       private CallTraceDataManager() {
+               functionEntryTable = new FunctionEntryDBTable();
+               addDBTable(functionEntryTable);
+               functionExitTable = new FunctionExitDBTable();
+               addDBTable(functionExitTable);
+       }
+       
+       public FunctionEntryDBTable getFunctionEntryTable() {
+               return functionEntryTable;
+       }
+       
+       public FunctionExitDBTable getFunctionExitTable() {
+               return functionExitTable;
+       }
+       
+       public synchronized static CallTraceDataManager getInstance() {
+               if (null == instance) {
+                       instance = new CallTraceDataManager();
+               }
+               return instance;
+       }
+
+       public void clear() {
+               // nothing to do
+       }
+
+       @Override
+       protected void makeData(LogPackage pack) {
+               Logs entryLogs = pack.getLogs(DataChannelConstants.MSG_FUNCTION_ENTRY);
+               if (null != entryLogs && entryLogs.getRawLogs().size() != 0) {
+                       List<LogData> inputs = entryLogs.getLogs();
+                       List<List<Object>> insertData = new ArrayList<List<Object>>();                  
+                       int size = inputs.size();
+                       for (int i = 0; i < size; i++) {
+                               List<Object> insertRowData = new ArrayList<Object>();
+                               ProfileData pData = (ProfileData) inputs.get(i);
+                               
+                               try {
+                                       insertRowData.add(new Long(pData.getSeq()));
+                                       insertRowData.add(new Integer(pData.getPid()));
+                                       insertRowData.add(new Integer(pData.getTid()));
+                                       Integer type = new Integer(pData.getProbeType());
+                                       insertRowData.add(new Byte(type.byteValue()));
+                                       insertRowData.add(new String(pData.getApiName()));
+                                       insertRowData.add(new String(pData.getLibName()));
+                                       insertRowData.add(new Long(pData.getTime()));
+                                       insertRowData.add(new Long(pData.getCallerPcAddr()));
+                                       insertRowData.add(new Long(pData.getPcAddr()));
+                                       insertRowData.add(new String(pData.getArgs()));
+                               } catch (ArrayIndexOutOfBoundsException e) {
+                                       e.printStackTrace();
+                               }
+                               insertData.add(insertRowData);
+                               // for calltrace table windowing
+                               ProcessInfoPackage processInfoPkg = AnalyzerManager.getProject()
+                                               .getProcessInfoPackage(pData.getPid());
+                               processInfoPkg.addFunctionEntryInsertLogCount();
+                       }
+                       if (insertData.size() > 0) {
+                               functionEntryTable.insertData(insertData);
+                       }
+               }
+               
+               Logs exitLogs = pack.getLogs(DataChannelConstants.MSG_FUNCTION_EXIT);
+               if (null != exitLogs && exitLogs.getRawLogs().size() != 0) {
+                       List<LogData> inputs = exitLogs.getLogs();
+                       List<List<Object>> insertData = new ArrayList<List<Object>>();                  
+                       int size = inputs.size();
+                       for (int i = 0; i < size; i++) {
+                               List<Object> insertRowData = new ArrayList<Object>();                           
+                               ProfileData pData = (ProfileData) inputs.get(i);
+
+                               try {
+                                       insertRowData.add(new Long(pData.getEntrySeq()));
+                                       insertRowData.add(new Long(pData.getSeq()));                                    
+                                       insertRowData.add(new Long(pData.getTime()));
+                                       insertRowData.add(new String(pData.getReturn()));
+                               } catch (ArrayIndexOutOfBoundsException e) {
+                                       e.printStackTrace();
+                               }
+                               insertData.add(insertRowData);
+                       }
+                       if (insertData.size() > 0) {
+                               functionExitTable.insertData(insertData);
+                       }
+               }
+       }
+}
index a065ccd..c2127af 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com> 
  * Jooyoul Lee <jy.exe.lee@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -42,13 +43,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.model.TableInput;
-import org.tizen.dynamicanalyzer.sql.DBTableManager;
-import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
 import org.tizen.dynamicanalyzer.swap.channel.data.ProcessInfoPackage;
-import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory;
-import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
-import org.tizen.dynamicanalyzer.swap.model.data.UserFunctionData;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
 import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
@@ -62,6 +57,7 @@ public class CallTraceTable extends DAWindowingTableComposite {
        
        public CallTraceTable(Composite parent, int compStyle, int tableStyle) {
                super(parent, compStyle, tableStyle);
+               setDataType(false, 0); // use new DB
                setContextMenu(AnalyzerConstants.CONTEXT_TABLE_SOURCE | AnalyzerConstants.CONTEXT_TABLE_RANGE);
 
                table.addSelectionListener(new SelectionListener() {
@@ -73,12 +69,10 @@ public class CallTraceTable extends DAWindowingTableComposite {
                                        return;
                                }
                                int size = ti.length;
-                               LogData startData = ((DATableDataFormat) ti[0].getData())
-                                               .getLogData();
-                               LogData endData = ((DATableDataFormat) ti[size - 1].getData())
-                                               .getLogData();
-                               long startTime = startData.getTime();
-                               long endTime = endData.getTime();
+                               List<Object> startData = ((DATableDataFormat) ti[0].getData()).getData();
+                               List<Object> endData = ((DATableDataFormat) ti[size - 1].getData()).getData();
+                               long startTime = (Long) startData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
+                               long endTime = (Long) endData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
 
                                DASelectionData data = new DASelectionData(
                                                TimelinePage.calltraceViewID, startTime, endTime, ti,
@@ -95,41 +89,29 @@ public class CallTraceTable extends DAWindowingTableComposite {
 
        @Override
        protected List<TableInput> makeTableInput() {
-               List<LogData> userLog = getQueriedLogData();
+               List<List<Object>> queriedData = getQueriedObjectData();
                List<TableInput> input = new ArrayList<TableInput>();
-               int size = userLog.size();
+               int size = queriedData.size();
                for (int i = 0; i < size; i++) {
-                       LogData logData = userLog.get(i);
+                       List<Object> rowData = queriedData.get(i);
                        List<String> text = new ArrayList<String>();
-                       if (logData instanceof UserFunctionData) {
-                               // create text
-                               UserFunctionData data = (UserFunctionData) logData;
-                               String time = Formatter.toTimeFormat(data.getTime());
-                               text.add(time);
-                               text.add(Integer.toString(data.getTid()));
-                               text.add(Integer.toString(data.getPid()));
-                               text.add(data.getApiName());
-                               text.add(data.getArgs());
-                               text.add(data.getReturn());
-                               text.add(data.getLibName());
-                       } else if (logData instanceof ProfileData) {
-                               ProfileData data = (ProfileData) logData;
-                               String time = Formatter.toTimeFormat(data.getTime());
-                               text.add(time);
-                               text.add(Integer.toString(data.getTid()));
-                               text.add(Integer.toString(data.getPid()));
-                               text.add(data.getApiName());
-                               text.add(data.getArgs());
-                               text.add(data.getReturn());
-                               text.add(data.getLibName());
-                       } else {
-                               DA_LOG.debug("wrong log data in calltrace view");
-                               continue;
-                       }
+
+                       long time = (Long) rowData.get(FunctionEntryDBTable.COLUMN.STARTTIME.index);
+                       String strTime = Formatter.toTimeFormat(time);
+                       text.add(strTime);
+                       text.add(rowData.get(FunctionEntryDBTable.COLUMN.TID.index).toString());
+                       text.add(rowData.get(FunctionEntryDBTable.COLUMN.PID.index).toString());
+                       text.add(rowData.get(FunctionEntryDBTable.COLUMN.FUNCTIONNAME.index).toString());
+                       text.add(rowData.get(FunctionEntryDBTable.COLUMN.ARGUMENT.index).toString());
+                       // TODO: ret value
+                       text.add("");
+                       text.add(rowData.get(FunctionEntryDBTable.COLUMN.BINARYPATH.index).toString());
+                       
                        // create DATableDataFormat
                        DATableDataFormat tableData = new DATableDataFormat(
-                                       logData.getSeq());
-                       tableData.setLogData(logData);
+                                       (Long) rowData.get(FunctionEntryDBTable.COLUMN.SEQ.index));
+//                     tableData.setLogData(logData);
+                       tableData.getData().addAll(rowData);
                        tableData.setType(AnalyzerConstants.TYPE_TABLE_CALLTRACE);
 
                        TableInput tableInput = new TableInput();
@@ -138,28 +120,26 @@ public class CallTraceTable extends DAWindowingTableComposite {
                        input.add(tableInput);
 
                        if (RangeDataManager.getInstance().isBeingAnalyzed()) {
-                               long logTime = logData.getTime();
                                long analysisStartTime = RangeDataManager.getInstance()
                                                .getAnalysisStartTime();
                                long analysisEndTime = RangeDataManager.getInstance()
                                                .getAnalysisEndTime();
-                               if (logTime >= analysisStartTime && logTime <= analysisEndTime) {
+                               if (time >= analysisStartTime && time <= analysisEndTime) {
                                        tableInput.setInRange(true);
                                }
                        }
-
                }
                return input;
        }
 
        protected String getDBTableName() {
-               return LogDataFactory.getLogFormatById(
-                               DataChannelConstants.MSG_FUNCTION_ENTRY).getName();
+               return CallTraceDataManager.getInstance().getFunctionEntryTable().getTableName();
        }
 
        protected List<String> getDBTableColumnNames() {
-               return LogDataFactory.getLogFormatById(
-                               DataChannelConstants.MSG_FUNCTION_ENTRY).getDBColumnNames();
+               List<String> columnName = new ArrayList<String>();
+               columnName.add("*");
+               return columnName;
        }
 
        public int getItemCountByPid() {
@@ -188,19 +168,19 @@ public class CallTraceTable extends DAWindowingTableComposite {
        }
 
        protected String getSelectQueryOption() {
-               StringBuffer query = new StringBuffer(
-                               " messageid = " + DataChannelConstants.MSG_FUNCTION_ENTRY);//$NON-NLS-1$
+               StringBuffer query = new StringBuffer(" type = " 
+                               + AnalyzerConstants.FUNCTION_TYPE_APPINST);
                int selectedPid = ToolbarArea.getInstance().getSelectedPid();
                if (selectedPid != 0) {
                        query.append(" and pid =" + selectedPid);//$NON-NLS-1$
                }
-               query.append(" order by time");//$NON-NLS-1$
+               query.append(" order by " + FunctionEntryDBTable.COLUMN.STARTTIME.name);
                return query.toString();
        }
 
        protected String getSelectQueryCountOption() {
-               StringBuffer query = new StringBuffer(
-                               " messageid = " + DataChannelConstants.MSG_FUNCTION_ENTRY);//$NON-NLS-1$
+               StringBuffer query = new StringBuffer(" type = " 
+                               + AnalyzerConstants.FUNCTION_TYPE_APPINST);
                int selectedPid = ToolbarArea.getInstance().getSelectedPid();
                if (selectedPid != 0) {
                        query.append(" and pid =" + selectedPid);//$NON-NLS-1$
@@ -210,8 +190,6 @@ public class CallTraceTable extends DAWindowingTableComposite {
 
        @Override
        protected String getTimeColumnName() {
-               String timestr = DBTableManager.COMMON_COLUMN_TIME;
-               return timestr;
+               return FunctionEntryDBTable.COLUMN.STARTTIME.name;
        }
-
 }
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionEntryDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionEntryDBTable.java
new file mode 100644 (file)
index 0000000..455c1e1
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.timeline.calltrace;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class FunctionEntryDBTable extends DBTable {
+       private static final String TABLENAME="FunctionEntry";
+       
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               PID(1, "PID"),
+               TID(2, "TID"),
+               TYPE(3, "Type"),
+               FUNCTIONNAME(4, "FunctionName"),
+               BINARYPATH(5, "BinaryPath"),
+               STARTTIME(6, "StartTime"),
+               CALLERPCADDR(7, DBConstants.DBCOLUMN_CALLER_PC_ADDRESS),
+               PCADDR(8, "PcAddr"),
+               ARGUMENT(9, DBConstants.DBCOLUMN_ARGUMENT);
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public FunctionEntryDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.FUNCTIONNAME.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FUNCTION_NAME_LENGTH));
+               addColumn(new DBColumn(COLUMN.BINARYPATH.name, DBConstants.NOT_NULL, 
+                               DBConstants.VARCHAR, DALimit.FILEPATH_LENGTH));         
+               addColumn(new DBColumn(COLUMN.STARTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.CALLERPCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY, 
+                               DBConstants.VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+       }
+
+       public List<List<Object>> getFunctionEntryFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));                           
+                               prep.setByte(COLUMN.TYPE.index + 1, (Byte) (rowData.get(COLUMN.TYPE.index)));
+
+                               String functionStr = clipString((String) (rowData.get(COLUMN.FUNCTIONNAME.index)),
+                                               DALimit.FUNCTION_NAME_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.FUNCTIONNAME.index + 1, functionStr);
+                               
+                               String pathStr = clipString((String) (rowData.get(COLUMN.BINARYPATH.index)),
+                                               DALimit.FILEPATH_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.BINARYPATH.index + 1, pathStr);
+
+                               prep.setLong(COLUMN.STARTTIME.index + 1, (Long) (rowData.get(COLUMN.STARTTIME.index)));
+                               prep.setLong(COLUMN.CALLERPCADDR.index + 1, (Long) (rowData.get(COLUMN.CALLERPCADDR.index)));
+                               prep.setLong(COLUMN.PCADDR.index + 1, (Long) (rowData.get(COLUMN.PCADDR.index)));
+
+                               String argumentStr = clipString((String) (rowData.get(COLUMN.ARGUMENT.index)),
+                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.ARGUMENT.index + 1, argumentStr);                         
+                               
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionExitDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionExitDBTable.java
new file mode 100644 (file)
index 0000000..386fe62
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.timeline.calltrace;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+
+public class FunctionExitDBTable extends DBTable {
+       private static final String TABLENAME="FunctionExit";
+       public static final int FUNCTION_RETURN_VALUE_LENGTH = 1024;
+       
+       public enum COLUMN {
+               ENTRYSEQ(0, "EntrySEQNUMBER"),
+               EXITSEQ(1, "ExitSEQNUMBER"),
+               ENDTIME(2, "EndTime"),
+               RETURN(3, DBConstants.DBCOLUMN_RETURN_VALUE);
+                               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public FunctionExitDBTable() {
+               addColumn(new DBColumn(COLUMN.ENTRYSEQ.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));           
+               addColumn(new DBColumn(COLUMN.EXITSEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));         
+               addColumn(new DBColumn(COLUMN.ENDTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY, 
+                               DBConstants.DBTYPE_VARCHAR, FUNCTION_RETURN_VALUE_LENGTH));
+       }
+
+       public List<List<Object>> getFunctionExitFromDB() {
+               return selectData(null, CommonConstants.EMPTY);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.ENTRYSEQ.index + 1, (Long) (rowData.get(COLUMN.ENTRYSEQ.index)));
+                               prep.setLong(COLUMN.EXITSEQ.index + 1, (Long) (rowData.get(COLUMN.EXITSEQ.index)));
+                               prep.setLong(COLUMN.ENDTIME.index + 1, (Long) (rowData.get(COLUMN.ENDTIME.index)));
+
+                               String retStr = clipString((String) (rowData.get(COLUMN.RETURN.index)),
+                                               FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.RETURN.index).toString());
+                               prep.setString(COLUMN.RETURN.index + 1, retStr);
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+}
index 6daeed5..e46d73e 100644 (file)
@@ -37,6 +37,7 @@ import org.tizen.dynamicanalyzer.sql.SqlManager;
 import org.tizen.dynamicanalyzer.swap.logparser.SWAPLogParser;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter;
 import org.tizen.dynamicanalyzer.ui.page.UpdateViewTimer;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
 import org.tizen.dynamicanalyzer.util.DALogger;
 
 public class StopLogProcessor implements Runnable {
@@ -117,11 +118,9 @@ public class StopLogProcessor implements Runnable {
                        SqlManager.getInstance().insertProcessInfo();
                        SqlManager.getInstance().saveLeakData();
                        SqlManager.getInstance().saveFailedData();
-//                     SqlManager.getInstance().saveCallStackData();
-//                     SqlManager.getInstance().saveCallStackUnits();
                        CallStackInserter.getInstance().stopInserterThread();
-                       SqlManager.getInstance().saveProfilingData();
-                       SqlManager.getInstance().saveProfilingChildData();
+                       FunctionUsageProfiler.getInstance().saveProfilingData();
+                       FunctionUsageProfiler.getInstance().saveProfilingChildData();
                        SqlManager.getInstance().saveApiNames();
                        SqlManager.getInstance().closeConnection();
                        DA_LOG.debug("insert to db complete..."); //$NON-NLS-1$
index 0477893..ae385d6 100644 (file)
@@ -125,7 +125,8 @@ public class UIFunctionProfilingDataChecker {
                        pd.setInclEsapsedAvgTime(exeAvgTime);
                        pd.setExclEsapsedAvgTime(inExeAvgTime);
                        pd.setParent(input.getParent());
-                       pd.setCalssKeyName(getClassName(input.getSaveData())); // index 10;
+                       //TODO: ProfilingData.getSaveData is deprecated, below code must be fixed.
+//                     pd.setCalssKeyName(getClassName(input.getSaveData())); // index 10;
 
                        if (bUpdateData == true) {
                                getDataList().add(nChangedIndex, pd);