diff --git a/src/com/wentch/redkale/source/DataDefaultSource.java b/src/com/wentch/redkale/source/DataDefaultSource.java index dc61f9dc3..2a34519a3 100644 --- a/src/com/wentch/redkale/source/DataDefaultSource.java +++ b/src/com/wentch/redkale/source/DataDefaultSource.java @@ -844,6 +844,114 @@ public final class DataDefaultSource implements DataSource, Nameable { } } + /** + * 根据主键值给对象的column对应的值 & andvalue, 必须是Entity Class + * + * @param + * @param clazz + * @param id + * @param column + * @param andvalue + */ + @Override + public void updateColumnAnd(Class clazz, Serializable id, String column, long andvalue) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + updateColumnAnd(null, info, id, column, andvalue); + return; + } + Connection conn = createWriteSQLConnection(); + try { + updateColumnAnd(conn, info, id, column, andvalue); + } finally { + closeSQLConnection(conn); + } + } + + @Override + public void updateColumnAnd(DataConnection conn, Class clazz, Serializable id, String column, long andvalue) { + updateColumnAnd((Connection) conn.getConnection(), loadEntityInfo(clazz), id, column, andvalue); + } + + private void updateColumnAnd(Connection conn, final EntityInfo info, Serializable id, String column, long andvalue) { + try { + if (!info.isVirtualEntity()) { + String col = info.getSQLColumn(column); + String sql = "UPDATE " + info.getTable() + " SET " + col + " = " + col + " & (" + andvalue + + ") WHERE " + info.getPrimarySQLColumn() + " = " + formatToString(id); + if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + final Statement stmt = conn.createStatement(); + stmt.execute(sql); + stmt.close(); + if (writeListener != null) writeListener.update(sql); + } + //--------------------------------------------------- + final EntityCache cache = info.getCache(); + if (cache == null) return; + Attribute attr = info.getAttribute(column); + T value = cache.updateColumnAnd(id, attr, andvalue); + if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value); + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) closeSQLConnection(conn); + } + } + + /** + * 根据主键值给对象的column对应的值 | andvalue, 必须是Entity Class + * + * @param + * @param clazz + * @param id + * @param column + * @param orvalue + */ + @Override + public void updateColumnOr(Class clazz, Serializable id, String column, long orvalue) { + final EntityInfo info = loadEntityInfo(clazz); + if (info.isVirtualEntity()) { + updateColumnOr(null, info, id, column, orvalue); + return; + } + Connection conn = createWriteSQLConnection(); + try { + updateColumnOr(conn, info, id, column, orvalue); + } finally { + closeSQLConnection(conn); + } + } + + @Override + public void updateColumnOr(DataConnection conn, Class clazz, Serializable id, String column, long orvalue) { + updateColumnOr((Connection) conn.getConnection(), loadEntityInfo(clazz), id, column, orvalue); + } + + private void updateColumnOr(Connection conn, final EntityInfo info, Serializable id, String column, long orvalue) { + try { + if (!info.isVirtualEntity()) { + String col = info.getSQLColumn(column); + String sql = "UPDATE " + info.getTable() + " SET " + col + " = " + col + " | (" + orvalue + + ") WHERE " + info.getPrimarySQLColumn() + " = " + formatToString(id); + if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql); + final Statement stmt = conn.createStatement(); + stmt.execute(sql); + stmt.close(); + if (writeListener != null) writeListener.update(sql); + } + //--------------------------------------------------- + final EntityCache cache = info.getCache(); + if (cache == null) return; + Attribute attr = info.getAttribute(column); + T value = cache.updateColumnOr(id, attr, orvalue); + if (value != null && cacheListener != null) cacheListener.updateCache(info.getType(), value); + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) closeSQLConnection(conn); + } + } + /** * 更新对象指定的一些字段, 必须是Entity对象 * diff --git a/src/com/wentch/redkale/source/DataSource.java b/src/com/wentch/redkale/source/DataSource.java index 852110ace..e1d23893f 100644 --- a/src/com/wentch/redkale/source/DataSource.java +++ b/src/com/wentch/redkale/source/DataSource.java @@ -100,6 +100,14 @@ public interface DataSource { public void updateColumnIncrement(final Class clazz, Serializable id, String column, long incvalue); public void updateColumnIncrement(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); + + public void updateColumnAnd(final Class clazz, Serializable id, String column, long incvalue); + + public void updateColumnAnd(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); + + public void updateColumnOr(final Class clazz, Serializable id, String column, long incvalue); + + public void updateColumnOr(final DataConnection conn, Class clazz, Serializable id, String column, long incvalue); //-----------------------getXXXXResult----------------------------- public Number getNumberResult(final Class entityClass, final Reckon reckon, final String column); diff --git a/src/com/wentch/redkale/source/EntityCache.java b/src/com/wentch/redkale/source/EntityCache.java index 13e655173..c4fe679ef 100644 --- a/src/com/wentch/redkale/source/EntityCache.java +++ b/src/com/wentch/redkale/source/EntityCache.java @@ -327,16 +327,31 @@ public final class EntityCache { return rs; } + public T updateColumnOr(final Serializable id, Attribute attr, final long orvalue) { + if (id == null) return null; + T rs = this.map.get(id); + if (rs == null) return rs; + Number numb = (Number) attr.get(rs); + return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? orvalue : (numb.longValue() & orvalue)); + } + + public T updateColumnAnd(final Serializable id, Attribute attr, final long andvalue) { + if (id == null) return null; + T rs = this.map.get(id); + if (rs == null) return rs; + Number numb = (Number) attr.get(rs); + return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? 0 : (numb.longValue() & andvalue)); + } + public T updateColumnIncrement(final Serializable id, Attribute attr, final long incvalue) { if (id == null) return null; T rs = this.map.get(id); if (rs == null) return rs; Number numb = (Number) attr.get(rs); - if (numb == null) { - numb = incvalue; - } else { - numb = numb.longValue() + incvalue; - } + return updateColumnIncrAndOr(id, attr, rs, (numb == null) ? incvalue : (numb.longValue() + incvalue)); + } + + private T updateColumnIncrAndOr(final Serializable id, Attribute attr, final T rs, Number numb) { final Class ft = attr.type(); if (ft == int.class || ft == Integer.class) { numb = numb.intValue();