1 21 22 package org.opensubsystems.blog.persist.db.postgresql; 23 24 import java.sql.Connection ; 25 import java.sql.SQLException ; 26 import java.sql.Statement ; 27 import java.util.logging.Level ; 28 import java.util.logging.Logger ; 29 30 import org.opensubsystems.blog.data.Blog; 31 import org.opensubsystems.blog.data.Entry; 32 import org.opensubsystems.blog.persist.db.BlogDatabaseSchema; 33 import org.opensubsystems.core.error.OSSException; 34 import org.opensubsystems.core.util.DatabaseUtils; 35 import org.opensubsystems.core.util.Log; 36 37 46 public class PostgreSQLBlogDatabaseSchema extends BlogDatabaseSchema 47 { 48 223 224 226 230 public static final int BLOG_COMMENTS_MAXLENGTH_POSTGRES = 32768; 231 232 236 public static final int BLOGENTRY_COMMENTS_MAXLENGTH_POSTGRES = 32768; 237 238 240 243 private static Logger s_logger = Log.getInstance(PostgreSQLBlogDatabaseSchema.class); 244 245 247 250 static 251 { 252 Blog.setCommentsMaxLength(BLOG_COMMENTS_MAXLENGTH_POSTGRES); 254 Entry.setCommentsMaxLength(BLOGENTRY_COMMENTS_MAXLENGTH_POSTGRES); 255 } 256 257 262 public PostgreSQLBlogDatabaseSchema( 263 ) throws OSSException 264 { 265 super(); 266 } 267 268 270 273 public void create( 274 Connection cntDBConnection, 275 String strUserName 276 ) throws SQLException 277 { 278 Statement stmQuery = null; 279 try 280 { 281 stmQuery = cntDBConnection.createStatement(); 282 283 if (stmQuery.execute( 284 "create table BF_BLOG" + NL + 285 "(" + NL + 286 " ID SERIAL," + NL + 287 " DOMAIN_ID INTEGER NOT NULL," + NL + 288 " FOLDER VARCHAR(" + BLOG_FOLDER_MAXLENGTH + ") NOT NULL," + NL + 289 " CAPTION VARCHAR(" + BLOG_CAPTION_MAXLENGTH + ") NOT NULL," + NL + 290 " COMMENTS VARCHAR(" + BLOG_COMMENTS_MAXLENGTH_POSTGRES + ") NOT NULL," + NL + 291 " CREATION_DATE TIMESTAMP WITH TIME ZONE NOT NULL," + NL + 292 " MODIFICATION_DATE TIMESTAMP WITH TIME ZONE NOT NULL," + NL + 293 " CONSTRAINT BF_BLOG_PK PRIMARY KEY (ID)," + NL + 294 " CONSTRAINT BF_BLOG_FLDR_UQ UNIQUE (FOLDER)" + NL + 297 ")")) 298 { 299 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 301 } 302 s_logger.log(Level.FINEST, "Table BF_BLOG created."); 303 304 306 if (stmQuery.execute( 307 "CREATE OR REPLACE FUNCTION INSERT_BF_BLOG " + NL + 308 "( " + NL + 309 " INTEGER, " + NL + 310 " VARCHAR(" + BLOG_FOLDER_MAXLENGTH + "), " + NL + 311 " VARCHAR(" + BLOG_CAPTION_MAXLENGTH + "), " + NL + 312 " VARCHAR(" + BLOG_COMMENTS_MAXLENGTH_POSTGRES + ") " + NL + 313 ") RETURNS type_int_timestamp AS ' " + NL + 314 "DECLARE " + NL + 315 " IN_DOMAIN_ID ALIAS FOR $1; " + NL + 316 " IN_FOLDER ALIAS FOR $2; " + NL + 317 " IN_CAPTION ALIAS FOR $3; " + NL + 318 " IN_COMMENTS ALIAS FOR $4; " + NL + 319 " out_key INTEGER; " + NL + 320 " out_timestamp TIMESTAMP WITH TIME ZONE; " + NL + 321 " output_result type_int_timestamp; " + NL + 322 "BEGIN " + NL + 323 " SELECT INTO out_timestamp now(); " + NL + 324 " INSERT INTO " + strUserName + ".BF_BLOG(DOMAIN_ID, FOLDER, " + NL + 325 " CAPTION, COMMENTS, CREATION_DATE, MODIFICATION_DATE) " + NL + 326 " VALUES (IN_DOMAIN_ID, IN_FOLDER, IN_CAPTION, " + NL + 327 " IN_COMMENTS, out_timestamp, out_timestamp); " + NL + 328 " out_key := CURRVAL(''bf_blog_id_seq''); " + NL + 329 " output_result.intgr := out_key; " + NL + 330 " output_result.tmstp := out_timestamp; " + NL + 331 " RETURN output_result; " + NL + 332 "END " + NL + 333 "' LANGUAGE 'plpgsql';")) 334 { 335 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 337 } 338 s_logger.log(Level.FINEST, "Procedure INSERT_BF_BLOG created."); 339 340 342 if (stmQuery.execute( 343 "CREATE OR REPLACE FUNCTION UPDATE_BF_BLOG " + NL + 344 "( " + NL + 345 " VARCHAR(" + BLOG_FOLDER_MAXLENGTH + "), " + NL + 346 " VARCHAR(" + BLOG_CAPTION_MAXLENGTH + "), " + NL + 347 " VARCHAR(" + BLOG_COMMENTS_MAXLENGTH_POSTGRES + "), " + NL + 348 " INTEGER, " + NL + 349 " INTEGER, " + NL + 350 " TIMESTAMP WITH TIME ZONE " + NL + 351 ") RETURNS type_int_timestamp AS ' " + NL + 352 "DECLARE " + NL + 353 " IN_FOLDER ALIAS FOR $1; " + NL + 354 " IN_CAPTION ALIAS FOR $2; " + NL + 355 " IN_COMMENTS ALIAS FOR $3; " + NL + 356 " IN_BLOG_ID ALIAS FOR $4; " + NL + 357 " IN_DOMAIN_ID ALIAS FOR $5; " + NL + 358 " IN_MODIFICATION_DATE ALIAS FOR $6; " + NL + 359 " out_updated_count INTEGER; " + NL + 360 " out_timestamp TIMESTAMP WITH TIME ZONE; " + NL + 361 " output_result type_int_timestamp; " + NL + 362 "BEGIN " + NL + 363 " SELECT INTO out_timestamp now(); " + NL + 364 " UPDATE " + strUserName + ".BF_BLOG SET FOLDER = IN_FOLDER, " + NL + 365 " CAPTION = IN_CAPTION, " + NL + 366 " COMMENTS = IN_COMMENTS, MODIFICATION_DATE = out_timestamp " + NL + 367 " WHERE ID = IN_BLOG_ID AND DOMAIN_ID = IN_DOMAIN_ID " + NL + 368 " AND MODIFICATION_DATE = IN_MODIFICATION_DATE; " + NL + 369 " GET DIAGNOSTICS out_updated_count = ROW_COUNT; " + NL + 370 " output_result.intgr := out_updated_count; " + NL + 371 " output_result.tmstp := out_timestamp; " + NL + 372 " RETURN output_result; " + NL + 373 "END; " + NL + 374 "' LANGUAGE 'plpgsql';")) 375 { 376 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 378 } 379 s_logger.log(Level.FINEST, "Procedure UPDATE_BF_BLOG created."); 380 381 383 if (stmQuery.execute( 384 "create table BF_BLOG_ENTRY" + NL + 385 "(" + NL + 386 " ID SERIAL," + NL + 387 " DOMAIN_ID INTEGER NOT NULL," + NL + 388 " BLOG_ID INTEGER NOT NULL," + NL + 389 " CAPTION VARCHAR(" + BLOGENTRY_CAPTION_MAXLENGTH + ") NOT NULL," + NL + 390 " COMMENTS VARCHAR(" + BLOGENTRY_COMMENTS_MAXLENGTH_POSTGRES + ") NOT NULL," + NL + 391 " IMAGEURL VARCHAR(" + BLOGENTRY_IMAGEURL_MAXLENGTH + ") NOT NULL," + NL + 392 " TARGETURL VARCHAR(" + BLOGENTRY_TARGETURL_MAXLENGTH + ") NOT NULL," + NL + 393 " CREATION_DATE TIMESTAMP WITH TIME ZONE NOT NULL," + NL + 394 " MODIFICATION_DATE TIMESTAMP WITH TIME ZONE NOT NULL," + NL + 395 " CONSTRAINT BF_BLOGENTR_PK PRIMARY KEY (ID)," + NL + 396 " CONSTRAINT BF_BLOGENTR_FK FOREIGN KEY (BLOG_ID)" + NL + 399 " REFERENCES BF_BLOG (ID) ON DELETE CASCADE" + NL + 400 ")")) 401 { 402 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 404 } 405 s_logger.log(Level.FINEST, "Table BF_BLOG_ENTRY created."); 406 407 409 if (stmQuery.execute( 410 "CREATE OR REPLACE FUNCTION INSERT_BF_BLOGENTR" + NL + 411 "( " + NL + 412 " INTEGER," + NL + 413 " INTEGER," + NL + 414 " VARCHAR(" + BLOGENTRY_CAPTION_MAXLENGTH + ")," + NL + 415 " VARCHAR(" + BLOGENTRY_COMMENTS_MAXLENGTH_POSTGRES + ")," + NL + 416 " VARCHAR(" + BLOGENTRY_IMAGEURL_MAXLENGTH + ")," + NL + 417 " VARCHAR(" + BLOGENTRY_TARGETURL_MAXLENGTH + ")" + NL + 418 ") RETURNS type_int_timestamp AS '" + NL + 419 "DECLARE" + NL + 420 " IN_DOMAIN_ID ALIAS FOR $1;" + NL + 421 " IN_BLOG_ID ALIAS FOR $2;" + NL + 422 " IN_CAPTION ALIAS FOR $3;" + NL + 423 " IN_COMMENTS ALIAS FOR $4;" + NL + 424 " IN_IMAGEURL ALIAS FOR $5;" + NL + 425 " IN_TARGETURL ALIAS FOR $6;" + NL + 426 " out_key INTEGER;" + NL + 427 " out_timestamp TIMESTAMP WITH TIME ZONE;" + NL + 428 " output_result type_int_timestamp;" + NL + 429 "BEGIN" + NL + 430 " SELECT INTO out_timestamp now();" + NL + 431 " INSERT INTO " + strUserName + ".BF_BLOG_ENTRY(DOMAIN_ID, BLOG_ID, " + NL + 432 " CAPTION, COMMENTS, IMAGEURL, TARGETURL, CREATION_DATE, " + NL + 433 " MODIFICATION_DATE) VALUES (IN_DOMAIN_ID, IN_BLOG_ID, IN_CAPTION, " + NL + 434 " IN_COMMENTS, IN_IMAGEURL, IN_TARGETURL, out_timestamp, out_timestamp);" + NL + 435 " out_key := CURRVAL(''bf_blog_entry_id_seq'');" + NL + 436 " output_result.intgr := out_key;" + NL + 437 " output_result.tmstp := out_timestamp;" + NL + 438 " RETURN output_result;" + NL + 439 "END" + NL + 440 "' LANGUAGE 'plpgsql';")) 441 { 442 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 444 } 445 s_logger.log(Level.FINEST, "Table INSERT_BF_BLOGENTR created."); 446 447 449 if (stmQuery.execute( 450 "CREATE OR REPLACE FUNCTION UPDATE_BF_BLOGENTR" + NL + 451 "( " + NL + 452 " VARCHAR(" + BLOGENTRY_CAPTION_MAXLENGTH + ")," + NL + 453 " VARCHAR(" + BLOGENTRY_COMMENTS_MAXLENGTH_POSTGRES + ")," + NL + 454 " VARCHAR(" + BLOGENTRY_IMAGEURL_MAXLENGTH + ")," + NL + 455 " VARCHAR(" + BLOGENTRY_TARGETURL_MAXLENGTH + ")," + NL + 456 " INTEGER, " + NL + 457 " INTEGER, " + NL + 458 " TIMESTAMP WITH TIME ZONE " + NL + 459 ") RETURNS type_int_timestamp AS ' " + NL + 460 "DECLARE " + NL + 461 " IN_CAPTION ALIAS FOR $1; " + NL + 462 " IN_COMMENTS ALIAS FOR $2; " + NL + 463 " IN_IMAGEURL ALIAS FOR $3; " + NL + 464 " IN_TARGETURL ALIAS FOR $4; " + NL + 465 " IN_ENTRY_ID ALIAS FOR $5; " + NL + 466 " IN_DOMAIN_ID ALIAS FOR $6; " + NL + 467 " IN_MODIFICATION_DATE ALIAS FOR $7; " + NL + 468 " out_updated_count INTEGER; " + NL + 469 " out_timestamp TIMESTAMP WITH TIME ZONE; " + NL + 470 " output_result type_int_timestamp; " + NL + 471 "BEGIN " + NL + 472 " SELECT INTO out_timestamp now(); " + NL + 473 " UPDATE " + strUserName + ".BF_BLOG_ENTRY SET CAPTION = IN_CAPTION, " + NL + 474 " COMMENTS = IN_COMMENTS, IMAGEURL = IN_IMAGEURL, " + 475 " TARGETURL= IN_TARGETURL, MODIFICATION_DATE = out_timestamp " + NL + 476 " WHERE ID = IN_ENTRY_ID AND DOMAIN_ID = IN_DOMAIN_ID " + NL + 477 " AND MODIFICATION_DATE = IN_MODIFICATION_DATE; " + NL + 478 " GET DIAGNOSTICS out_updated_count = ROW_COUNT; " + NL + 479 " output_result.intgr := out_updated_count; " + NL + 480 " output_result.tmstp := out_timestamp; " + NL + 481 " RETURN output_result; " + NL + 482 "END; " + NL + 483 "' LANGUAGE 'plpgsql';")) 484 { 485 stmQuery.getMoreResults(Statement.CLOSE_ALL_RESULTS); 487 } 488 s_logger.log(Level.FINEST, "Table UPDATE_BF_BLOGENTR created."); 489 } 490 catch (SQLException sqleExc) 491 { 492 s_logger.log(Level.WARNING, 493 "Failed to create schema " + BLOG_SCHEMA_NAME, sqleExc); 494 throw sqleExc; 495 } 496 finally 497 { 498 DatabaseUtils.closeStatement(stmQuery); 499 } 500 } 501 502 505 public String getInsertBlogAndFetchGeneratedValues( 506 ) throws OSSException 507 { 508 return "select INTGR, TMSTP from INSERT_BF_BLOG (?, ?, ?, ?)"; 509 } 510 511 514 public String getUpdateBlogAndFetchGeneratedValues( 515 ) throws OSSException 516 { 517 return "select INTGR, TMSTP from UPDATE_BF_BLOG (?, ?, ?, ?, ?, ?)"; 518 } 519 520 523 public String getInsertEntryAndFetchGeneratedValues( 524 ) throws OSSException 525 { 526 return "select INTGR, TMSTP from INSERT_BF_BLOGENTR (?, ?, ?, ?, ?, ?)"; 527 } 528 529 532 public String getUpdateEntryAndFetchGeneratedValues( 533 ) throws OSSException 534 { 535 return "select INTGR, TMSTP from UPDATE_BF_BLOGENTR (?, ?, ?, ?, ?, ?, ?)"; 536 } 537 } 538 | Popular Tags |