re genericize-strategy

> 2. or could I do something with db-entity tag so that it would ref the 
> defaultSchema?


I did some hacking with the cayenne-modeler-generated map.xml config file.   
Unexpectedly, all of my map.xml hacks worked as expected (see below.

As best as I can tell (from “blackbox” testing - using cayenne log files to 
verify), removing the [schema=“dbname”] ref results in cayenne-runtime 
generating SQL-FROM with an unqualified table-name (i.e. appropriate behavior). 
 Then when I went further, and deleted the default schema tag, runtime still 
created an unqualified FROM (i.e. appropriate behavior).

It Appears:
If the schema-refs and default-schema tags are removed from map.xml, then 
cayenne-runtime relies upon the connection-url as the dbname - namespace.  This 
appears to be standard behavior written into cayenne.

Question:
1. is there any down-side to configuring the project absent the schema-refs (as 
described in these hacks)?
2. note: cayenne-runtime seems to respond with the appropriate behavior, so my 
guess is that someone designed it this way



TESTS 
(all 4x tests passed)
Cayenne v4.0.1
—————————————————————————————————————————————————

original: (cayenne map.xml config with no mods) 
———————————
map.xml: 
        <db-entity name=“table1" schema=“database1”>
cayenne runtime sql: 
        …
        from database1.table1


hack1: (blank schema ref)
———————————
map.xml: 
         <property name="defaultSchema" value=“database1"/> 
        ...
        <db-entity name=“table1" schema=“”>
cayenne runtime sql: 
        …
        from table1


hack2: (schema ref deleted)
———————————
map.xml: 
         <property name="defaultSchema" value=“database1"/> 
        ...
        <db-entity name=“table1">
cayenne runtime sql: 
        …
        from table1


hack3: (schema ref & defaultSchema tag deleted)
———————————
map.xml: 
        <db-entity name=“table1">
cayenne runtime sql: 
        …
        from table1


Joe



> On Jul 7, 2019, at 11:18 AM, Joe Baldwin <[email protected]> wrote:
> 
> John,
> 
>> https://stackoverflow.com/questions/18948418/set-database-path-in-cayenne
> 
> 
> Thanks for the link.   I perused Andrus’ post, as well as the embedded link.  
>  I am not quite following your suggested strategy though …
> 
> 1. As best as I can tell, the posting suggests a strategy that addresses the 
> connection-url (not the multiple schema-refs in the cayenne-generated map.xml 
> file)
> 
> 2. Core Issue:
>       - if I did not define the problem well enough, here is an example ...
>       - (from log-file analysis), cayenne-runtime generates select statements 
> with fully qualified table names
>               - ex: "d1.t1”
>       - it appears to get “d1” from the cayenne-modeler generated map.xml 
> file schema-ref
>               ex:  "<db-entity name=“t1" schema=“d1”>”
>               - there are currently about 25-30 references in the cayenne 
> config files
>       - changing the connection-url alone does *not* change the dbname in the 
> runtime-select-statements (per log file)
>               - if I just change the connection-url to another dbname, 
> cayenne still uses the map.xml schema references to qualify the table names
>               - so even if you specify “d0” in your connection url, cayenne 
> will override and generate sql based on the scheme-ref “d1" in the map.xml 
> file
>       - therefore, in order to support multiple instances of my app (each 
> with a separate dbname), I am forced to change all 25-30 schema-refs for 
> every instance I support. 
> 
> 3. My goal:
>       - genericize the 25-30x schema-refs to 1x schema-ref, so that I can 
> deploy to multiple instances (each with its own dbname).
>       - I am hoping for a DBMS-like namespace specifier (like “use dbname”) 
> to change the schema-ref in one location.
> 
> 
> Comments:
> 1. my current strategy manual strategy is working - it is just “klunky”, and 
> does not easily support CI/CD.
> 2. Just trying to find out if the (schema-namespace / single-change) strategy 
> is possible - if not, I will just go with the manual strategy
> 
> To Simplify:
> 1. Is there a way to specify the dbname in *one* location (like a single 
> config file, or gradle param)?
> 2. or could I do something with db-entity tag so that it would ref the 
> defaultSchema?
>       <property name="defaultSchema" value="cmstest"/>
>       so instead of
>                <db-entity name=“t1" schema=“d1”>
>       it might say:
>                <db-entity name=“t1" schema='use-default'>
> 
> 
> Thanks,
> Joe
> 
> 
> 
> 
>> On Jul 6, 2019, at 10:04 PM, John Huss <[email protected]> wrote:
>> 
>> https://stackoverflow.com/questions/18948418/set-database-path-in-cayenne
>> 
>> On Sat, Jul 6, 2019 at 8:36 PM Joe Baldwin <[email protected]> wrote:
>> 
>>> I am trying to genericize the map.xml for multiple instances with multiple
>>> dbnames (looking for a “use <dbname>” analogue for cayenne config files -
>>> or a better idea if you have one)
>>> 
>>> Details ...
>>> 
>>> Context:
>>> cayenne: 4.0.1
>>> db: mysql 8.0.16
>>> dbname: “cms" / “cmstest" / "cms_<bunch of others suffixes>” (all
>>> referring to the same schema)
>>> 
>>> Goals:
>>> - migrate to cicd (gradle, git, jenkins, automated testing,etc)
>>> - support testing configurations, as well as multiple instances of the
>>> same app but with unique dbnames
>>> 
>>> Prob:
>>> While trying to migrate to fully automated testing (using junit-5) I hit a
>>> snag:
>>> - the cayenne map.xml has the datasource name (“cms” in this instance)
>>> embedded in the map.xml config file:
>>> 
>>>       <property name="defaultSchema" value="cms”/>
>>>       ...
>>>       <db-entity name="admin" schema="cms">
>>>               …
>>>       </db-entity>
>>> 
>>> So the general idea I had was to create a tmp-test database (cmstest), run
>>> the junit tests for unit & complex unit testing configured using gradle,
>>> then move on to a more complex testing config downstream.   When I deploy
>>> it will be to multiple instances (with unique dbnames).
>>> 
>>> But I cannot figure out how to genericize this map.xml so that I can
>>> easily change the datasource name - I could throw sed/awk at it - to change
>>> all the schema-name-refs, but I was hoping for something a bit more
>>> cayenne-oriented (and less brittle than sed/awk).
>>> 
>>> Ideally, I am searching for a cayenne-analogue to mysql “use <dbname>” so
>>> that I could change the datasource name in one location (vs 25).
>>> 
>>> Thanks
>>> Joe
>>> PS if you have any other gradle tricks that you rely on, please do send a
>>> link
>>> 
>>> 
> 

Reply via email to