Thank you, I appreciate all your insight. > On Jun 29, 2020, at 13:04, OCsite <o...@ocs.cz> wrote: > > Don, > >> On 29 Jun 2020, at 17:16, Don Lindsay <pccd...@me.com >> <mailto: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