1 21 22 package org.opensubsystems.core.persist.db.mysql; 23 24 import java.sql.Connection ; 25 import java.sql.PreparedStatement ; 26 import java.sql.SQLException ; 27 import java.sql.Statement ; 28 import java.util.Iterator ; 29 import java.util.Map ; 30 import java.util.logging.Level ; 31 import java.util.logging.Logger ; 32 33 import org.opensubsystems.core.data.BasicDataObject; 34 import org.opensubsystems.core.data.ModifiableDataObject; 35 import org.opensubsystems.core.error.OSSDatabaseAccessException; 36 import org.opensubsystems.core.error.OSSException; 37 import org.opensubsystems.core.persist.db.DatabaseConnectionFactoryImpl; 38 import org.opensubsystems.core.persist.db.DatabaseImpl; 39 import org.opensubsystems.core.persist.db.DatabaseTransactionFactoryImpl; 40 import org.opensubsystems.core.util.DatabaseUtils; 41 import org.opensubsystems.core.util.Log; 42 43 62 public class MySQLDatabaseImpl extends DatabaseImpl 63 { 64 66 69 private static Logger s_logger = Log.getInstance(MySQLDatabaseImpl.class); 70 71 73 78 public MySQLDatabaseImpl( 79 ) throws OSSException 80 { 81 super(); 82 } 83 84 86 89 protected void createUser( 90 Connection cntAdminDBConnection 91 ) throws OSSException 92 { 93 PreparedStatement pstmQuery = null; 95 try 96 { 97 String strDatabaseURL = DatabaseConnectionFactoryImpl.getInstance().getDatabaseURL(); 98 99 String strHost = strDatabaseURL.substring( 100 strDatabaseURL.indexOf("://") + 3, 101 strDatabaseURL.lastIndexOf("/")); 102 103 StringBuffer buffer = new StringBuffer (); 104 105 buffer.append("GRANT Select, Insert, Update, Delete, Index, Alter, " + 106 "Create, Drop, References ON "); 107 buffer.append(strDatabaseURL.substring( 108 strDatabaseURL.lastIndexOf("/") + 1, strDatabaseURL.length())); 109 buffer.append(".* TO '"); 110 buffer.append(DatabaseConnectionFactoryImpl.getInstance().getDatabaseUser()); 111 buffer.append("'@'" + strHost + "' "); 112 buffer.append("IDENTIFIED BY '"); 113 buffer.append(DatabaseConnectionFactoryImpl.getInstance().getDatabasePassword()); 114 buffer.append("'"); 115 116 try 117 { 118 pstmQuery = cntAdminDBConnection.prepareStatement(buffer.toString()); 119 120 if (pstmQuery.execute()) 121 { 122 pstmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 124 } 125 } 126 finally 127 { 128 DatabaseUtils.closeStatement(pstmQuery); 129 pstmQuery = null; 130 } 131 132 buffer.delete(0, buffer.length()); 134 buffer.append("UPDATE mysql.user SET Select_priv = 'Y', Insert_priv = 'Y', " + 135 "Update_priv = 'Y', Delete_priv = 'Y', Create_priv = 'Y', " + 136 "Drop_priv = 'Y', Reload_priv = 'N', Shutdown_priv = 'N', " + 137 "Process_priv = 'N', File_priv = 'N', Grant_priv = 'Y', " + 138 "References_priv = 'Y', Index_priv = 'Y', Alter_priv = 'Y' " + 139 "WHERE Host = '"); 140 buffer.append(strHost); 141 buffer.append("' AND User = '"); 142 buffer.append(DatabaseConnectionFactoryImpl.getInstance().getDatabaseUser()); 143 buffer.append("'"); 144 145 try 146 { 147 pstmQuery = cntAdminDBConnection.prepareStatement(buffer.toString()); 148 149 if (pstmQuery.execute()) 150 { 151 pstmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 153 } 154 } 155 finally 156 { 157 DatabaseUtils.closeStatement(pstmQuery); 158 pstmQuery = null; 159 } 160 161 DatabaseTransactionFactoryImpl.getInstance().commitTransaction( 166 cntAdminDBConnection); 167 168 s_logger.log(Level.FINER, "Database user " 169 + DatabaseConnectionFactoryImpl.getInstance().getDatabaseUser() 170 + " with password " 171 + DatabaseConnectionFactoryImpl.getInstance().getDatabasePassword() 172 + " created."); 173 } 174 catch (SQLException sqleExc) 175 { 176 try 177 { 178 DatabaseTransactionFactoryImpl.getInstance().rollbackTransaction( 183 cntAdminDBConnection); 184 } 185 catch (SQLException sqleExc2) 186 { 187 s_logger.log(Level.WARNING, 189 "Failed to rollback changes for creation of user.", 190 sqleExc2); 191 } 192 s_logger.log(Level.SEVERE, 193 "Unable to create default database user.", 194 sqleExc); 195 throw new OSSDatabaseAccessException("Unable to create default database user.", 196 sqleExc); 197 } 198 finally 199 { 200 DatabaseUtils.closeStatement(pstmQuery); 201 } 202 } 203 204 207 public void startDatabaseServer() throws OSSException 208 { 209 } 223 224 227 public void createDatabaseInstance() throws OSSException 228 { 229 } 236 237 240 public void stop( 241 ) throws OSSException 242 { 243 256 s_logger.entering(this.getClass().getName(), "stop"); 257 258 super.stop(); 261 262 s_logger.entering(this.getClass().getName(), "stop"); 263 } 264 265 268 public int getDatabaseType() 269 { 270 return DatabaseImpl.MYSQL_DATABASE_TYPE; 271 } 272 273 276 public String getDatabaseTypeIdentifier() 277 { 278 return DatabaseImpl.MYSQL_DATABASE_TYPE_IDENTIFIER; 279 } 280 281 284 public boolean preferCountToLast( 285 ) 286 { 287 return true; 292 } 293 294 297 public String getCurrentTimestampFunctionCall() 298 { 299 return "now()"; 301 } 302 303 306 public String getSQLCountFunctionCall() 307 { 308 return "count(*)"; 314 } 315 316 319 public boolean hasSelectListRangeSupport( 320 ) 321 { 322 return true; 324 } 325 326 329 public Object [] getSQLAnalyzeFunctionCall( 330 Map mapTableNames 331 ) 332 { 333 336 String [] arrReturn = new String [1]; 337 StringBuffer buffer = new StringBuffer (); 338 Iterator itItem; 339 int iIndex = 0; 340 341 buffer.append("analyze table "); 342 itItem = mapTableNames.values().iterator(); 343 while (itItem.hasNext()) 344 { 345 if (iIndex > 0) 347 { 348 buffer.append(", "); 349 } 350 buffer.append((String )itItem.next()); 351 } 352 arrReturn[0] = buffer.toString(); 353 354 return new Object [] {arrReturn, Boolean.FALSE}; 356 } 357 358 361 public boolean isCallableStatement( 362 String strQuery 363 ) 364 { 365 return false; 367 } 368 369 372 public void insertAndFetchGeneratedValues( 373 Connection dbConnection, 374 PreparedStatement insertStatement, 375 boolean bIsInDomain, 376 String strTableName, 377 int iIndex, 378 BasicDataObject data 379 ) throws SQLException , 380 OSSException 381 { 382 MySQLDataUtils.insertAndFetchGeneratedValues(dbConnection, 383 insertStatement, bIsInDomain, strTableName, data); 384 } 385 386 389 public void updatedAndFetchGeneratedValues( 390 String strDataName, 391 Connection dbConnection, 392 PreparedStatement updateStatement, 393 boolean bIsInDomain, 394 String strTableName, 395 int iIndex, 396 ModifiableDataObject data 397 ) throws SQLException , 398 OSSException 399 { 400 MySQLDataUtils.updatedAndFetchGeneratedValues(strDataName, dbConnection, 401 updateStatement, bIsInDomain, strTableName, data); 402 } 403 } 404 | Popular Tags |