anchor.diff:    end.
   
   delete_by(DocName, Conditions, State) ->
  -  StatementName = prepare(DocName, delete_by, fun() -> [
  +  PreStatementName = list_to_atom("delete_by_" ++ string:join(
  +    [atom_to_list(K) || {K, _V} <- Conditions],
  +    "_"
  +  )),
  +  StatementName = prepare(DocName, PreStatementName, fun() -> [
       "DELETE FROM ", escape(atom_to_list(DocName)),
       " WHERE ",
       [[escape(atom_to_list(K)), "=?"] || {K, _V} <- Conditions]
  
positive.code:   ),
    StatementName = prepare(DocName, list_to_atom("find_by" ++ PreStatementName), fun() ->
      Sqls = [[escape(atom_to_list(K)), "=?"] || K <- DocFields],
      % Select * is not good.. 
      Sql1 =[
        "SELECT * FROM ", escape(atom_to_list(DocName)),
        " WHERE ", string:join(Sqls, " AND ")
  
negative.code:     end,
      Sql2
    end),
    ExecArgs =
      case Limit of
        0 -> [atom_to_list(OrderField)];
        Limit -> [atom_to_list(OrderField), Offset, Limit]
      end,
    case execute(StatementName, ExecArgs, State) of
      #result_packet{rows = Rows, field_list = Fields} ->
        Docs   = lists:foldl(
          fun(Row, DocList) ->
  