1. Java / Говнокод #6436

    +72

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    public class Tm_SP_RP extends Tm_Service implements IObject{
    	private static final String m_MsgProfileStore =
    		"UPDATE TM_SP_RP SET strMsgProfile=? WHERE nServiceID=?";
    	private static final String m_WorkaroundHack =
    		"SELECT data_type FROM user_tab_columns WHERE table_name='TM_SP_RP' AND column_name='STRMSGPROFILE'";
    
    	private String strMsgProfile = null;
    
    /* Здесь ещё разные всякие методы */
    
            private static String getWorkaroundType(Connection conn) throws SQLException
        {
        	PreparedStatement stmt = conn.prepareStatement(m_WorkaroundHack);
        	try
        	{
        		ResultSet rset = stmt.executeQuery();
        		try
        		{
        			if (!rset.next())
        				return "VARCHAR2";
        			return rset.getString(1);
        		}
        		finally
        		{
        			if (rset != null)
        				rset.close();
        		}
        	}
        	finally
        	{
        		if (stmt!=null)
        			stmt.close();
        	}
        }
    
    	public void storeMsgProfile(Connection conn) throws SQLException
    	{
    		String w_around = getWorkaroundType(conn); 
    		
        	PreparedStatement stmt = conn.prepareStatement(m_MsgProfileStore);
        	try
        	{
        		if (w_around.equalsIgnoreCase("VARCHAR2") ||
        			w_around.equalsIgnoreCase("VARCHAR"))
        		{
        			if (strMsgProfile == null)
        				stmt.setNull(1, Types.NULL);
        			else
        				stmt.setString(1, strMsgProfile);
        		}
        		else
        		{
        			byte []data = (strMsgProfile == null) ?
    	    				new byte[0] : strMsgProfile.getBytes();
    	    		stmt.setBytes(1, data);
        		}
        		
        		stmt.setLong(2, this.getId());
        		
        		stmt.executeUpdate();
        	}
        	finally
        	{
        		if (stmt!=null)
        			stmt.close();
        	}
    	}
    }

    Комбинация из багованных JDBC-дров Oracle и работающего с ним Hibernate (чтоб он сдох) иногда заставляет рождать вот такие хитрые workaround-хаки. Несколько баз, в одной тип поля - LONG, в другой - VARCHAR2.

    Запостил: SadKo, 21 Апреля 2011

    Комментарии (5) RSS

    • IObject
      Ответить
      • Что-то смущает?
        Ответить
        • я понимаю, когда такое название носит абстрактный класс - как, например, QObject. И, напротив, совершенно не понимаю, если это интерфейс - в котором не заложено никакой базовой функциональности.
          Хотя, несмотря на мое непонимание, такой подход тоже имеет право на жизнь.
          Ответить
    • Попробуй комбинацию из головы и прямых рук.
      Ответить

    Добавить комментарий