meadow-endpoints 4.0.20 → 4.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4546,7 +4546,7 @@ libAsyncWaterfall([// Step 1: Get the record countfrom the data source
4546
4546
  function(fStageComplete){if(pMeadow.rawQueries.checkQuery('Count')){pQuery.parameters.queryOverride=pMeadow.rawQueries.getQuery('Count');}pMeadow.provider.Count(pQuery,function(){fStageComplete(pQuery.result.error,pQuery);});},// Step 2: Validate the resulting value
4547
4547
  function(pQuery,fStageComplete){// Check if query time exceeded threshold in settings. Log if slow.
4548
4548
  var tmpProfileTime=new Date().getTime()-tmpProfileStart.getTime();if(tmpProfileTime>(pMeadow.fable.settings['QueryThresholdWarnTime']||200)){pMeadow.logSlowQuery(tmpProfileTime,pQuery);}if(typeof pQuery.parameters.result.value!=='number'){// The return value is a number.. something is wrong.
4549
- return fStageComplete('Count did not return valid results.',pQuery,false);}fStageComplete(pQuery.result.error,pQuery,pQuery.result.value);}],function(pError,pQuery,pCount){if(pError){pMeadow.fable.log.warn('Error during the count waterfall',{Error:pError,Message:pError.message,Query:pQuery.query});}fCallBack(pError,pQuery,pCount);});return pMeadow;};module.exports=meadowBehaviorCount;},{"async/waterfall":33}],219:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4549
+ return fStageComplete('Count did not return valid results.',pQuery,false);}fStageComplete(pQuery.result.error,pQuery,pQuery.result.value);}],function(pError,pQuery,pCount){if(pError){pMeadow.fable.log.warn('Error during the count waterfall',{Error:pError,Message:pError.message,Query:pQuery.query});}fCallBack(pError,pQuery,pCount);});return pMeadow;};module.exports=meadowBehaviorCount;},{"async/waterfall":33}],219:[function(require,module,exports){(function(setImmediate){(function(){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4550
4550
  /**
4551
4551
  * @license MIT
4552
4552
  * @author <steven@velozo.com>
@@ -4570,7 +4570,11 @@ function(fStageComplete){// Reject missing records here — the old Step 0 owned
4570
4570
  // error and downstream steps assume pQuery.query.records[0]
4571
4571
  // exists. Same string and trailing-args shape as before so
4572
4572
  // existing callers' expectations are preserved.
4573
- if(!pQuery.query.records||!pQuery.query.records[0]){return fStageComplete('No record submitted',pQuery,false);}libRenameSoftDeletedConflicts(pMeadow,pQuery.query.records[0],function(pPreflightError){if(pPreflightError){pMeadow.fable.log.warn('Error during the unique-constraint pre-flight',{Error:pPreflightError,Message:pPreflightError&&pPreflightError.message});return fStageComplete(pPreflightError,pQuery,false);}return fStageComplete();});},// Step 1: Create the record in the data source
4573
+ if(!pQuery.query.records||!pQuery.query.records[0]){return fStageComplete('No record submitted',pQuery,false);}libRenameSoftDeletedConflicts(pMeadow,pQuery.query.records[0],function(pPreflightError){if(pPreflightError){pMeadow.fable.log.warn('Error during the unique-constraint pre-flight',{Error:pPreflightError,Message:pPreflightError&&pPreflightError.message});return setImmediate(fStageComplete,pPreflightError,pQuery,false);}// Defer via setImmediate so synchronous providers (node:sqlite,
4574
+ // previously better-sqlite3) cannot stack-accumulate frames
4575
+ // across a long synchronous chain of Creates — every record's
4576
+ // pre-flight returns to the event loop before the INSERT runs.
4577
+ return setImmediate(fStageComplete);});},// Step 1: Create the record in the data source
4574
4578
  function(fStageComplete){if(!pQuery.query.IDUser){// The user ID is not already set, set it magically.
4575
4579
  if(typeof pQuery.userID==='number'&&pQuery.userID%1===0&&pQuery.userID>=0){pQuery.query.IDUser=pQuery.userID;}else{pQuery.query.IDUser=pMeadow.userIdentifier;}}// Merge in the default record with the passed-in record for completeness
4576
4580
  pQuery.query.records[0]=pMeadow.fable.Utility.extend({},pMeadow.schemaFull.defaultObject,pQuery.query.records[0]);// Create override is too complex ... punting for now
@@ -4582,7 +4586,7 @@ if(pQuery.parameters.result.value===false){return fStageComplete('Creation faile
4582
4586
  function(pQuery,pIDRecord,fStageComplete){var tmpQueryRead=pQuery.clone().addFilter(pMeadow.defaultIdentifier,pIDRecord).setDisableDeleteTracking(pQuery.parameters.query.disableDeleteTracking);//if delete tracking is disabled, we need to disable it on this Read operation
4583
4587
  if(pMeadow.rawQueries.checkQuery('Read')){tmpQueryRead.parameters.queryOverride=pMeadow.rawQueries.getQuery('Read');}pMeadow.provider.Read(tmpQueryRead,function(){fStageComplete(tmpQueryRead.result.error,pQuery,tmpQueryRead);});},// Step 4: Marshal the record into a POJO
4584
4588
  function(pQuery,pQueryRead,fStageComplete){// Ensure there is not at least one record returned
4585
- if(pQueryRead.parameters.result.value.length<1){return fStageComplete('No record found after create.',pQuery,pQueryRead,false);}var tmpRecord=pMeadow.marshalRecordFromSourceToObject(pQueryRead.result.value[0]);fStageComplete(pQuery.result.error,pQuery,pQueryRead,tmpRecord);}],function(pError,pQuery,pQueryRead,pRecord){if(pError){pMeadow.fable.log.warn('Error during the create waterfall',{Error:pError,Message:pError.message,Query:pQuery.query,Stack:pError.stack});}fCallBack(pError,pQuery,pQueryRead,pRecord);});return pMeadow;};module.exports=meadowBehaviorCreate;},{"./Meadow-CollisionRename.js":217,"async/waterfall":33}],220:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4589
+ if(pQueryRead.parameters.result.value.length<1){return fStageComplete('No record found after create.',pQuery,pQueryRead,false);}var tmpRecord=pMeadow.marshalRecordFromSourceToObject(pQueryRead.result.value[0]);fStageComplete(pQuery.result.error,pQuery,pQueryRead,tmpRecord);}],function(pError,pQuery,pQueryRead,pRecord){if(pError){pMeadow.fable.log.warn('Error during the create waterfall',{Error:pError,Message:pError.message,Query:pQuery.query,Stack:pError.stack});}fCallBack(pError,pQuery,pQueryRead,pRecord);});return pMeadow;};module.exports=meadowBehaviorCreate;}).call(this);}).call(this,require("timers").setImmediate);},{"./Meadow-CollisionRename.js":217,"async/waterfall":33,"timers":344}],220:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4586
4590
  /**
4587
4591
  * @license MIT
4588
4592
  * @author <steven@velozo.com>
@@ -4663,7 +4667,7 @@ return fStageComplete('No record found to update!',pQueryRead.result,false);}var
4663
4667
  /**
4664
4668
  * @license MIT
4665
4669
  * @author <steven@velozo.com>
4666
- */var MeadowProvider=function(){function createNew(pFable){// If a valid Fable object isn't passed in, return a constructor
4670
+ */var libAsyncEachSeries=require('async/eachSeries');var MeadowProvider=function(){function createNew(pFable){// If a valid Fable object isn't passed in, return a constructor
4667
4671
  if(typeof pFable!=='object'){return{new:createNew};}var _Fable=pFable;var _GlobalLogLevel=0;if(_Fable.settings.ArrayStorage){_GlobalLogLevel=_Fable.settings.ArrayStorage.GlobalLogLevel||0;}if(!_Fable.hasOwnProperty('ALASQL')){// This is going to be problematic.
4668
4672
  _Fable.log.fatal('Meadow is trying to perform queries without a valid [Fable.ALASQL] object. See the documentation for how to initialize one.');return false;}var libALASQL=_Fable.ALASQL;var _Scope='Unknown_Meadow_ALASQL_Scope';var _Schema={};var _DefaultIdentifier='ID';var _DefaultGUIDentifier='GUID';var setSchema=(pScope,pSchema,pDefaultIdentifier,pDefaultGUIdentifier)=>{_Scope=pScope;_Schema=pSchema;_DefaultIdentifier=pDefaultIdentifier;_DefaultGUIDentifier=pDefaultGUIdentifier;return this;};// Create a table for this schema on the fly
4669
4673
  // This is ripped off from https://github.com/stevenvelozo/stricture/blob/master/source/Stricture-Generate-MySQL.js
@@ -4701,7 +4705,24 @@ var Read=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;check
4701
4705
  * Import: true (boolean -- whether or not to import them using the DAL)
4702
4706
  * Data: [] (optional array of records, one object each)
4703
4707
  * }
4704
- */var constructFromObject=pParameters=>{if(typeof pParameters!=='object'||typeof pParameters.Meadow!=='object')return false;// I know there are better ways to do this, but for now I want to keep it very manual
4708
+ *//**
4709
+ * Construct an ALASQL-backed meadow from a JS object array.
4710
+ *
4711
+ * Signatures:
4712
+ * constructFromObject(pParameters) — bindObject path only;
4713
+ * returns meadow synchronously
4714
+ * constructFromObject(pParameters, fCallback) — Import path (doCreate
4715
+ * per record); meadow + records
4716
+ * delivered via fCallback
4717
+ *
4718
+ * The Import path drives `doCreate` per record, which is no longer
4719
+ * guaranteed to complete in the same tick (Meadow-Create's pre-flight
4720
+ * yields via setImmediate to keep bulk-create chains stack-safe on
4721
+ * synchronous providers). Callers that need the imported records
4722
+ * queryable on return must pass a callback. Without a callback the
4723
+ * Import path is rejected — synchronous fire-and-forget imports were
4724
+ * a latent footgun and are no longer supported.
4725
+ */var constructFromObject=(pParameters,fCallback)=>{if(typeof pParameters!=='object'||typeof pParameters.Meadow!=='object')return false;// I know there are better ways to do this, but for now I want to keep it very manual
4705
4726
  if(!(typeof pParameters.Scope==='string'))pParameters.Scope='DATA';if(!(typeof pParameters.ObjectPrototype==='object'))pParameters.ObjectPrototype={};if(!(typeof pParameters.AuditData==='boolean'))pParameters.AuditData=true;if(!(typeof pParameters.Import==='boolean'))pParameters.Import=true;if(!Array.isArray(pParameters.Data))pParameters.Data=[];// Construct a meadow
4706
4727
  var tmpMeadow=pParameters.Meadow.new(_Fable,pParameters.Scope).setProvider('ALASQL');var tmpSchema=[];var tmpDefaultIdentifier;if(pParameters.AuditData){// Add the audit fields to the schema
4707
4728
  tmpDefaultIdentifier='ID'+pParameters.Scope;tmpSchema.push({Column:tmpDefaultIdentifier,Type:"AutoIdentity"});tmpSchema.push({Column:"GU"+tmpDefaultIdentifier,Type:"AutoGUID"});tmpSchema.push({Column:"CreateDate",Type:"CreateDate"});tmpSchema.push({Column:"CreatingIDUser",Type:"CreateIDUser"});tmpSchema.push({Column:"UpdateDate",Type:"UpdateDate"});tmpSchema.push({Column:"UpdatingIDUser",Type:"UpdateIDUser"});tmpSchema.push({Column:"DeleteDate",Type:"DeleteDate"});tmpSchema.push({Column:"DeletingIDUser",Type:"DeleteIDUser"});tmpSchema.push({Column:"Deleted",Type:"Deleted"});}// Now add the fields from the object in
@@ -4710,9 +4731,11 @@ switch(typeof pParameters.ObjectPrototype[tmpProperty]){case"undefined":case"obj
4710
4731
  break;case"boolean":tmpSchema.push({Column:tmpProperty,Type:"Boolean"});break;// Because we can't tell the difference between floating point and not
4711
4732
  case"number":case"string":tmpSchema.push({Column:tmpProperty,Type:"Text"});break;default:break;}if(tmpAdded&&typeof tmpDefaultIdentifier==='undefined')// Just use the first property of the prototype object as the default identifier
4712
4733
  tmpDefaultIdentifier=tmpProperty;}tmpMeadow.setSchema(tmpSchema);if(typeof tmpDefaultIdentifier==='undefined')tmpMeadow.setDefaultIdentifier(tmpDefaultIdentifier);// Now import the data
4713
- if(pParameters.Import){for(var j=0;j<pParameters.Data.length;j++){tmpMeadow.doCreate(tmpMeadow.query.clone().addRecord(pParameters.Data[j]),function(pError,pQuery,pQueryRead,pRecord){// Maybe log the error?
4714
- _Fable.log.trace('Auto imported record',pRecord);});}}else{// Just assign the object
4715
- tmpMeadow.provider.bindObject(pParameters.Data);}return tmpMeadow;};var tmpNewProvider={setSchema:setSchema,marshalRecordFromSourceToObject:marshalRecordFromSourceToObject,constructFromObject:constructFromObject,bindObject:bindObject,Create:Create,Read:Read,Update:Update,Delete:Delete,Undelete:Undelete,Count:Count,getProvider:{},providerCreatesSupported:false,new:createNew};return tmpNewProvider;}return createNew();};module.exports=new MeadowProvider();},{}],226:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4734
+ if(pParameters.Import){if(typeof fCallback!=='function'){_Fable.log.error('Meadow-Provider-ALASQL: constructFromObject called with Import=true but no callback — doCreate is no longer synchronous, callers must await record import.');return false;}libAsyncEachSeries(pParameters.Data,function(pRecord,fNext){tmpMeadow.doCreate(tmpMeadow.query.clone().addRecord(pRecord),function(pError,pQuery,pQueryRead,pCreated){if(pError){_Fable.log.warn('Meadow-Provider-ALASQL: auto-import doCreate failed',{Error:pError,Record:pRecord});}else{_Fable.log.trace('Auto imported record',pCreated);}// Errors are logged but not propagated — the historical
4735
+ // fire-and-forget loop swallowed them, preserve that
4736
+ // shape so partial imports still return a usable meadow.
4737
+ return fNext();});},function(){return fCallback(null,tmpMeadow);});return tmpMeadow;}// Just assign the object
4738
+ tmpMeadow.provider.bindObject(pParameters.Data);if(typeof fCallback==='function'){fCallback(null,tmpMeadow);}return tmpMeadow;};var tmpNewProvider={setSchema:setSchema,marshalRecordFromSourceToObject:marshalRecordFromSourceToObject,constructFromObject:constructFromObject,bindObject:bindObject,Create:Create,Read:Read,Update:Update,Delete:Delete,Undelete:Undelete,Count:Count,getProvider:{},providerCreatesSupported:false,new:createNew};return tmpNewProvider;}return createNew();};module.exports=new MeadowProvider();},{"async/eachSeries":19}],226:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
4716
4739
  /**
4717
4740
  * @license MIT
4718
4741
  * @author <steven@velozo.com>
@@ -5095,12 +5118,58 @@ return pQueryBody.replace(/NOW\(\d*\)/g,"datetime('now')");};/**
5095
5118
  */var coerceParameters=function(pParams){if(typeof pParams!=='object'||pParams===null){return pParams;}var tmpKeys=Object.keys(pParams);for(var i=0;i<tmpKeys.length;i++){var tmpValue=pParams[tmpKeys[i]];if(Array.isArray(tmpValue)){// SQLite (better-sqlite3) cannot bind arrays.
5096
5119
  // For single-element arrays (e.g. from FBL~Field~LT~10),
5097
5120
  // unwrap to the scalar value.
5098
- if(tmpValue.length===1){pParams[tmpKeys[i]]=tmpValue[0];}}else if(typeof tmpValue==='boolean'){pParams[tmpKeys[i]]=tmpValue?1:0;}else if(typeof tmpValue==='undefined'){pParams[tmpKeys[i]]=null;}}return pParams;};// The Meadow marshaller passes in the Schema as the third parameter for JSON/JSONProxy deserialization.
5121
+ if(tmpValue.length===1){pParams[tmpKeys[i]]=tmpValue[0];}}else if(typeof tmpValue==='boolean'){pParams[tmpKeys[i]]=tmpValue?1:0;}else if(typeof tmpValue==='undefined'){pParams[tmpKeys[i]]=null;}}return pParams;};/**
5122
+ * Filter a named-parameters object down to only those keys whose
5123
+ * `:name` form appears in the SQL body.
5124
+ *
5125
+ * node:sqlite is strict about unknown named parameters — passing
5126
+ * a key the prepared statement doesn't reference throws
5127
+ * `Unknown named parameter '<name>'`. better-sqlite3 was lenient
5128
+ * about extras, so this regressed silently when
5129
+ * meadow-connection-sqlite switched to node:sqlite. It matters
5130
+ * whenever Meadow.rawQueries.loadQuery installs an override SQL
5131
+ * whose placeholders are a strict subset of meadow's auto-
5132
+ * generated params (filter columns, soft-delete tracking,
5133
+ * AutoGUID conflict-check), but the filter is cheap and applied
5134
+ * uniformly — also protects any future case where the auto-built
5135
+ * SQL and the params dict drift apart.
5136
+ *
5137
+ * Approach mirrors `convertNamedToPositional` in the PostgreSQL
5138
+ * provider: walk the SQL with /:([A-Za-z_][A-Za-z0-9_]*)/g, keep
5139
+ * names that exist in the params dict, leave the literal alone
5140
+ * otherwise (handles `::typecast`-style sequences without
5141
+ * tripping). Over-matches inside string literals are harmless
5142
+ * because we only ever *keep* params — never invent them.
5143
+ */var filterUsedNamedParams=function(pQueryBody,pNamedParams){if(typeof pNamedParams!=='object'||pNamedParams===null){return pNamedParams;}if(typeof pQueryBody!=='string'){return pNamedParams;}var tmpUsed={};var tmpPattern=/:([A-Za-z_][A-Za-z0-9_]*)/g;var tmpMatch;while((tmpMatch=tmpPattern.exec(pQueryBody))!==null){var tmpName=tmpMatch[1];if(Object.prototype.hasOwnProperty.call(pNamedParams,tmpName)){tmpUsed[tmpName]=pNamedParams[tmpName];}}return tmpUsed;};// The Meadow marshaller passes in the Schema as the third parameter for JSON/JSONProxy deserialization.
5099
5144
  var marshalRecordFromSourceToObject=function(pObject,pRecord,pSchema){// Build lookups for JSON columns (only if schema is provided)
5100
5145
  var tmpJsonColumns={};var tmpProxyColumns={};if(Array.isArray(pSchema)){for(var s=0;s<pSchema.length;s++){if(pSchema[s].Type==='JSON'){tmpJsonColumns[pSchema[s].Column]=true;}else if(pSchema[s].Type==='JSONProxy'&&pSchema[s].StorageColumn){tmpProxyColumns[pSchema[s].StorageColumn]=pSchema[s].Column;}}}for(var tmpColumn in pRecord){if(tmpJsonColumns[tmpColumn]){// JSON type: parse string from DB into object on the same column name
5101
5146
  try{pObject[tmpColumn]=typeof pRecord[tmpColumn]==='string'?JSON.parse(pRecord[tmpColumn]):pRecord[tmpColumn]||{};}catch(pParseError){pObject[tmpColumn]={};}}else if(tmpProxyColumns.hasOwnProperty(tmpColumn)){// JSONProxy: storage column -> parse and assign to virtual column name
5102
5147
  var tmpVirtualColumn=tmpProxyColumns[tmpColumn];try{pObject[tmpVirtualColumn]=typeof pRecord[tmpColumn]==='string'?JSON.parse(pRecord[tmpColumn]):pRecord[tmpColumn]||{};}catch(pParseError){pObject[tmpVirtualColumn]={};}// Do NOT copy the storage column to the output object
5103
- }else{pObject[tmpColumn]=pRecord[tmpColumn];}}};var Create=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildCreateQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(pQuery.query.parameters);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=Number(tmpInfo.lastInsertRowid);}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting insert ID during create query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Read=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildReadQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpRows=tmpStatement.all(pQuery.query.parameters);tmpResult.error=null;tmpResult.value=tmpRows;tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Update=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildUpdateQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(pQuery.query.parameters);tmpResult.error=null;tmpResult.value=tmpInfo;tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Delete=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildDeleteQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(pQuery.query.parameters);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpInfo.changes;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting affected rowcount during delete query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Undelete=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildUndeleteQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(pQuery.query.parameters);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpInfo.changes;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting affected rowcount during undelete query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Count=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildCountQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpRows=tmpStatement.all(pQuery.query.parameters);tmpResult.executed=true;tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpRows[0].RowCount;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting rowcount during count query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var tmpNewProvider={marshalRecordFromSourceToObject:marshalRecordFromSourceToObject,Create:Create,Read:Read,Update:Update,Delete:Delete,Undelete:Undelete,Count:Count,getProvider:getProvider,providerCreatesSupported:true,new:createNew};return tmpNewProvider;}return createNew();};module.exports=new MeadowProvider();},{}],236:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
5148
+ }else{pObject[tmpColumn]=pRecord[tmpColumn];}}};var Create=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildCreateQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL
5149
+ // node:sqlite is strict about unknown named parameters, and
5150
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5151
+ // a rawQueries override may not reference.
5152
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(tmpBindParams);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=Number(tmpInfo.lastInsertRowid);}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting insert ID during create query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Read=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildReadQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL —
5153
+ // node:sqlite is strict about unknown named parameters, and
5154
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5155
+ // a rawQueries override may not reference.
5156
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpRows=tmpStatement.all(tmpBindParams);tmpResult.error=null;tmpResult.value=tmpRows;tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Update=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildUpdateQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL —
5157
+ // node:sqlite is strict about unknown named parameters, and
5158
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5159
+ // a rawQueries override may not reference.
5160
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(tmpBindParams);tmpResult.error=null;tmpResult.value=tmpInfo;tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Delete=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildDeleteQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL —
5161
+ // node:sqlite is strict about unknown named parameters, and
5162
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5163
+ // a rawQueries override may not reference.
5164
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(tmpBindParams);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpInfo.changes;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting affected rowcount during delete query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Undelete=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildUndeleteQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL —
5165
+ // node:sqlite is strict about unknown named parameters, and
5166
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5167
+ // a rawQueries override may not reference.
5168
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpInfo=tmpStatement.run(tmpBindParams);tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpInfo.changes;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting affected rowcount during undelete query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}tmpResult.executed=true;}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var Count=function(pQuery,fCallback){var tmpResult=pQuery.parameters.result;pQuery.setDialect('SQLite').buildCountQuery();var tmpQueryBody=fixDateFunctions(pQuery.query.body);coerceParameters(pQuery.query.parameters);// Filter to keys actually referenced as :name in the SQL —
5169
+ // node:sqlite is strict about unknown named parameters, and
5170
+ // meadow auto-generates filter/Deleted/AutoGUID params that
5171
+ // a rawQueries override may not reference.
5172
+ var tmpBindParams=filterUsedNamedParams(tmpQueryBody,pQuery.query.parameters);if(pQuery.logLevel>0){_Fable.log.trace(tmpQueryBody,pQuery.query.parameters);}try{var tmpDB=getDB();if(!tmpDB){tmpResult.error=new Error('No SQLite database connection available.');tmpResult.executed=true;return fCallback();}var tmpStatement=tmpDB.prepare(tmpQueryBody);var tmpRows=tmpStatement.all(tmpBindParams);tmpResult.executed=true;tmpResult.error=null;tmpResult.value=false;try{tmpResult.value=tmpRows[0].RowCount;}catch(pErrorGettingRowcount){_Fable.log.warn('Error getting rowcount during count query',{Body:tmpQueryBody,Parameters:pQuery.query.parameters});}}catch(pError){tmpResult.error=pError;tmpResult.value=false;tmpResult.executed=true;}return fCallback();};var tmpNewProvider={marshalRecordFromSourceToObject:marshalRecordFromSourceToObject,Create:Create,Read:Read,Update:Update,Delete:Delete,Undelete:Undelete,Count:Count,getProvider:getProvider,providerCreatesSupported:true,new:createNew};return tmpNewProvider;}return createNew();};module.exports=new MeadowProvider();},{}],236:[function(require,module,exports){// ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
5104
5173
  /**
5105
5174
  * @license MIT
5106
5175
  * @author <steven@velozo.com>