Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.69 KB | None | 0 0
  1. import com.google.common.base.Function;
  2. import com.google.common.util.concurrent.*;
  3.  
  4. import javax.annotation.Nullable;
  5. import java.sql.*;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.atomic.AtomicReference;
  8. import java.util.function.Consumer;
  9.  
  10. /**
  11. * @author vRchr
  12. */
  13. public class SQLClass {
  14. private final String HOST;
  15. private final String NAME;
  16. private final String PASSWORD;
  17. private final String DATABASE;
  18. private final ListeningExecutorService THREAD_POOL = MoreExecutors
  19. .listeningDecorator( Executors.newCachedThreadPool() );
  20. private Connection connection;
  21.  
  22. public SQLClass( String host, String name, String password, String database ) {
  23. this.HOST = host;
  24. this.NAME = name;
  25. this.PASSWORD = password;
  26. this.DATABASE = database;
  27. }
  28.  
  29. public void connect( ) {
  30. try {
  31. //connect to database
  32. this.connection = DriverManager
  33. .getConnection( "jdbc:mysql://" + this.getHOST() + "/" + this.getDATABASE() +
  34. "?autoReconnect=true", this.getNAME(), this.getPASSWORD() );
  35. } catch ( SQLException e ) {
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. public void disconnect( ) {
  41. try {
  42. this.getConnection().close();
  43. } catch ( SQLException e ) {
  44. e.printStackTrace();
  45. }
  46. }
  47.  
  48. /**
  49. * --CONSUMER--
  50. **/
  51.  
  52. public <T> void queryAsync( final String sql, Function<ResultSet, T> function, Consumer<T> consumer,
  53. final Object... parameters ) {
  54. Futures.addCallback( Futures.transform( this._queryAsync( sql, parameters ), new Function<Tuple<ResultSet,
  55. Runnable>, Tuple<T, Runnable>>() {
  56. @Nullable
  57. @Override
  58. public Tuple<T, Runnable> apply( @Nullable Tuple<ResultSet, Runnable> resultSetRunnableTuple ) {
  59. return Tuple.of(function.apply( resultSetRunnableTuple.getOne() ), resultSetRunnableTuple.getTwo());
  60. }
  61. } ),
  62. new FutureCallback<Tuple<T, Runnable>>() {
  63. @Override
  64. public void onSuccess( Tuple<T, Runnable> result ) {
  65. consumer.accept( result.getOne() );
  66. result.getTwo().run();
  67. }
  68.  
  69. @Override
  70. public void onFailure( Throwable t ) {
  71. consumer.accept( null );
  72. }
  73. } );
  74. }
  75.  
  76. public void updateAsync( final String sql, Consumer<Boolean> consumer, final Object... parameters ) {
  77. Futures.addCallback( this.updateAsync( sql, parameters ), new FutureCallback<Boolean>() {
  78. @Override
  79. public void onSuccess( Boolean result ) {
  80. consumer.accept( result );
  81. }
  82.  
  83. @Override
  84. public void onFailure( Throwable t ) {
  85. System.out.println( t.getMessage() );
  86. consumer.accept( null );
  87. }
  88. } );
  89. }
  90.  
  91.  
  92. /**
  93. * --LISTENING FUTURE--
  94. **/
  95.  
  96. private ListenableFuture<Tuple<ResultSet, Runnable>> _queryAsync( final String sql, final Object... parameters ) {
  97. return this.getTHREAD_POOL().submit( ( ) -> query( sql, parameters ) );
  98. }
  99.  
  100. private ListenableFuture<ResultSet> queryAsync( final String sql, final Object... parameters ) {
  101. return this.getTHREAD_POOL().submit( ( ) -> query( sql, parameters ).getOne() );
  102. }
  103.  
  104. private ListenableFuture<Boolean> updateAsync( final String sql, final Object... parameters ) {
  105. return this.getTHREAD_POOL().submit( ( ) -> update( sql, parameters ) );
  106. }
  107.  
  108.  
  109. /**
  110. * --SYNC--
  111. **/
  112.  
  113. private Tuple<ResultSet, Runnable> query( String sql, Object... parameters ) {
  114. AtomicReference<PreparedStatement> preparedStatement = new AtomicReference<>( null );
  115. AtomicReference<ResultSet> resultSet = new AtomicReference<>( null );
  116. try {
  117. preparedStatement.set( this.getConnection().prepareStatement( sql ) );
  118.  
  119. int count = 0;
  120. for ( Object parameter : parameters ) {
  121. preparedStatement.get().setObject( count, parameter );
  122. count++;
  123. }
  124.  
  125. resultSet.set( preparedStatement.get().executeQuery() );
  126.  
  127. return Tuple.of( resultSet.get(), ( ) -> {
  128. try {
  129. resultSet.get().close();
  130. preparedStatement.get().close();
  131. } catch ( SQLException e ) {
  132. e.printStackTrace();
  133. }
  134. } );
  135. } catch ( SQLException e ) {
  136. e.printStackTrace();
  137. }
  138. return Tuple.of( null, () -> {} );
  139. }
  140.  
  141. private boolean update( String sql, Object... parameters ) {
  142. PreparedStatement preparedStatement = null;
  143. try {
  144. preparedStatement = this.getConnection().prepareStatement( sql );
  145.  
  146. int count = 0;
  147. for ( Object parameter : parameters ) {
  148. preparedStatement.setObject( count, parameter );
  149. count++;
  150. }
  151.  
  152. preparedStatement.executeUpdate();
  153.  
  154. return true;
  155. } catch ( SQLException e ) {
  156. e.printStackTrace();
  157. } finally {
  158. try {
  159. preparedStatement.close();
  160. } catch ( SQLException e ) {
  161. e.printStackTrace();
  162. }
  163. }
  164. return false;
  165. }
  166.  
  167. public String getHOST( ) {
  168. return HOST;
  169. }
  170.  
  171. public String getNAME( ) {
  172. return NAME;
  173. }
  174.  
  175. public String getPASSWORD( ) {
  176. return PASSWORD;
  177. }
  178.  
  179. public String getDATABASE( ) {
  180. return DATABASE;
  181. }
  182.  
  183. public ListeningExecutorService getTHREAD_POOL( ) {
  184. return THREAD_POOL;
  185. }
  186.  
  187. public Connection getConnection( ) {
  188. return connection;
  189. }
  190.  
  191. private static final class Tuple<O, T> {
  192. private O one;
  193. private T two;
  194.  
  195. public Tuple( O one, T two ) {
  196. this.one = one;
  197. this.two = two;
  198. }
  199.  
  200. public static <O, T> Tuple<O, T> of( O one, T two ) {
  201. return new Tuple<>( one, two );
  202. }
  203.  
  204. public O getOne( ) {
  205. return one;
  206. }
  207.  
  208. public void setOne( O one ) {
  209. this.one = one;
  210. }
  211.  
  212. public T getTwo( ) {
  213. return two;
  214. }
  215.  
  216. public void setTwo( T two ) {
  217. this.two = two;
  218. }
  219. }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement