#import <Foundation/Foundation.h>

#import "DDLog.h"

/**
 * Welcome to Cocoa Lumberjack!
 * 
 * The project page has a wealth of documentation if you have any questions.
 * https://github.com/CocoaLumberjack/CocoaLumberjack
 * 
 * If you're new to the project you may wish to read the "Getting Started" wiki.
 * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
 * 
 * 
 * This class provides an abstract implementation of a database logger.
 * 
 * That is, it provides the base implementation for a database logger to build atop of.
 * All that is needed for a concrete database logger is to extend this class
 * and override the methods in the implementation file that are prefixed with "db_".
**/

@interface DDAbstractDatabaseLogger : DDAbstractLogger {
@protected
    NSUInteger saveThreshold;
    NSTimeInterval saveInterval;
    NSTimeInterval maxAge;
    NSTimeInterval deleteInterval;
    BOOL deleteOnEverySave;
    
    BOOL saveTimerSuspended;
    NSUInteger unsavedCount;
    dispatch_time_t unsavedTime;
    dispatch_source_t saveTimer;
    dispatch_time_t lastDeleteTime;
    dispatch_source_t deleteTimer;
}

/**
 * Specifies how often to save the data to disk.
 * Since saving is an expensive operation (disk io) it is not done after every log statement.
 * These properties allow you to configure how/when the logger saves to disk.
 * 
 * A save is done when either (whichever happens first):
 * 
 * - The number of unsaved log entries reaches saveThreshold
 * - The amount of time since the oldest unsaved log entry was created reaches saveInterval
 * 
 * You can optionally disable the saveThreshold by setting it to zero.
 * If you disable the saveThreshold you are entirely dependent on the saveInterval.
 * 
 * You can optionally disable the saveInterval by setting it to zero (or a negative value).
 * If you disable the saveInterval you are entirely dependent on the saveThreshold.
 * 
 * It's not wise to disable both saveThreshold and saveInterval.
 * 
 * The default saveThreshold is 500.
 * The default saveInterval is 60 seconds.
**/
@property (assign, readwrite) NSUInteger saveThreshold;
@property (assign, readwrite) NSTimeInterval saveInterval;

/**
 * It is likely you don't want the log entries to persist forever.
 * Doing so would allow the database to grow infinitely large over time.
 * 
 * The maxAge property provides a way to specify how old a log statement can get
 * before it should get deleted from the database.
 * 
 * The deleteInterval specifies how often to sweep for old log entries.
 * Since deleting is an expensive operation (disk io) is is done on a fixed interval.
 * 
 * An alternative to the deleteInterval is the deleteOnEverySave option.
 * This specifies that old log entries should be deleted during every save operation.
 * 
 * You can optionally disable the maxAge by setting it to zero (or a negative value).
 * If you disable the maxAge then old log statements are not deleted.
 * 
 * You can optionally disable the deleteInterval by setting it to zero (or a negative value).
 * 
 * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted.
 * 
 * It's not wise to enable both deleteInterval and deleteOnEverySave.
 * 
 * The default maxAge is 7 days.
 * The default deleteInterval is 5 minutes.
 * The default deleteOnEverySave is NO.
**/
@property (assign, readwrite) NSTimeInterval maxAge;
@property (assign, readwrite) NSTimeInterval deleteInterval;
@property (assign, readwrite) BOOL deleteOnEverySave;

/**
 * Forces a save of any pending log entries (flushes log entries to disk).
**/
- (void)savePendingLogEntries;

/**
 * Removes any log entries that are older than maxAge.
**/
- (void)deleteOldLogEntries;

@end
