001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.core.persistence;
021
022 import org.apache.ibatis.executor.BatchResult;
023 import org.apache.ibatis.session.Configuration;
024 import org.apache.ibatis.session.ResultHandler;
025 import org.apache.ibatis.session.RowBounds;
026 import org.apache.ibatis.session.SqlSession;
027
028 import java.sql.Connection;
029 import java.util.List;
030 import java.util.Map;
031
032 public final class BatchSession implements SqlSession {
033
034 public static final int MAX_BATCH_SIZE = 250;
035
036 private final SqlSession session;
037 private final int batchSize;
038 private int count = 0;
039
040 BatchSession(SqlSession session) {
041 this(session, MAX_BATCH_SIZE);
042 }
043
044 BatchSession(SqlSession session, int batchSize) {
045 this.session = session;
046 this.batchSize = batchSize;
047 }
048
049 public void select(String statement, Object parameter, ResultHandler handler) {
050 reset();
051 session.select(statement, parameter, handler);
052 }
053
054 public void select(String statement, ResultHandler handler) {
055 reset();
056 session.select(statement, handler);
057 }
058
059 public Object selectOne(String statement) {
060 reset();
061 return session.selectOne(statement);
062 }
063
064 public Object selectOne(String statement, Object parameter) {
065 reset();
066 return session.selectOne(statement, parameter);
067 }
068
069 public List selectList(String statement) {
070 reset();
071 return session.selectList(statement);
072 }
073
074 public List selectList(String statement, Object parameter) {
075 reset();
076 return session.selectList(statement, parameter);
077 }
078
079 public List selectList(String statement, Object parameter, RowBounds rowBounds) {
080 reset();
081 return session.selectList(statement, parameter, rowBounds);
082 }
083
084 public Map selectMap(String statement, String mapKey) {
085 reset();
086 return session.selectMap(statement, mapKey);
087 }
088
089 public Map selectMap(String statement, Object parameter, String mapKey) {
090 reset();
091 return session.selectMap(statement, parameter, mapKey);
092 }
093
094 public Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
095 reset();
096 return session.selectMap(statement, parameter, mapKey, rowBounds);
097 }
098
099 public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
100 reset();
101 session.select(statement, parameter, rowBounds, handler);
102 }
103
104 public int insert(String statement) {
105 increment();
106 return session.insert(statement);
107 }
108
109 public int insert(String statement, Object parameter) {
110 increment();
111 return session.insert(statement, parameter);
112 }
113
114 public int update(String statement) {
115 increment();
116 return session.update(statement);
117 }
118
119 public int update(String statement, Object parameter) {
120 increment();
121 return session.update(statement, parameter);
122 }
123
124 public int delete(String statement) {
125 increment();
126 return session.delete(statement);
127 }
128
129 public int delete(String statement, Object parameter) {
130 increment();
131 return session.delete(statement, parameter);
132 }
133
134 public void commit() {
135 session.commit();
136 reset();
137 }
138
139 public void commit(boolean force) {
140 session.commit(force);
141 reset();
142 }
143
144 public void rollback() {
145 session.rollback();
146 reset();
147 }
148
149 public void rollback(boolean force) {
150 session.rollback(force);
151 reset();
152 }
153
154 public List<BatchResult> flushStatements() {
155 List<BatchResult> batchResults = session.flushStatements();
156 reset();
157 return batchResults;
158 }
159
160 public void close() {
161 session.close();
162 }
163
164 public void clearCache() {
165 session.clearCache();
166 }
167
168 public Configuration getConfiguration() {
169 return session.getConfiguration();
170 }
171
172 public <T> T getMapper(Class<T> type) {
173 return getConfiguration().getMapper(type, this);
174 }
175
176 public Connection getConnection() {
177 return session.getConnection();
178 }
179
180 private BatchSession increment() {
181 count += 1;
182 if (count >= batchSize) {
183 commit();
184 }
185 return this;
186 }
187
188 private void reset() {
189 count = 0;
190 }
191 }