Justin Reock created KARAF-3449:
-----------------------------------

             Summary: Incorrect serverName parsing in JDBC DataSource Blueprint
                 Key: KARAF-3449
                 URL: https://issues.apache.org/jira/browse/KARAF-3449
             Project: Karaf
          Issue Type: Bug
          Components: karaf-feature, karaf-osgi
    Affects Versions: 3.0.2
            Reporter: Justin Reock
            Priority: Minor


The serverName attribute in the JDBC DataSource code appears to be parsed 
incorrectly.  It is tokenizing off of the ? character, but a trailing slash 
exists between the database name and the ? parameter delimiter, so a request 
for a database is matched against "[database_name]/" as opposed to just 
"[database_name]".  

This may be isolated to just the PGPoolingDataSource for Postgres, I haven't 
tried to replicate with another connection driver.  

To demonstrate, set up a DataSource blueprint similar to the following:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>
  
   <bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" 
destroy-method="close">
      <property name="serverName" value="localhost:5432/postgres"/>
      <property name="user" value="postgres"/>
      <property name="password" value="pgpassword"/>
      <property name="dataSourceName" value="pgConnectionPool"/>
      <property name="initialConnections" value="5"/>
      <property name="maxConnections" value="50" />
  </bean>
  
  <service interface="javax.sql.DataSource" ref="dataSource">
    <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/postgres"/>
    </service-properties>
  </service>
</blueprint>

---

Note that the intended database name from the serverName string here is 
"postgres".  Upon attempting jdbc actions, the following error message will be 
returned from the DataSource:

2015-01-16 16:22:32,398 | ERROR | h for user karaf | JdbcServiceImpl            
      | 119 - org.apache.karaf.jdbc.core - 3.0.2 | Can't get information about 
datasource jdbc/postgres
org.postgresql.util.PSQLException: FATAL: database "postgres/" does not exist

Notice the trailing slash after the database name.  That's because the 
qualified URL for the database is:

jdbc:postgresql://localhost:5432:postgres/?loginTimeout=0&socketTimeout=0&prepareThreshold=5&unknownLength=2147483647&tcpKeepAlive=false&binaryTransfer=true&disableColumnSanitiser=false

The trailing slash is coming in because the qualified name is being parsed 
using the ? as a delimiter.  This is provable, because the following serverName 
property can be used as a workaround:

 <property name="serverName" value="localhost:5432/postgres?"/>

Note the ? at the end of the value.  This forces the interpreter to parse the 
proper database name.  So the fix here would be either to account for the 
trailing slash in the qualified name, or, not to append the slash at all when 
deriving the qualified name.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to