[ 
https://issues.apache.org/jira/browse/DERBY-2136?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15000568#comment-15000568
 ] 

Ilguiz Latypov commented on DERBY-2136:
---------------------------------------

Should this be re-opened for the case of the shell script startNetworkServer 
executed in Cygwin?  The intent of the eval clause appears to parse a 
whitespace-separated value DERBY_OPTS into multiple arguments.  But this has a 
side effect of interpreting the backslash, converting "c:\databases" to 
"c:databases".

{code:none}
latypil@MLIW3FZ8G12 /cygdrive/c/db-derby-10.11.1.1-bin/bin
$ DERBY_OPTS='-Dderby.system.home=c:\databases' bash -x startNetworkServer
[..]
+ derby_exec_command='exec "/cygdrive/c/ProgramData/Oracle/Java/javapath/java" 
-Dderby.system.home=c:\databases -classpath 
"C:/db-derby-10.11.1.1-bin/lib/derby.jar;C:/db-derby-10.11.1.1-bin/lib/derbynet.jar;C:/db-derby-10.11.1.1-bin/lib/derbytools.jar;C:/db-derby-10.11.1.1-bin/lib/derbyclient.jar"
 org.apache.derby.drda.NetworkServerControl start '
+ eval exec '"/cygdrive/c/ProgramData/Oracle/Java/javapath/java"' 
'-Dderby.system.home=c:\databases' -classpath 
'"C:/db-derby-10.11.1.1-bin/lib/derby.jar;C:/db-derby-10.11.1.1-bin/lib/derbynet.jar;C:/db-derby-10.11.1.1-bin/lib/derbytools.jar;C:/db-derby-10.11.1.1-bin/lib/derbyclient.jar"'
 org.apache.derby.drda.NetworkServerControl start
++ exec /cygdrive/c/ProgramData/Oracle/Java/javapath/java 
-Dderby.system.home=c:databases -classpath 
'C:/db-derby-10.11.1.1-bin/lib/derby.jar;C:/db-derby-10.11.1.1-bin/lib/derbynet.jar;C:/db-derby-10.11.1.1-bin/lib/derbytools.jar;C:/db-derby-10.11.1.1-bin/lib/derbyclient.jar'
 org.apache.derby.drda.NetworkServerControl start
Wed Nov 11 10:33:24 EST 2015 : Security manager installed using the Basic 
server security policy.
Wed Nov 11 10:33:25 EST 2015 : Apache Derby Network Server - 10.11.1.1 - 
(1616546) started and ready to accept connections on port 1527
{code}

The following patch works for me.

{code:none}
--- startNetworkServer.orig     2015-08-19 10:18:40.858650900 -0400
+++ startNetworkServer  2015-11-11 10:56:03.271674100 -0500
@@ -137,54 +137,18 @@
   CYGHOME=`cygpath --$format "$HOME"`
 fi

-# add a second backslash to variables terminated by a backslash under cygwin
-if $cygwin; then
-  case "$DERBY_HOME" in
-    *\\ )
-    DERBY_HOME="$DERBY_HOME\\"
-    ;;
-  esac
-  case "$CYGHOME" in
-    *\\ )
-    CYGHOME="$CYGHOME\\"
-    ;;
-  esac
-  case "$LOCALCLASSPATH" in
-    *\\ )
-    LOCALCLASSPATH="$LOCALCLASSPATH\\"
-    ;;
-  esac
-  case "$CLASSPATH" in
-    *\\ )
-    CLASSPATH="$CLASSPATH\\"
-    ;;
-  esac
-fi
-
 # Readjust classpath for MKS
 # expr match
 if [ \( "`expr $SHELL : '.*sh.exe$'`" -gt 0 \) -a \( "$cygwin" = "false" \) ]; 
then
   LOCALCLASSPATH=`echo $LOCALCLASSPATH | sed -E 's/([\d\w]*):([\d\w]*)/\1;\2/g
 '`
 fi
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-
-#   http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.

-derby_exec_command="exec \"$JAVACMD\" $DERBY_OPTS -classpath 
\"$LOCALCLASSPATH\" org.apache.derby.drda.NetworkServerControl start $@"
-eval $derby_exec_command
+# Unlike Bash variable assignments, double quotes in the exec line preserve the
+# content from word expansion.  We keep JAVACMD, LOCALCLASSPATH as single
+# words.  We expand DERBY_OPTS into possibly multiple words.  We could expand
+# DERBY_OPTS beforehand with derby_opts_array=($DERBY_OPTS) and then let shell
+# expand the array notation "${derby_opts_array[@]}" into words.  The "$@"
+# construct expands this script's arguments into multiple words similarly to
+# the array notation "${var[@]}".
+exec "$JAVACMD" $DERBY_OPTS -classpath "$LOCALCLASSPATH" 
org.apache.derby.drda.NetworkServerControl start "$@"
{code}

The trace of the script shows preserved back-slashes,

{code:none}
+ exec /cygdrive/c/ProgramData/Oracle/Java/javapath/java 
'-Dderby.system.home=c:\databases' -classpath 
'C:/db-derby-10.11.1.1-bin/lib/derby.jar;C:/db-derby-10.11.1.1-bin/lib/derbynet.jar;C:/db-derby-10.11.1.1-bin/lib/derbytools.jar;C:/db-derby-10.11.1.1-bin/lib/derbyclient.jar'
 org.apache.derby.drda.NetworkServerControl start
Wed Nov 11 10:58:11 EST 2015 : Security manager installed using the Basic 
server security policy.
Wed Nov 11 10:58:11 EST 2015 : Apache Derby Network Server - 10.11.1.1 - 
(1616546) started and ready to accept connections on port 1527
{code}


> Can't set system directory with derby.system.home for Network Server
> --------------------------------------------------------------------
>
>                 Key: DERBY-2136
>                 URL: https://issues.apache.org/jira/browse/DERBY-2136
>             Project: Derby
>          Issue Type: Bug
>          Components: Documentation, Network Server
>            Reporter: Frederik
>            Priority: Minor
>
> I'm a total newcomer to Derby. Decided to play with it today after reading 
> http://www.regdeveloper.co.uk/2006/11/08/java_database_derby
> I want to use the Network Server deployment mode. For determining the System 
> Directory (which holds properties file and the database directories, etc), I 
> understood from docs (e.g. 
> http://db.apache.org/derby/docs/10.2/devguide/cdevdvlp27610.html) that I 
> should set derby.system.home. 
> I tried (using the newer scripts in $DERBY_HOME/bin)
> export DERBY_OPTS=-Dderby.system.home=/data/derby 
> startNetworkServer
> but that failed to set the system directory properly (as witnessed by 
> "NetworkServerControl sysinfo"). It was using current directory when starting 
> derby.
> I finally discovered that it works if I do 
> export DERBY_OPTS=-Duser.dir=/data/derby 
> startNetworkServer
> That seems to be either a bug or a docbug to me. 
> (Almost all docs are using the scripts in 
> $DERBY_HOME/frameworks/NetworkServer/bin instead of the newer ones in ./bin ; 
> except for http://db.apache.org/derby/docs/10.2/getstart/ and the mention in 
> 10.2 release notes)



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

Reply via email to