ios - Integrating library that manages memory manually with ARC project -
i have library file in ios 4 manual memory management .i want use library function in latest arc project .library giving error .how remover error ?here library function message using in viewcontroller.m
-(void) sandbox{ message(@"sandbox version%@",kbwutilitiesversion); } here library file bwdb.h giving error
#import <foundation/foundation.h> #import <sqlite3.h> #define defaultdatabasefilename @"bwtest.db" #define bwdb_version @"1.0.5" @interface bwdb : nsobject <nsfastenumeration> { sqlite3 *database; sqlite3_stmt *statement; nsstring *tablename; nsstring *databasefilename; nsfilemanager *filemanager; // "fast enumeration" (iterator/generator pattern) nsdictionary * enumrows[1]; // enumerated (iterator) object(s) passed in c array // ever pass 1 @ time } @property (nonatomic, retain) nsstring *tablename; // object management - (bwdb *) initwithdbfilename: (nsstring *) fn; - (bwdb *) initwithdbfilename: (nsstring *) fn andtablename: (nsstring *) tn; - (void) opendb; - (void) closedb; - (nsstring *) getversion; - (nsstring *) getdbpath; // sql queries - (nsnumber *) doquery:(nsstring *) query, ...; - (bwdb *) getquery:(nsstring *) query, ...; - (void) preparequery:(nsstring *) query, ...; - (id) valuefromquery:(nsstring *) query, ...; // crud methods - (nsnumber *) insertrow:(nsdictionary *) record; - (void) updaterow:(nsdictionary *) record: (nsnumber *) rowid; - (void) deleterow:(nsnumber *) rowid; - (nsdictionary *) getrow: (nsnumber *) rowid; - (nsnumber *) countrows; // raw results - (void) bindsql:(const char *) cquery arguments:(va_list)args; - (nsdictionary *) getpreparedrow; - (id) getpreparedvalue; // utilities - (id) columnvalue:(int) columnindex; - (nsnumber *) lastinsertid; @end here library file bwdb.m giving error.error lines highlighted
#import "bwdb.h" @implementation bwdb @synthesize tablename; #pragma mark - #pragma mark object management - (void)dealloc { // nslog(@"%s", __function__); [self closedb]; [super dealloc]; } // if you're not using crud functions, don't need table name - (bwdb *) initwithdbfilename:(nsstring *)fn { // nslog(@"%s", __function__); if ((self = [super init])) { databasefilename = fn; tablename = nil; [self opendb]; } return self; } - (bwdb *) initwithdbfilename: (nsstring *) fn andtablename: (nsstring *) tn { // nslog(@"%s", __function__); if ((self = [super init])) { databasefilename = fn; tablename = tn; [self opendb]; } return self; } - (void) opendb { // nslog(@"%s", __function__); if (database) return; filemanager = [[nsfilemanager alloc] init]; nsstring * dbpath = [self getdbpath]; if (![filemanager fileexistsatpath:dbpath]) { // try copy default, if have nsstring * defaultdbpath = [[[nsbundle mainbundle] resourcepath] stringbyappendingpathcomponent:databasefilename]; if ([filemanager fileexistsatpath:defaultdbpath]) { // nslog(@"copy default db"); [filemanager copyitematpath:defaultdbpath topath:dbpath error:null]; } } if (sqlite3_open([dbpath utf8string], &database) != sqlite_ok) { nsassert1(0, @"error: initializedatabase: not open database (%s)", sqlite3_errmsg(database)); } [filemanager release]; filemanager = nil; } - (void) closedb { // nslog(@"%s", __function__); if (database) sqlite3_close(database); if (filemanager) [filemanager release]; database = null; filemanager = nil; } - (nsstring *) getversion { return bwdb_version; } - (nsstring *) getdbpath { // nslog(@"%s", __function__); nsarray *paths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes); nsstring *documentsdirectory = [paths objectatindex:0]; return [documentsdirectory stringbyappendingpathcomponent:databasefilename]; } - (nsuinteger) countbyenumeratingwithstate:(nsfastenumerationstate *)state objects:(id *)stackbuf count:(nsuinteger)len { if (*enumrows = [self getpreparedrow]) { state->itemsptr = enumrows;/*assigning 'nsdictionary *__strong *' 'id _nullable __unsafe_unretained * _nullable' changes retain/release properties of pointer*/
state->state = 0; // not used, customarily set 0 state->mutationsptr = (unsigned long *) self; // not used, required interface return 1; } else { return 0; } } #pragma mark - #pragma mark sql queries - (nsnumber *) doquery:(nsstring *) query, ... { // nslog(@"%s: %@", __function__, query); va_list args; va_start(args, query); const char *cquery = [query utf8string]; [self bindsql:cquery arguments:args]; if (statement == null) return [nsnumber numberwithint:0]; va_end(args); sqlite3_step(statement); if(sqlite3_finalize(statement) == sqlite_ok) { return [nsnumber numberwithint: sqlite3_changes(database)]; } else { nslog(@"doquery: sqlite3_finalize failed (%s)", sqlite3_errmsg(database)); return [nsnumber numberwithint:0]; } } - (void) preparequery:(nsstring *) query, ... { // nslog(@"%s: %@", __function__, query); va_list args; va_start(args, query); const char *cquery = [query utf8string]; [self bindsql:cquery arguments:args]; if (statement == null) return; va_end(args); } - (bwdb *) getquery:(nsstring *) query, ... { // nslog(@"%s: %@", __function__, query); va_list args; va_start(args, query); const char *cquery = [query utf8string]; [self bindsql:cquery arguments:args]; if (statement == null) return nil; va_end(args); return self; } - (id) valuefromquery:(nsstring *) query, ... { // nslog(@"%s: %@", __function__, query); va_list args; va_start(args, query); const char *cquery = [query utf8string]; [self bindsql:cquery arguments:args]; if (statement == null) return nil; va_end(args); return [self getpreparedvalue]; } - (void) bindsql:(const char *) cquery arguments:(va_list)args { // nslog(@"%s: %s", __function__, cquery); int param_count; if (sqlite3_prepare_v2(database, cquery, -1, &statement, null) != sqlite_ok) { nslog(@"bindsql: not prepare statement (%s)", sqlite3_errmsg(database)); statement = null; return; } if ((param_count = sqlite3_bind_parameter_count(statement))) { (int = 0; < param_count; i++) { id o = va_arg(args, id); // determine type of argument if (o == nil) { sqlite3_bind_null(statement, + 1); } else if ([o respondstoselector:@selector(objctype)]) { if (strchr("islislb", *[o objctype])) { // integer sqlite3_bind_int(statement, + 1, [o intvalue]); } else if (strchr("fd", *[o objctype])) { // double sqlite3_bind_double(statement, + 1, [o doublevalue]); } else { // unhandled types nslog(@"bindsql: unhandled objctype: %s", [o objctype]); statement = null; return; } } else if ([o respondstoselector:@selector(utf8string)]) { // string sqlite3_bind_text(statement, + 1, [o utf8string], -1, sqlite_transient); } else { // unhhandled type nslog(@"bindsql: unhandled parameter type: %@", [o class]); statement = null; return; } } } va_end(args); return; } #pragma mark - #pragma mark crud methods - (nsnumber *) insertrow:(nsdictionary *) record { // nslog(@"%s", __function__); int dictsize = [record count]; // values array used argument list bindsql id keys[dictsize]; // not used, side-effect of getobjects:andkeys id values[dictsize]; [record getobjects:values andkeys:keys];/*sending '__strong id *' parameter of type '__unsafe_unretained id _nonnull * _nullable' changes retain/release properties of pointer*/
// convenient c array
// construct query nsmutablearray * placeholdersarray = [nsmutablearray arraywithcapacity:dictsize]; (int = 0; < dictsize; i++) // array of ? markers placeholders in query [placeholdersarray addobject: [nsstring stringwithstring:@"?"]]; nsstring * query = [nsstring stringwithformat:@"insert %@ (%@) values (%@)", tablename, [[record allkeys] componentsjoinedbystring:@","], [placeholdersarray componentsjoinedbystring:@","]]; [self bindsql:[query utf8string] arguments:(va_list)values]; sqlite3_step(statement);/used type 'va_list' (aka '__builtin_va_list') arithmetic or pointer type required/
if(sqlite3_finalize(statement) == sqlite_ok) { return [self lastinsertid]; } else { nslog(@"doquery: sqlite3_finalize failed (%s)", sqlite3_errmsg(database)); return [nsnumber numberwithint:0]; } } - (void) updaterow:(nsdictionary *) record:(nsnumber *) rowid { // nslog(@"%s", __function__); int dictsize = [record count]; // values array used argument list bindsql id keys[dictsize]; // not used, side-effect of getobjects:andkeys id values[dictsize + 1]; [record getobjects:values andkeys:keys];
array /*sending '__strong id *' parameter of type '__unsafe_unretained id _nonnull * _nullable' changes retain/release properties of pointer*/
values[dictsize] = rowid;
nsstring * query = [nsstring stringwithformat:@"update %@ set %@ = ? id = ?", tablename, [[record allkeys] componentsjoinedbystring:@" = ?, "]]; [self bindsql:[query utf8string] arguments:(va_list)values];
/*used type 'va_list' (aka '__builtin_va_list') arithmetic or
pointer type required*/
sqlite3_step(statement); sqlite3_finalize(statement); } - (void) deleterow:(nsnumber *) rowid { // nslog(@"%s", __function__); nsstring * query = [nsstring stringwithformat:@"delete %@ id = ?", tablename]; [self doquery:query, rowid]; } - (nsdictionary *) getrow: (nsnumber *) rowid { nsstring * query = [nsstring stringwithformat:@"select * %@ id = ?", tablename]; [self preparequery:query, rowid]; return [self getpreparedrow]; } - (nsnumber *) countrows { return [self valuefromquery:[nsstring stringwithformat:@"select count(*) %@", tablename]]; } #pragma mark - #pragma mark raw results - (nsdictionary *) getpreparedrow { // nslog(@"%s", __function__); int rc = sqlite3_step(statement); if (rc == sqlite_done) { sqlite3_finalize(statement); return nil; } else if (rc == sqlite_row) { int col_count = sqlite3_column_count(statement); if (col_count >= 1) { nsmutabledictionary * drow = [nsmutabledictionary dictionarywithcapacity:1]; for(int = 0; < col_count; i++) { // can't use null stringwithutf8string (bw 1.0.5) const char * sqlitecolname = sqlite3_column_name(statement, i); if(sqlitecolname) { nsstring * columnname = [nsstring stringwithutf8string:sqlitecolname]; id o = [self columnvalue:i]; if (o != nil) [drow setobject:o forkey:columnname]; else { nslog(@"getpreparedrow: columnvalue returned nil (%s)", sqlite3_errmsg(database)); return nil; } } else { nslog(@"getpreparedrow: sqlite3_column_name returned null (%s)", sqlite3_errmsg(database)); return nil; } } return drow; } } else { // rc != sqlite_row nslog(@"getpreparedrow: not row: %s", sqlite3_errmsg(database)); return nil; } return nil; } // returns 1 value first column of query - (id) getpreparedvalue { // nslog(@"%s", __function__); int rc = sqlite3_step(statement); if (rc == sqlite_done) { sqlite3_finalize(statement); return nil; } else if (rc == sqlite_row) { int col_count = sqlite3_column_count(statement); if (col_count < 1) return nil; // shouldn't ever happen id o = [self columnvalue:0]; sqlite3_finalize(statement); return o; } else { // rc == sqlite_row nslog(@"valuefrompreparedquery: not row: %s", sqlite3_errmsg(database)); return nil; } } #pragma mark - #pragma mark utility methods - (id) columnvalue:(int) columnindex { // nslog(@"%s columnindex: %d", __function__, columnindex); id o = nil; switch(sqlite3_column_type(statement, columnindex)) { case sqlite_integer: o = [nsnumber numberwithint:sqlite3_column_int(statement, columnindex)]; break; case sqlite_float: o = [nsnumber numberwithfloat:sqlite3_column_double(statement, columnindex)]; break; case sqlite_text: o = [nsstring stringwithutf8string:(const char *) sqlite3_column_text(statement, columnindex)]; break; case sqlite_blob: o = [nsdata datawithbytes:sqlite3_column_blob(statement, columnindex) length:sqlite3_column_bytes(statement, columnindex)]; break; case sqlite_null: o = [nsnull null]; break; } return o; } - (nsnumber *) lastinsertid { return [nsnumber numberwithint: sqlite3_last_insert_rowid(database)]; } @end from link can download sample project correction.https://drive.google.com/open?id=0b5pndpbvz8snbutcnm9kxzr1qwm
Comments
Post a Comment