Skip to content

Commit beba77e

Browse files
committed
Merge pull request #160 from fefe982/develop
Fixed some db resource leaks
2 parents b469900 + f6ae910 commit beba77e

4 files changed

Lines changed: 128 additions & 71 deletions

File tree

app/src/org/gnucash/android/db/AccountsDbAdapter.java

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,13 @@ public long getAccountID(String uid){
269269
new String[] {DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_UID},
270270
DatabaseHelper.KEY_UID + " = '" + uid + "'", null, null, null, null);
271271
long result = -1;
272-
if (cursor != null && cursor.moveToFirst()){
273-
Log.v(TAG, "Returning account id");
274-
result = cursor.getLong(DatabaseAdapter.COLUMN_ROW_ID);
275-
276-
cursor.close();
277-
}
272+
if (cursor != null) {
273+
if (cursor.moveToFirst()) {
274+
Log.v(TAG, "Returning account id");
275+
result = cursor.getLong(DatabaseAdapter.COLUMN_ROW_ID);
276+
}
277+
cursor.close();
278+
}
278279
return result;
279280
}
280281

@@ -291,12 +292,13 @@ public String getParentAccountUID(String uid){
291292
new String[]{uid},
292293
null, null, null, null);
293294
String result = null;
294-
if (cursor != null && cursor.moveToFirst()){
295-
Log.d(TAG, "Account already exists. Returning existing id");
296-
result = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_PARENT_ACCOUNT_UID));
297-
298-
cursor.close();
299-
}
295+
if (cursor != null) {
296+
if (cursor.moveToFirst()) {
297+
Log.d(TAG, "Account already exists. Returning existing id");
298+
result = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_PARENT_ACCOUNT_UID));
299+
}
300+
cursor.close();
301+
}
300302
return result;
301303
}
302304

@@ -320,10 +322,12 @@ public Account getAccount(long rowId){
320322
Account account = null;
321323
Log.v(TAG, "Fetching account with id " + rowId);
322324
Cursor c = fetchRecord(DatabaseHelper.ACCOUNTS_TABLE_NAME, rowId);
323-
if (c != null && c.moveToFirst()){
324-
account = buildAccountInstance(c);
325-
c.close();
326-
}
325+
if (c != null) {
326+
if (c.moveToFirst()) {
327+
account = buildAccountInstance(c);
328+
}
329+
c.close();
330+
}
327331
return account;
328332
}
329333

@@ -348,10 +352,12 @@ public String getAccountUID(long id){
348352
new String[]{DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_UID},
349353
DatabaseHelper.KEY_ROW_ID + "=" + id,
350354
null, null, null, null);
351-
if (c != null && c.moveToFirst()){
352-
uid = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_UID));
353-
c.close();
354-
}
355+
if (c != null) {
356+
if (c.moveToFirst()) {
357+
uid = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_UID));
358+
}
359+
c.close();
360+
}
355361
return uid;
356362
}
357363

@@ -366,8 +372,10 @@ public String getAccountColorCode(long accountId){
366372
new String[]{DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_COLOR_CODE},
367373
DatabaseHelper.KEY_ROW_ID + "=" + accountId,
368374
null, null, null, null);
369-
if (c != null && c.moveToFirst()){
370-
colorCode = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_COLOR_CODE));
375+
if (c != null) {
376+
if (c.moveToFirst()) {
377+
colorCode = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_COLOR_CODE));
378+
}
371379
c.close();
372380
}
373381
return colorCode;
@@ -399,10 +407,12 @@ public AccountType getAccountType(long accountId){
399407
public String getName(long accountID) {
400408
String name = null;
401409
Cursor c = fetchRecord(DatabaseHelper.ACCOUNTS_TABLE_NAME, accountID);
402-
if (c != null && c.moveToFirst()){
403-
name = c.getString(DatabaseAdapter.COLUMN_NAME);
404-
c.close();
405-
}
410+
if (c != null) {
411+
if (c.moveToFirst()) {
412+
name = c.getString(DatabaseAdapter.COLUMN_NAME);
413+
}
414+
c.close();
415+
}
406416
return name;
407417
}
408418

@@ -699,10 +709,12 @@ public long getId(String accountUID){
699709
new String[]{DatabaseHelper.KEY_ROW_ID, DatabaseHelper.KEY_UID},
700710
DatabaseHelper.KEY_UID + "='" + accountUID + "'",
701711
null, null, null, null);
702-
if (c != null && c.moveToFirst()){
703-
id = c.getLong(DatabaseAdapter.COLUMN_ROW_ID);
704-
c.close();
705-
}
712+
if (c != null) {
713+
if (c.moveToFirst()) {
714+
id = c.getLong(DatabaseAdapter.COLUMN_ROW_ID);
715+
}
716+
c.close();
717+
}
706718
return id;
707719
}
708720

@@ -740,7 +752,10 @@ public String getAccountName(String accountUID){
740752
DatabaseHelper.KEY_UID + " = ?",
741753
new String[]{accountUID}, null, null, null);
742754

743-
if (cursor == null || cursor.getCount() < 1){
755+
if (cursor == null) {
756+
return null;
757+
} else if ( cursor.getCount() < 1) {
758+
cursor.close();
744759
return null;
745760
} else { //account UIDs should be unique
746761
cursor.moveToFirst();
@@ -763,7 +778,10 @@ public long getDefaultTransferAccountID(long accountID){
763778
DatabaseHelper.KEY_ROW_ID + " = " + accountID,
764779
null, null, null, null);
765780

766-
if (cursor == null || cursor.getCount() < 1){
781+
if (cursor == null) {
782+
return 0;
783+
} else if (cursor.getCount() < 1) {
784+
cursor.close();
767785
return 0;
768786
} else {
769787
cursor.moveToFirst();
@@ -818,7 +836,10 @@ public boolean isPlaceholderAccount(String accountUID){
818836
DatabaseHelper.KEY_UID + " = ?",
819837
new String[]{accountUID}, null, null, null);
820838

821-
if (cursor == null || !cursor.moveToFirst()){
839+
if (cursor == null)
840+
return false;
841+
if (!cursor.moveToFirst()) {
842+
cursor.close();
822843
return false;
823844
}
824845
boolean isPlaceholder = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_PLACEHOLDER)) == 1;
@@ -847,7 +868,10 @@ public boolean isFavoriteAccount(long accountId){
847868
DatabaseHelper.KEY_ROW_ID + " = " + accountId, null,
848869
null, null, null);
849870

850-
if (cursor == null || !cursor.moveToFirst()){
871+
if (cursor == null)
872+
return false;
873+
if (!cursor.moveToFirst()){
874+
cursor.close();
851875
return false;
852876
}
853877
boolean isFavorite = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.KEY_FAVORITE)) == 1;

app/src/org/gnucash/android/db/TransactionsDbAdapter.java

Lines changed: 57 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,13 @@ public long fetchTransactionWithUID(String uid){
9292
DatabaseHelper.KEY_UID + " = '" + uid + "'",
9393
null, null, null, null);
9494
long result = -1;
95-
if (cursor != null && cursor.moveToFirst()){
96-
Log.d(TAG, "Transaction already exists. Returning existing id");
97-
result = cursor.getLong(0); //0 because only one row was requested
98-
99-
cursor.close();
100-
}
95+
if (cursor != null) {
96+
if (cursor.moveToFirst()) {
97+
Log.d(TAG, "Transaction already exists. Returning existing id");
98+
result = cursor.getLong(0); //0 because only one row was requested
99+
}
100+
cursor.close();
101+
}
101102
return result;
102103
}
103104

@@ -113,10 +114,12 @@ public Transaction getTransaction(long rowId){
113114
Log.v(TAG, "Fetching transaction with id " + rowId);
114115
Transaction transaction = null;
115116
Cursor c = fetchRecord(DatabaseHelper.TRANSACTIONS_TABLE_NAME, rowId);
116-
if (c != null && c.moveToFirst()){
117-
transaction = buildTransactionInstance(c);
118-
c.close();
119-
}
117+
if (c != null) {
118+
if (c.moveToFirst()) {
119+
transaction = buildTransactionInstance(c);
120+
}
121+
c.close();
122+
}
120123
return transaction;
121124
}
122125

@@ -173,9 +176,12 @@ public Cursor fetchAllTransactionsForAccount(long accountID){
173176
public List<Transaction> getAllTransactionsForAccount(String accountUID){
174177
Cursor c = fetchAllTransactionsForAccount(accountUID);
175178
ArrayList<Transaction> transactionsList = new ArrayList<Transaction>();
176-
177-
if (c == null || (c.getCount() <= 0))
179+
if (c == null)
178180
return transactionsList;
181+
if (c.getCount() <= 0) {
182+
c.close();
183+
return transactionsList;
184+
}
179185

180186
while (c.moveToNext()) {
181187
Transaction transaction = buildTransactionInstance(c);
@@ -235,8 +241,12 @@ public String getCurrencyCode(String accountUID) {
235241
DatabaseHelper.KEY_UID + "= '" + accountUID + "'",
236242
null, null, null, null);
237243

238-
if (cursor == null || cursor.getCount() <= 0)
244+
if (cursor == null)
239245
return null;
246+
if (cursor.getCount() <= 0) {
247+
cursor.close();
248+
return null;
249+
}
240250

241251
cursor.moveToFirst();
242252
String currencyCode = cursor.getString(0);
@@ -338,7 +348,7 @@ public long getAllTransactionsCount(){
338348
* @param accountId Record ID of the account
339349
* @return Sum of transactions belonging to the account
340350
*/
341-
public Money getTransactionsSum(long accountId){
351+
public Money getTransactionsSum(long accountId) {
342352
//FIXME: Properly compute the balance while considering normal account balance
343353
String accountUID = getAccountUID(accountId);
344354

@@ -350,8 +360,10 @@ public Money getTransactionsSum(long accountId){
350360
Cursor sumCursor = mDb.rawQuery(querySum, new String[]{accountUID});
351361
double sum = 0d;
352362

353-
if (sumCursor != null && sumCursor.moveToFirst()){
354-
sum += sumCursor.getFloat(0);
363+
if (sumCursor != null) {
364+
if (sumCursor.moveToFirst()) {
365+
sum += sumCursor.getFloat(0);
366+
}
355367
sumCursor.close();
356368
}
357369

@@ -362,8 +374,10 @@ public Money getTransactionsSum(long accountId){
362374

363375
sumCursor = mDb.rawQuery(querySum, new String[]{accountUID});
364376

365-
if (sumCursor != null && sumCursor.moveToFirst()){
366-
sum -= sumCursor.getFloat(0);
377+
if (sumCursor != null) {
378+
if (sumCursor.moveToFirst()) {
379+
sum -= sumCursor.getFloat(0);
380+
}
367381
sumCursor.close();
368382
}
369383

@@ -393,8 +407,10 @@ public Account.AccountType getAccountType(String accountUID){
393407
new String[]{DatabaseHelper.KEY_TYPE},
394408
DatabaseHelper.KEY_UID + "='" + accountUID + "'",
395409
null, null, null, null);
396-
if (c != null && c.moveToFirst()){
397-
type = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_TYPE));
410+
if (c != null) {
411+
if (c.moveToFirst()) {
412+
type = c.getString(c.getColumnIndexOrThrow(DatabaseHelper.KEY_TYPE));
413+
}
398414
c.close();
399415
}
400416
return Account.AccountType.valueOf(type);
@@ -432,6 +448,7 @@ public List<Transaction> getNonExportedTransactionsForAccount(String accountUID)
432448
while (c.moveToNext()){
433449
transactionsList.add(buildTransactionInstance(c));
434450
}
451+
c.close();
435452
return transactionsList;
436453
}
437454

@@ -446,10 +463,12 @@ public String getAccountUID(long accountRowID){
446463
new String[]{DatabaseHelper.KEY_UID},
447464
DatabaseHelper.KEY_ROW_ID + "=" + accountRowID,
448465
null, null, null, null);
449-
if (c != null && c.moveToFirst()){
450-
uid = c.getString(0);
451-
c.close();
452-
}
466+
if (c != null) {
467+
if (c.moveToFirst()) {
468+
uid = c.getString(0);
469+
}
470+
c.close();
471+
}
453472
return uid;
454473
}
455474

@@ -464,11 +483,12 @@ public String getAccountUidFromTransaction(long transactionID){
464483
DatabaseHelper.KEY_ROW_ID + "=" + transactionID,
465484
null, null, null, null);
466485
String accountUID = null;
467-
if (c != null && c.moveToFirst()){
468-
accountUID = c.getString(0);
486+
if (c != null) {
487+
if (c.moveToFirst()) {
488+
accountUID = c.getString(0);
489+
}
469490
c.close();
470491
}
471-
472492
return accountUID;
473493
}
474494

@@ -483,10 +503,12 @@ public long getAccountID(String accountUID){
483503
new String[]{DatabaseHelper.KEY_ROW_ID},
484504
DatabaseHelper.KEY_UID + "='" + accountUID + "'",
485505
null, null, null, null);
486-
if (c != null && c.moveToFirst()){
487-
id = c.getLong(0);
488-
c.close();
489-
}
506+
if (c != null) {
507+
if (c.moveToFirst()) {
508+
id = c.getLong(0);
509+
}
510+
c.close();
511+
}
490512
return id;
491513
}
492514

@@ -501,8 +523,10 @@ public long getID(String transactionUID){
501523
new String[]{DatabaseHelper.KEY_ROW_ID},
502524
DatabaseHelper.KEY_UID + "='" + transactionUID + "'",
503525
null, null, null, null);
504-
if (c != null && c.moveToFirst()){
505-
id = c.getLong(0);
526+
if (c != null) {
527+
if (c.moveToFirst()) {
528+
id = c.getLong(0);
529+
}
506530
c.close();
507531
}
508532
return id;

app/src/org/gnucash/android/ui/transaction/TransactionsActivity.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ public class TransactionsActivity extends SherlockFragmentActivity implements
116116
*/
117117
private AccountsDbAdapter mAccountsDbAdapter;
118118

119+
/**
120+
* Hold the accounts cursor that will be used in the Navigation
121+
*/
122+
private Cursor mAccountsCursor = null;
123+
119124
/**
120125
* This is the last known color for the title indicator.
121126
* This is used to remember the color of the top level account if the child account doesn't have one.
@@ -348,19 +353,22 @@ private void setTitleIndicatorColor() {
348353
*/
349354
private void setupActionBarNavigation() {
350355
// set up spinner adapter for navigation list
351-
Cursor accountsCursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName();
356+
if (mAccountsCursor != null) {
357+
mAccountsCursor.close();
358+
}
359+
mAccountsCursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName();
352360

353361
SpinnerAdapter mSpinnerAdapter = new QualifiedAccountNameCursorAdapter(
354362
getSupportActionBar().getThemedContext(),
355-
R.layout.sherlock_spinner_item, accountsCursor);
363+
R.layout.sherlock_spinner_item, mAccountsCursor);
356364
((ResourceCursorAdapter) mSpinnerAdapter)
357365
.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
358366
ActionBar actionBar = getSupportActionBar();
359367
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
360368
actionBar.setListNavigationCallbacks(mSpinnerAdapter,
361369
mTransactionListNavigationListener);
362370
actionBar.setDisplayHomeAsUpEnabled(true);
363-
371+
364372
updateNavigationSelection();
365373
}
366374

@@ -449,6 +457,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
449457
@Override
450458
protected void onDestroy() {
451459
super.onDestroy();
460+
mAccountsCursor.close();
452461
mAccountsDbAdapter.close();
453462
}
454463

0 commit comments

Comments
 (0)