Don,

> On 29 Jun 2020, at 17:16, Don Lindsay <pccd...@me.com> wrote:
> Thanks for the information.  This may be the path I will need to go down for 
> this specific project.  

Good luck!

I have checked our sources and actually there were two small gotcha's we did 
bump into:

(i) programmatically added attributes are by default used for locking;
(ii) when adding new attribute, entity does not check whether its DB column is 
unique.

Both of these behaviours might well be intentional, but for us, both of them 
proved a bit at the surprising side. Given we do not run multi-instance, all we 
need to lock on are the PKs; and, we never share DB columns betwixt different 
attributes. Thus, we had to add extra code for both the cases.

Probably not the most elegant approach by far, but this works reliably for us 
for years (not pure Java, but I hope understandable without extra 
Groovy-explaining comments):

===
@Extension(EOEntity) class EntityExtensions {
    ... ...
    void addAttributeIfNeeded(EOAttribute attr) {
        EOAttribute old=this.attributeNamed(attr.name)
        if (!old) {
            EOAttribute clash=this.attributes.find { oa -> 
oa.columnName==attr.columnName }
            if (clash) Exception.raise "cannot add attribute '$attr.name': 
column '$attr.columnName' already exists"
            this.addAttribute(attr)
            NSArray locks=this.attributesUsedForLocking()
            if (locks.contains(attr)) {
                locks.remove(attr)
                this.attributesUsedForLocking=locks
            }
            return
        }
        String ocn=old.className(),ncn=attr.className()
        if (ocn!=ncn) {
            Class 
ocl=_NSUtilities.classWithName(ocn),ncl=_NSUtilities.classWithName(ncn)
            if (ocl!=ncl) { // we may get same classes for different names, eg. 
String/NSString
                if (!ocl) Exception.raise "no class for name '$ocn' attribute 
'$old.name'"
                if (!ncl) Exception.raise "no class for name '$ncn' attribute 
'$attr.name'"
                if (ncl !in ocl) Exception.raise "class '$ncl' incompatible 
with existing '$ocl' attribute '$attr.name'"
            }
        }
        [
         'allowsNull','externalType','precision','scale',/*'width',*/ 
'adaptorValueClass', 'adaptorValueConversionClassName', 
'adaptorValueConversionMethodName', 'adaptorValueType', 'definition', 
'factoryMethodArgumentType', 'isReadOnly', 'prototypeName', 'readFormat', 
'relationshipPath', 'valueFactoryMethodName', 'valueType', 
'valueTypeClassName', 'writeFormat'].each { key ->
            if (old."$key"!=attr."$key") {
                Exception.raise "$key '",attr."$key","' differs from existing 
'"+old."$key"+"' attribute '$attr.name'"
            }
        }
    }
}
===

All the best,
OC 

> 
> Thanks
> 
> Don 
> 
>> On Jun 29, 2020, at 07:14, OCsite <o...@ocs.cz <mailto:o...@ocs.cz>> wrote:
>> 
>> Don,
>> 
>> we do something remotely similar all the time (not creating a complete 
>> model, but adding attributes dynamically at launch to entities). Works 
>> without a glitch, I cannot recall any problem at all with this.
>> 
>> Should work for you as well, I would be rather surprised if you encounter 
>> any problems model-side.
>> 
>> Potential problems might possibly occur at the database side: how do you 
>> read the schema in? We tried lots of things, eventually decided to stick 
>> with low-level DB-specific approach like e.g.,
>> 
>> def sch_list=EOUtilities.rawRowsForSQL(ec,model.name,'select "SCHEMA_PK", 
>> "SCHEMA_NAME" from INFORMATION_SCHEMA.SCHEMATA',null)
>> def table_list=EOUtilities.rawRowsForSQL(ec,model.name,/select "TABLE_PK", 
>> "TABLE_NAME" from INFORMATION_SCHEMA.TABLES where 
>> "SCHEMA_PK"=$schemaPK/,null)
>> 
>> and so forth, which seem to work reliably for our FrontBase. None of the 
>> higher-level APIs we have tried worked reliably for us (note though we not 
>> only read the schema in, but also need to add columns to tables dynamically; 
>> presumably, you won't need that).
>> 
>> All the best,
>> OC
>> 
>>> On 28 Jun 2020, at 17:51, Don Lindsay via Webobjects-dev 
>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> 
>>> wrote:
>>> 
>>> Sorry if I was not clear in my first email.
>>> 
>>> I don’t want to create a EOModel file.  I want to take database connection 
>>> properties from the user of an application and use those to build an 
>>> EOModel that is used in the application while it is running on the server.  
>>> The database connection parameters would be stored in a settings database 
>>> and retrieved when the user wants to load data from that connection.  This 
>>> is a tool to allow users to specify their own data sources and compare data 
>>> between different datasources in whatever manner the user wishes to compare 
>>> or display it.
>>> 
>>> Thanks for all the answers so far I was not aware Apache Cayenne could be 
>>> used as a full replacement for EOF
>>> 
>>> Don 
>>> 
>>> 
>>>> On Jun 25, 2020, at 20:53, Don Lindsay via Webobjects-dev 
>>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> 
>>>> wrote:
>>>> 
>>>> Hello;
>>>> 
>>>> The Documentation for EOModel states that you can build one in code, but 
>>>> there are no examples or further information that I can find.  Does anyone 
>>>> have any documentation or samples that they can direct me to so I can 
>>>> create EOModels while the application is running:
>>>> 
>>>> What I want to do is connect to a database that my app does not know 
>>>> about, someone provides connection parameters and I create an EOModel and 
>>>> connect to that database or rest and access it using the EOModel created 
>>>> using new EOModel().
>>>> 
>>>> Thanks
>>>> 
>>>> Don
>>>> _______________________________________________
>>>> Do not post admin requests to the list. They will be ignored.
>>>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com 
>>>> <mailto:Webobjects-dev@lists.apple.com>)
>>>> Help/Unsubscribe/Update your Subscription:
>>>> https://lists.apple.com/mailman/options/webobjects-dev/pccdonl%40me.com 
>>>> <https://lists.apple.com/mailman/options/webobjects-dev/pccdonl%40me.com>
>>>> 
>>>> This email sent to pccd...@me.com <mailto:pccd...@me.com>
>>> 
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com 
>>> <mailto:Webobjects-dev@lists.apple.com>)
>>> Help/Unsubscribe/Update your Subscription:
>>> https://lists.apple.com/mailman/options/webobjects-dev/ocs%40ocs.cz 
>>> <https://lists.apple.com/mailman/options/webobjects-dev/ocs%40ocs.cz>
>>> 
>>> This email sent to o...@ocs.cz <mailto:o...@ocs.cz>
>> 
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to