PostgreSQL用データアクセスクラス続き(2)

  • トランザクションのコントロール(begin/commit/rollback)ができるように。
  • テーブルベースじゃなくてSQLとパラメータを投げて内容を取ってくる機能をつけた。
    • 普通こっちが先か。
    • というか普通にJDBCみたいになってきたな。
  • 実装の方をリファクタリングし続け。大分整理できた。
@interface SimpleDataAccess : NSObject {
}
// Factory methods
+ (SimpleDataAccess *)simpleDataAccessWithConnectionDictionary:(NSDictionary *)connectionDictionary;
// Transaction control
- (void)beginTransaction;
- (void)commitTransaction;
- (void)rollbackTransaction;
// SQL-based operations
- (NSArray *)executeQueryWithSQL:(NSString *)sqlString;
- (NSArray *)executeQueryWithSQL:(NSString *)sqlString parameters:(NSArray *)parameters;
- (int)executeUpdateWithSQL:(NSString *)sqlString;
- (int)executeUpdateWithSQL:(NSString *)sqlString parameters:(NSArray *)parameters;;
// TableInfo-based operations 
- (int)insertWithValues:(NSMutableDictionary *)values intoTable:(TableInfo *)tableInfo;
- (int)updateWithValues:(NSDictionary *)values inTable:(TableInfo *)tableInfo;
- (int)deleteWithValues:(NSDictionary *)values fromTable:(TableInfo *)tableInfo;
- (NSArray *)fetchWithCondition:(NSDictionary *)condition fromTable:(TableInfo *)tableInfo;
@end
  • POOOにマップするのはKVC使えば超楽なのだがメタ情報の設定をあまり増やしたくないので加減が難しい。
  • 楽観ロッキングはロックに使用するキーをTableInfoに設定し、取得時にスナップショットを取って_snapshopとかその辺のキーでレコード情報(values)に保持しておいて、更新時にwhere句に追加すれば良いので難しくないのだがメタ情報の設定をあまり増やしたくないので加減が難しい。
  • とりあえず目的は果たせそうなのでこの辺にしておこうか。

動作確認用プログラム用のテーブルスキーマ

drop table hatebu_user;
create table hatebu_user (
    record_id serial,
    hatena_id varchar(32) not null,
    register_date timestamp not null
);

create unique index hatebu_user_hatena_id_idx on hatebu_user (hatena_id);

drop table hatebu_favorite;
create table hatebu_favorite (
    src_id integer,
    dest_id integer,
    register_date timestamp not null,
    constraint src_id_dest_id PRIMARY KEY (src_id, dest_id)
);

create index hatebu_favorite_src_id_idx on hatebu_favorite (src_id);
-- create index hatebu_favorite_dest_id_idx on hatebu_favorite (dest_id);

どうやら順調に動いている模様。