Skip to content

Commit 2ceadae

Browse files
author
yanqizhou
committed
add app info and key-values in user default
1 parent 93991cc commit 2ceadae

6 files changed

Lines changed: 344 additions & 54 deletions

File tree

DebugDatabase/DatabaseUtil.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@
2222
- (BOOL)updateRecordInDatabase:(NSString*)database tableName:(NSString*)tableName data:(NSDictionary*)data condition:(NSDictionary*)condition;
2323
- (BOOL)deleteRecordInDatabase:(NSString *)database tableName:(NSString *)tableName condition:(NSDictionary *)condition limit:(NSString *)limit;
2424
- (NSDictionary*)executeQueryInDatabase:(NSString*)database tableName:(NSString*)tableName operator:(NSString*)operator query:(NSString*)query;
25+
- (NSDictionary*)userDefaultData;
26+
- (NSDictionary*)getAppInfoData;
2527
@end

DebugDatabase/DatabaseUtil.m

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,107 @@ - (NSDictionary*)executeQueryInDatabase:(NSString*)database tableName:(NSString*
288288
}
289289
}
290290

291+
- (NSDictionary*)userDefaultData {
292+
293+
NSMutableDictionary *tableData = [NSMutableDictionary dictionary];
294+
[tableData safe_setObject:@(1) forKey:@"isSelectQuery"];
295+
[tableData safe_setObject:@(1) forKey:@"isSuccessful"];
296+
297+
NSMutableArray *tableInfoResult = [NSMutableArray array];
298+
[tableInfoResult safe_addObject:@{@"title": @"key", @"isPrimary" : @(1), @"dataType" : @"text"}];
299+
[tableInfoResult safe_addObject:@{@"title": @"value", @"isPrimary" : @(0), @"dataType" : @"text"}];
300+
301+
[tableData safe_setObject:tableInfoResult forKey:@"tableInfos"];
302+
303+
[tableData safe_setObject:@(NO) forKey:@"isEditable"];
304+
305+
NSMutableArray *rows = @[].mutableCopy;
306+
307+
NSDictionary *userData = [[NSUserDefaults standardUserDefaults]dictionaryRepresentation];
308+
309+
for (NSString *key in userData.allKeys) {
310+
NSMutableArray *row = @[].mutableCopy;
311+
312+
[row safe_addObject:@{@"dataType" : @"text", @"value" : key?key:@""}];
313+
314+
id value = [userData objectForKey:key];
315+
316+
if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]]) {
317+
[row safe_addObject:@{@"dataType" : @"text", @"value" : yy_dicGetStringSafe(userData, key)}];
318+
}else {
319+
[row safe_addObject:@{@"dataType" : @"text", @"value" : [value description]?:@""}];
320+
}
321+
322+
[rows addObject:row];
323+
}
324+
[tableData safe_setObject:rows forKey:@"rows"];
325+
326+
return tableData;
327+
}
328+
329+
- (NSDictionary*)getAppInfoData {
330+
NSMutableDictionary *tableData = [NSMutableDictionary dictionary];
331+
[tableData safe_setObject:@(1) forKey:@"isSelectQuery"];
332+
[tableData safe_setObject:@(1) forKey:@"isSuccessful"];
333+
334+
NSMutableArray *tableInfoResult = [NSMutableArray array];
335+
[tableInfoResult safe_addObject:@{@"title": @"property name", @"isPrimary" : @(1), @"dataType" : @"text"}];
336+
[tableInfoResult safe_addObject:@{@"title": @"property value", @"isPrimary" : @(0), @"dataType" : @"text"}];
337+
338+
[tableData safe_setObject:tableInfoResult forKey:@"tableInfos"];
339+
340+
[tableData safe_setObject:@(NO) forKey:@"isEditable"];
341+
342+
NSMutableArray *rows = @[].mutableCopy;
343+
344+
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
345+
//app name
346+
NSString *displayName = yy_dicGetStringSafe(infoDic, @"CFBundleDisplayName");
347+
NSMutableArray *displayRow = @[].mutableCopy;
348+
[displayRow safe_addObject:@{@"dataType": @"text", @"value": @"Display Name"}];
349+
[displayRow safe_addObject:@{@"dataType": @"text", @"value": displayName}];
350+
[rows safe_addObject:displayRow];
351+
352+
//app bundle identifier
353+
NSString *bundleIdentifer = yy_dicGetStringSafe(infoDic, kCFBundleIdentifierKey);
354+
NSMutableArray *bundleRow = @[].mutableCopy;
355+
[bundleRow safe_addObject:@{@"dataType": @"text", @"value": @"Bundle Identifer"}];
356+
[bundleRow safe_addObject:@{@"dataType": @"text", @"value": bundleIdentifer}];
357+
[rows safe_addObject:bundleRow];
358+
359+
//app version
360+
NSString *version = yy_dicGetStringSafe(infoDic, @"CFBundleShortVersionString");
361+
NSMutableArray *versionRow = @[].mutableCopy;
362+
[versionRow safe_addObject:@{@"dataType": @"text", @"value": @"Version"}];
363+
[versionRow safe_addObject:@{@"dataType": @"text", @"value": version}];
364+
[rows safe_addObject:versionRow];
365+
366+
//app build number
367+
NSString *build = yy_dicGetStringSafe(infoDic, kCFBundleVersionKey);
368+
NSMutableArray *buildRow = @[].mutableCopy;
369+
[buildRow safe_addObject:@{@"dataType": @"text", @"value": @"Build"}];
370+
[buildRow safe_addObject:@{@"dataType": @"text", @"value": build}];
371+
[rows safe_addObject:buildRow];
372+
373+
//document path
374+
NSArray *pathSearch = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
375+
NSString *documentsPath = [pathSearch objectAtIndex:0];
376+
NSMutableArray *documentRow = @[].mutableCopy;
377+
[documentRow safe_addObject:@{@"dataType": @"text", @"value": @"Documents"}];
378+
[documentRow safe_addObject:@{@"dataType": @"text", @"value": documentsPath?documentsPath:@""}];
379+
[rows safe_addObject:documentRow];
380+
381+
//cache path
382+
NSArray *pathSearchCache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
383+
NSString *cachePath = [pathSearchCache objectAtIndex:0];
384+
NSMutableArray *cacheRow = @[].mutableCopy;
385+
[cacheRow safe_addObject:@{@"dataType": @"text", @"value": @"Cache"}];
386+
[cacheRow safe_addObject:@{@"dataType": @"text", @"value": cachePath?cachePath:@""}];
387+
[rows safe_addObject:cacheRow];
388+
389+
[tableData safe_setObject:rows forKey:@"rows"];
390+
391+
return tableData;
392+
}
393+
291394
@end

DebugDatabase/DebugDatabaseManager.m

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
@interface DebugDatabaseManager ()<GCDAsyncSocketDelegate>
1818

1919
@property(nonatomic, strong) GCDAsyncSocket *webServer;
20+
@property(nonatomic, strong) GCDAsyncSocket *connectedSocket;
2021
@property(nonatomic, copy) NSString *host;
2122
@property(nonatomic, assign) NSInteger port;
2223
@property(nonatomic, strong) NSDictionary *databasePaths;
@@ -73,7 +74,7 @@ - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(nonnull NSString *)host
7374
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
7475
NSLog(@"didAcceptNewSocket");
7576
NSLog(@"newSocket %@ %zd", newSocket.localHost, newSocket.localPort);
76-
77+
_connectedSocket = newSocket;
7778
[newSocket readDataWithTimeout:-1 tag:0];
7879
}
7980

@@ -211,6 +212,19 @@ - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)t
211212
response.contentType = @"application/octet-stream";
212213
[sock writeData:response.contentData withTimeout:-1 tag:0];
213214
}
215+
else if ([url.path isEqualToString:@"/getUserDefault"]) {
216+
NSMutableDictionary *userData = [[DatabaseUtil shared] userDefaultData].mutableCopy;
217+
218+
[userData safe_setObject:@YES forKey:@"userDefault"];
219+
220+
DebugDatabaseResponse *response = [[DebugDatabaseResponse alloc] initWithHtmlData:[[self mapOrArrayTransformToJsonString:userData] dataUsingEncoding:NSUTF8StringEncoding] contentType:@"application/json"];
221+
[sock writeData:response.contentData withTimeout:-1 tag:0];
222+
}
223+
else if ([url.path isEqualToString:@"/getAppInfo"]) {
224+
NSDictionary *appInfo = [[DatabaseUtil shared] getAppInfoData];
225+
DebugDatabaseResponse *response = [[DebugDatabaseResponse alloc] initWithHtmlData:[[self mapOrArrayTransformToJsonString:appInfo] dataUsingEncoding:NSUTF8StringEncoding] contentType:@"application/json"];
226+
[sock writeData:response.contentData withTimeout:-1 tag:0];
227+
}
214228
//404 not found
215229
else {
216230
DebugDatabaseResponse *response = [[DebugDatabaseResponse alloc] initWithHtmlData:[@"404" dataUsingEncoding:NSUTF8StringEncoding]];

DebugDatabase/Web.bundle/app.js

Lines changed: 116 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
$( document ).ready(function() {
2-
getDBList();
32
$("#query").keypress(function(e){
43
if(e.which == 13) {
54
queryFunction();
@@ -152,32 +151,46 @@ function inflateData(result){
152151
$("#db-data-div").remove();
153152
$("#parent-data-div").append('<div id="db-data-div"><table class="display nowrap" cellpadding="0" border="0" cellspacing="0" width="100%" class="table table-striped table-bordered display" id="db-data"></table></div>');
154153

155-
$(tableId).dataTable({
156-
"data": columnData,
157-
"columnDefs": columnHeader,
158-
'bPaginate': true,
159-
'searching': true,
160-
'bFilter': true,
161-
'bInfo': true,
162-
"bSort" : true,
163-
"scrollX": true,
164-
"iDisplayLength": 10,
165-
"dom": "Bfrtip",
166-
select: 'single',
167-
altEditor: true, // Enable altEditor
168-
buttons: [
169-
{
170-
extend: 'selected', // Bind to Selected row
171-
text: 'Edit',
172-
name: 'edit' // do not change name
173-
},
174-
{
175-
extend: 'selected',
176-
text: 'Delete',
177-
name: 'delete'
178-
}
179-
]
180-
})
154+
if (result.userDefault) {
155+
$(tableId).dataTable({
156+
"data": columnData,
157+
"columnDefs": columnHeader,
158+
'bPaginate': true,
159+
'searching': true,
160+
'bFilter': true,
161+
'bInfo': true,
162+
"bSort" : true,
163+
"scrollX": true,
164+
"iDisplayLength": 10
165+
})
166+
}else {
167+
$(tableId).dataTable({
168+
"data": columnData,
169+
"columnDefs": columnHeader,
170+
'bPaginate': true,
171+
'searching': true,
172+
'bFilter': true,
173+
'bInfo': true,
174+
"bSort" : true,
175+
"scrollX": true,
176+
"iDisplayLength": 10,
177+
"dom": "Bfrtip",
178+
select: 'single',
179+
altEditor: true, // Enable altEditor
180+
buttons: [
181+
{
182+
extend: 'selected', // Bind to Selected row
183+
text: 'Edit',
184+
name: 'edit' // do not change name
185+
},
186+
{
187+
extend: 'selected',
188+
text: 'Delete',
189+
name: 'delete'
190+
}
191+
]
192+
})
193+
}
181194

182195
//attach row-updated listener
183196
$(tableId).on('update-row.dt', function (e, updatedRowData, callback) {
@@ -228,6 +241,69 @@ function inflateData(result){
228241

229242
}
230243

244+
function inflateAppInfoData(result){
245+
246+
if(result.isSuccessful){
247+
248+
if(!result.isSelectQuery){
249+
showSuccessInfo("Query Executed Successfully");
250+
return;
251+
}
252+
253+
var columnHeader = result.tableInfos;
254+
255+
// set function to return cell data for different usages like set, display, filter, search etc..
256+
for(var i = 0; i < columnHeader.length; i++) {
257+
columnHeader[i]['targets'] = i;
258+
columnHeader[i]['data'] = function(row, type, val, meta) {
259+
var dataType = row[meta.col].dataType;
260+
if (type == "sort" && dataType == "boolean") {
261+
return row[meta.col].value ? 1 : 0;
262+
}
263+
return row[meta.col].value;
264+
}
265+
}
266+
var columnData = result.rows;
267+
var tableId = "#db-appinfo";
268+
if ($.fn.DataTable.isDataTable(tableId) ) {
269+
$(tableId).DataTable().destroy();
270+
}
271+
272+
$("#db-appinfo-div").remove();
273+
$("#parent-appinfo-div").append('<div id="db-appinfo-div"><table class="display nowrap" cellpadding="0" border="0" cellspacing="0" width="100%" class="table table-striped table-bordered display hide-column-names" id="db-appinfo"></table></div>');
274+
275+
$(tableId).dataTable({
276+
"data": columnData,
277+
"columnDefs": columnHeader,
278+
'bPaginate': false,
279+
'searching': false,
280+
'bFilter': false,
281+
'bInfo': false,
282+
"bSort" : false,
283+
"scrollX": true,
284+
"iDisplayLength": 99,
285+
"fnDrawCallback": function (oSettings) {
286+
$(oSettings.nTHead).hide();
287+
}
288+
})
289+
290+
// hack to fix alignment issue when scrollX is enabled
291+
$(".dataTables_scrollHeadInner").css({"width":"100%"});
292+
$(".table ").css({"width":"100%"});
293+
}else{
294+
if(!result.isSelectQuery){
295+
showErrorInfo("Query Execution Failed");
296+
}else {
297+
if(result.errorMessage){
298+
showErrorInfo(result.errorMessage);
299+
}else{
300+
showErrorInfo("Some Error Occurred");
301+
}
302+
}
303+
}
304+
305+
}
306+
231307
//send update database request to server
232308
function updateTableData(updatedData, callback) {
233309
//get currently selected element
@@ -329,3 +405,16 @@ function showErrorInfo(message){
329405
snackbarElement.removeClass("show");
330406
}, 3000);
331407
}
408+
409+
function getUserDefault() {
410+
$.ajax({url: "getUserDefault", success: function(result){
411+
inflateData(result);
412+
}});
413+
}
414+
415+
function getAppInfo() {
416+
$.ajax({url: "getAppInfo", success: function(result){
417+
inflateAppInfoData(result);
418+
getUserDefault();
419+
}});
420+
}

0 commit comments

Comments
 (0)