Revision: 6599
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6599&view=rev
Author: gerdwagner
Date: 2012-03-12 21:35:28 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
Hibernate Plugin:
- Support for JDBC standard date/time/timestamp escape strings in hql queries. (String are parsed and converted to hql parameters).
Modified Paths:
--------------
trunk/sql12/doc/src/main/resources/changes.txt
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasAccessor.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasExternalService.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLEntryPanelManager.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java
trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/I18NStrings.properties
Added Paths:
-----------
trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/JDBCTemporalEscapeParse.java
Modified: trunk/sql12/doc/src/main/resources/changes.txt
===================================================================
--- trunk/sql12/doc/src/main/resources/changes.txt 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/doc/src/main/resources/changes.txt 2012-03-12 21:35:28 UTC (rev 6599)
@@ -12,6 +12,7 @@
Hibernate Plugin:
- Support of hql results that return plain values instead of mapped objects. Mixes of plain values mapped objects are supported, too.
- Support of data changing hql statements.
+ - Support for JDBC standard date/time/timestamp escape strings in hql queries. (String are parsed and converted to hql parameters).
DBCopy Plugin:
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasAccessor.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasAccessor.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasAccessor.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -2,6 +2,7 @@
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
import net.sourceforge.squirrel_sql.client.session.ISession;
+import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
@@ -15,7 +16,8 @@
public static void quoteHQL(ISQLEntryPanel entryPanel, ISession session)
{
- EditExtrasExternalService si = getService(session);
+ // i18n[EditExtrasAccessor.editextrasPluginNeeded=Quoting is only available with the Edit Extras Plugin.\nGet the plugin from www.squirrelsql.org. It's free.]
+ EditExtrasExternalService si = getService(session, s_stringMgr.getString("EditExtrasAccessor.editextrasPluginNeeded"));
if(null != si)
{
@@ -26,7 +28,7 @@
public static void quoteHQLSb(ISQLEntryPanel entryPanel, ISession session)
{
- EditExtrasExternalService si = getService(session);
+ EditExtrasExternalService si = getService(session, s_stringMgr.getString("EditExtrasAccessor.editextrasPluginNeeded"));
if(null != si)
{
@@ -34,13 +36,11 @@
}
}
- private static EditExtrasExternalService getService(ISession session)
+ private static EditExtrasExternalService getService(ISession session, String msg)
{
EditExtrasExternalService si = (EditExtrasExternalService) session.getApplication().getPluginManager().bindExternalPluginService("editextras", EditExtrasExternalService.class);
if (null == si)
{
- // i18n[EditExtrasAccessor.editextrasPluginNeeded=Quoting is only available with the Edit Extras Plugin.\nGet the plugin from www.squirrelsql.org. It's free.]
- String msg = s_stringMgr.getString("EditExtrasAccessor.editextrasPluginNeeded");
JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), msg);
return null;
}
@@ -49,10 +49,21 @@
public static void unquoteHQL(ISQLEntryPanel entryPanel, ISession session)
{
- EditExtrasExternalService si = getService(session);
+ EditExtrasExternalService si = getService(session, s_stringMgr.getString("EditExtrasAccessor.editextrasPluginNeeded"));
if(null != si)
{
si.unquoteSQL(entryPanel);
}
}
+
+ public static String escapeDate(ISQLEntryPanel entryPanel, ISession session)
+ {
+ // i18n[EditExtrasAccessor.editextrasPluginNeededForEscapeDate=Escape date is only available with the Edit Extras Plugin.\nGet the plugin from www.squirrelsql.org. It's free.]
+ EditExtrasExternalService si = getService(session, s_stringMgr.getString("EditExtrasAccessor.editextrasPluginNeededForEscapeDate"));
+ if(null != si)
+ {
+ return si.getDateEscape(GUIUtils.getOwningFrame(entryPanel.getTextComponent()));
+ }
+ return null;
+ }
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasExternalService.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasExternalService.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/EditExtrasExternalService.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -2,6 +2,8 @@
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
+import java.awt.*;
+
public interface EditExtrasExternalService
{
void quoteSQL(ISQLEntryPanel entryPanel);
@@ -9,4 +11,6 @@
void quoteSQLSb(ISQLEntryPanel entryPanel);
void unquoteSQL(ISQLEntryPanel entryPanel);
+
+ String getDateEscape(Window parentForDialog);
}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLEntryPanelManager.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLEntryPanelManager.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/HQLEntryPanelManager.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -77,9 +77,31 @@
};
unquoteHql.putValue(Action.SHORT_DESCRIPTION, strUnquote);
addToSQLEntryAreaMenu(unquoteHql, "unquote");
+
+ // i18n[HQLEntryPanelManager.escapeDate=Escape date]
+ String strEscapeDate = s_stringMgr.getString("HQLEntryPanelManager.escapeDate");
+ AbstractAction escapeDate = new AbstractAction(strUnquote)
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ onEscapeDate();
+ }
+ };
+ unquoteHql.putValue(Action.SHORT_DESCRIPTION, strEscapeDate);
+ addToSQLEntryAreaMenu(escapeDate, "date");
}
+ private void onEscapeDate()
+ {
+ String str = EditExtrasAccessor.escapeDate(getEntryPanel(), getSession());
+ if(null != str)
+ {
+ getEntryPanel().replaceSelection(str);
+ }
+ }
+
+
private void initBookmarks()
{
HQLBookmarksAction hba = new HQLBookmarksAction(getSession().getApplication(), _resources, getEntryPanel());
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HibernateServerConnectionImpl.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -5,7 +5,6 @@
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
-import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;
@@ -38,7 +37,12 @@
{
try
{
+ JDBCTemporalEscapeParse jdbcTemporalEscapeParse = new JDBCTemporalEscapeParse(hqlQuery);
+ if(jdbcTemporalEscapeParse.hasEscapes())
+ {
+ hqlQuery = jdbcTemporalEscapeParse.getHql();
+ }
Class sessionFactoryImplementorClass = (Class) new ReflectionCaller().getClass("org.hibernate.engine.SessionFactoryImplementor", _cl).getCallee();
@@ -243,8 +247,30 @@
try
{
- ReflectionCaller rc = getRcHibernateSession().callMethod("createQuery", hqlQuery);
+ JDBCTemporalEscapeParse jdbcTemporalEscapeParse = new JDBCTemporalEscapeParse(hqlQuery);
+ ReflectionCaller rc;
+ if(jdbcTemporalEscapeParse.hasEscapes())
+ {
+ rc = getRcHibernateSession().callMethod("createQuery", jdbcTemporalEscapeParse.getHql());
+
+ TreeMap<String, Date> datesByParamName = jdbcTemporalEscapeParse.getDatesByParamName();
+ for (String paramName : datesByParamName.keySet())
+ {
+ RCParam param = new RCParam();
+ param.add(paramName, String.class);
+ param.add(datesByParamName.get(paramName), Object.class);
+ rc.callMethod("setParameter", param);
+ }
+
+ ret.setMessagePanelInfoText("Temporal values were parameterized:\n" + jdbcTemporalEscapeParse.getMessagePanelInfoText());
+ }
+ else
+ {
+ rc = getRcHibernateSession().callMethod("createQuery", hqlQuery);
+ }
+
+
if (isDataUpdate(hqlQuery))
{
int updateCount = (Integer)rc.callMethod("executeUpdate").getCallee();
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/HqlQueryResult.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -11,6 +11,7 @@
private HashMap<String, Throwable> _sessionAdminExceptions = new HashMap<String, Throwable>();
private Integer _updateCount;
+ private String _messagePanelInfoText;
public void putSessionAdminException(String msgKey, Throwable t)
{
@@ -51,4 +52,14 @@
{
return _updateCount;
}
+
+ public void setMessagePanelInfoText(String messagePanelInfoText)
+ {
+ _messagePanelInfoText = messagePanelInfoText;
+ }
+
+ public String getMessagePanelInfoText()
+ {
+ return _messagePanelInfoText;
+ }
}
Added: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/JDBCTemporalEscapeParse.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/JDBCTemporalEscapeParse.java (rev 0)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/server/JDBCTemporalEscapeParse.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -0,0 +1,237 @@
+package net.sourceforge.squirrel_sql.plugins.hibernate.server;
+
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class JDBCTemporalEscapeParse
+{
+
+ private String _hql;
+ private TreeMap<String, Date> _datesByParamName = new TreeMap<String, Date>();
+ private TemporalData[] _temporalDatas = new TemporalData[]{new TimeStampData(), new DateData(), new TimeData()};
+
+
+ public JDBCTemporalEscapeParse(String hql)
+ {
+ _hql = hql;
+
+ for (TemporalData temporalData : _temporalDatas)
+ {
+ Matcher matcher = temporalData.getPattern().matcher(_hql);
+ int startIx = 0;
+
+ while(matcher.find(startIx))
+ {
+ if(isInLiteral(matcher.start(), _hql))
+ {
+ startIx = matcher.start() + 1;
+
+ if(startIx >= _hql.length())
+ {
+ break;
+ }
+ }
+ else
+ {
+ Date date = temporalData.valueOf(matcher.group(1));
+
+
+ String paramName = "p" + _datesByParamName.size();
+ _hql = _hql.substring(0, matcher.start()) + ":" + paramName + _hql.substring(matcher.end());
+
+ _datesByParamName.put(paramName, date);
+
+ matcher = temporalData.getPattern().matcher(_hql);
+ }
+ }
+ }
+ }
+
+ private static boolean isInLiteral(int pos, String str)
+ {
+
+ int countLiteralDelims = 0;
+ for (int i = 0; i < pos; i++)
+ {
+ if('\'' == str.charAt(i))
+ {
+ ++countLiteralDelims;
+ }
+ }
+
+ return 1 == countLiteralDelims % 2;
+ }
+
+ public String getMessagePanelInfoText()
+ {
+ String ret = " " + _hql;
+
+ for (String paramName : _datesByParamName.keySet())
+ {
+ ret += "\n " + paramName + "=" +_datesByParamName.get(paramName);
+ }
+
+ return ret;
+ }
+
+ public boolean hasEscapes()
+ {
+ return 0 < _datesByParamName.size();
+ }
+
+ private static interface TemporalData
+ {
+ Date valueOf(String hq1l);
+ Pattern getPattern();
+ }
+
+
+ private static class TimeStampData implements TemporalData
+ {
+
+ @Override
+ public Date valueOf(String str)
+ {
+ try
+ {
+ return Timestamp.valueOf(str);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalArgumentException("Could not interpret " + str + " as " + java.sql.Timestamp.class.getName(), e);
+ }
+ }
+
+ @Override
+ public Pattern getPattern()
+ {
+ return Pattern.compile("\\{ts\\s*'([0-9[:-][\\s][\\.]]+\\s*)'\\}");
+ }
+ }
+
+ private static class DateData implements TemporalData
+ {
+
+ @Override
+ public Date valueOf(String str)
+ {
+ try
+ {
+ return java.sql.Date.valueOf(str);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalArgumentException("Could not interpret " + str + " as " + java.sql.Date.class.getName(), e);
+ }
+ }
+
+ @Override
+ public Pattern getPattern()
+ {
+ return Pattern.compile("\\{d\\s*'([0-9[:-][\\s][\\.]]+\\s*)'\\}");
+ }
+ }
+
+ private static class TimeData implements TemporalData
+ {
+
+ @Override
+ public Date valueOf(String str)
+ {
+ try
+ {
+ return java.sql.Time.valueOf(str);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalArgumentException("Could not interpret " + str + " as " + java.sql.Time.class.getName(), e);
+ }
+ }
+
+ @Override
+ public Pattern getPattern()
+ {
+ return Pattern.compile("\\{t\\s*'([0-9[:-][\\s][\\.]]+\\s*)'\\}");
+ }
+ }
+
+
+ public String getHql()
+ {
+ return _hql;
+ }
+
+ public TreeMap<String, Date> getDatesByParamName()
+ {
+ return _datesByParamName;
+ }
+
+ public static void main(String[] args)
+ {
+ JDBCTemporalEscapeParse jep;
+
+ jep = new JDBCTemporalEscapeParse("dfd {ts '2012-03-08 19:52:21'} sdfdss d 'asdfs {t '20:29:34'}' select {d '2012-03-08'} ");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("'{t '20:29:34'}'");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("{t '20:29:34'}");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("'{t '20:29:34'}'{t '20:29:34'}");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("{t '20:29:34'}'{t '20:29:34'}'");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("dfd {ts '2012-03-08 19:52:21'} sdfdss d 'asdfs {t '20:29:34'}' select {t '20:29:34'} {d '2012-03-08'} ");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("dfd {ts '2012-03-08 19:52:21'} sdfdss d 'asdfs ' select {t '20:29:34'} {d '2012-03-08'} ");
+ System.out.println(jep.getHql());
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+ jep = new JDBCTemporalEscapeParse("dfd sdfdss d 'asdfs {t '20:29:34'} ' select ");
+ System.out.println(">" + jep.getHql() + "<");
+ for (Date date : jep.getDatesByParamName().values())
+ {
+ System.out.println(" date = " + date);
+ }
+
+
+
+ }
+
+
+}
Modified: trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/java/net/sourceforge/squirrel_sql/plugins/hibernate/viewobjects/QueryListCreator.java 2012-03-12 21:35:28 UTC (rev 6599)
@@ -85,6 +85,12 @@
return;
}
+ if(null != _hqlQueryResult.getMessagePanelInfoText())
+ {
+ _session.getApplication().getMessageHandler().showMessage(_hqlQueryResult.getMessagePanelInfoText());
+ }
+
+
if (null == _hqlQueryResult.getQueryResultList())
{
if (null != _hqlQueryResult.getUpdateCount())
Modified: trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/I18NStrings.properties
===================================================================
--- trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/I18NStrings.properties 2012-03-06 21:57:56 UTC (rev 6598)
+++ trunk/sql12/plugins/hibernate/src/main/resources/net/sourceforge/squirrel_sql/plugins/hibernate/I18NStrings.properties 2012-03-12 21:35:28 UTC (rev 6599)
@@ -66,3 +66,7 @@
HibernateSQLPanel.UseConnectionOf.Session=This Session
HibernateSQLPanel.UseConnectionOf=Use connection of:
+
+HQLEntryPanelManager.escapeDate=Escape date
+
+EditExtrasAccessor.editextrasPluginNeededForEscapeDate=Escape date is only available with the Edit Extras Plugin.\nGet the plugin from www.squirrelsql.org. It's free.
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|