@bitblit/ratchet-rdbms 4.0.208-alpha → 4.0.209-alpha
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.
- package/lib/index.mjs +1 -1
- package/lib/index.mjs.map +1 -1
- package/package.json +4 -3
package/lib/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{StringRatchet as t,Logger as e,RequireRatchet as n,ErrorRatchet as r,PromiseRatchet as i,StopWatch as s,TimeoutToken as o,DurationRatchet as a}from"@bitblit/ratchet-common";import c from"lodash";import u from"mysql2/promise";import l from"get-port";import*as h from"tunnel-ssh";class d{fields=[];replacements={};addReplacement(t,...e){this.replacements=Object.assign(this.replacements,t),this.addFields(...e)}appendReplacement(t,e,...n){this.replacements[t]=this.replacements[t]+e,this.addFields(...n)}addFields(...t){this.fields=this.fields.concat(...t)}getFields(){return this.fields}getReplacements(){return this.replacements}static sqlInjectionUnsafeParamRenderer(e){const n=e=>"string"==typeof e?'"'+e+'"':t.safeString(e);return Array.isArray(e)?e.map((t=>n(t))).join(","):n(e)}static renderQueryStringForPasteIntoTool(t,e,n=d.sqlInjectionUnsafeParamRenderer){const r=e??{};let i=d.reformatQueryForLogging(t);if(i){const t=Object.keys(r);t.sort(((t,e)=>e.length-t.length));for(const e of t){const t=":"+e,s=n(r[e]);i=i.split(t).join(s)}i.endsWith(";")||(i+=";")}return i}static reformatQueryForLogging(n,r=80){let i=r;if(!t.trimToNull(n))return null;let s="",o=t.trimToEmpty(n).split("\n").join(" ").split("\r").join(" ");for(;o.length>i;){let n=Math.min(o.length,i);for(;n>0&&![" ",","].includes(o.charAt(n));)n--;n>0?(s+=o.substring(0,n)+"\n",o=t.trimToEmpty(o.substring(n))):(e.silly("Input contains a string longer than the max line length - bumping"),i+=2)}return s+(o.length>0?o:"")}}var y,m;!function(t){t.Default="Default",t.ReadUncommitted="READ UNCOMMITTED"}(y||(y={}));class g{connection;constructor(t){this.connection=t,n.notNullOrUndefined(t)}async getConnection(){return this.connection}async clearConnectionCache(){return e.info("clearConnectionCache ignored - not pooled"),!0}}class f{query;namedParams;paginator;transactionIsolationLevel;constructor(t,e,n,r){this.query=t,this.namedParams=e,this.paginator=n,this.transactionIsolationLevel=r}}!function(t){t.Asc="Asc",t.Desc="Desc"}(m||(m={}));class w{static ALLOWED_SQL_CONSTRUCT=/^[a-z0-9_.`]+$/i;queryProvider;query;meta=Object.freeze({});sqlConstructs={};namedParams={};conditionals={};debugComment="";paginator;debugAnnotateMode=!1;transactionIsolationLevel=y.Default;constructor(t){this.queryProvider=t}clone(){const t=new w(this.queryProvider);return this.query&&t.withBaseQuery(this.query),t.sqlConstructs=c.clone(this.sqlConstructs),t.namedParams=c.clone(this.namedParams),t.conditionals=c.clone(this.conditionals),t.paginator=c.clone(this.paginator),t.debugComment=this.debugComment,t.transactionIsolationLevel=this.transactionIsolationLevel,t}withTransactionIsolationLevel(t){return this.transactionIsolationLevel=t,this}withDebugComment(t){return this.debugComment=t,this}appendDebugComment(t){return this.debugComment=this.debugComment+t,this}withNamedQuery(e){return this.query=this.queryProvider.fetchQuery(e),t.trimToNull(this.query)||r.throwFormattedErr("Requested query that does not exist : %s",e),this.meta=Object.freeze({queryPath:e}),this.withDebugComment(" "+e+" "),this}withBaseQuery(t){this.query=t}withSqlConstruct(t,e){return this.sqlConstructs[t]=e,this}withSqlConstructs(t){return this.sqlConstructs=Object.assign(this.sqlConstructs,t),this}removeParam(t){return delete this.namedParams[t],this}paramNames(){return Object.keys(this.namedParams)}withParam(t,e){return this.namedParams[t]=e,this}withParams(t){return this.namedParams=Object.assign(this.namedParams,t),this}withExpandedParam(t,n,r){const i=t+"Length";let s=this.fetchCopyOfParam(i)??0;if(s>0&&!r){e.silly("Old item found and not extending - removing old params");this.paramNames().filter((e=>e.startsWith(t))).forEach((t=>this.removeParam(t))),s=0}this.withParam(i,n.length+s);for(let e=0;e<n.length;e++){const r=n[e];if("object"==typeof r&&r)for(const n of Object.keys(r)){const i=t+n.charAt(0).toUpperCase()+n.slice(1)+(e+s);this.withParam(i,r[n])}else{const n=t+e;this.withParam(n,r)}}return this}withConditional(t,e=!0){return this.conditionals[t]=e,this}withConditionals(t){return this.conditionals=Object.assign(this.conditionals,t),this}withPaginator(t){return n.notNullOrUndefined(t,"paginator"),n.notNullOrUndefined(t.cn,"paginator.cn"),n.true(t.min||t.max||t.l,"paginator must have some limit"),t.s=t.s??m.Asc,this.paginator=t,this}fetchCopyOfParam(t){return this.namedParams[t]}fetchCopyOfConditional(t){return this.conditionals[t]}containsParam(t){return null!=this.namedParams[t]}getDebugComment(){return this.debugComment}containsConditional(t){return null!=this.conditionals[t]}build(){return this.clone().internalBuild(!1)}buildUnfiltered(){return this.clone().internalBuild(!0)}internalBuild(t){return this.applyQueryFragments(),this.applyConditionalBlocks(),this.applyRepeatBlocks(),this.applyPagination(t),this.applySqlConstructs(),this.applyComments(),this.runQueryChecks(),this.stripNonAsciiParams(),new f((this.query??"").trim(),this.namedParams,this.paginator,this.transactionIsolationLevel)}stripNonAsciiParams(){const e=t.stripNonAscii(JSON.stringify(this.namedParams));this.namedParams=JSON.parse(e)}runQueryChecks(){const t=[...this.query?.matchAll(/['"]:[A-z-]*['"]/gm)??[]];t.length>0&&e.warn("The resulting query contains quoted named params check this this is intended. Instances found: %s",t.join(", "))}applyComments(){if(this.debugComment.length&&this.query){const t=this.query.indexOf(" "),e=this.debugComment;this.query=this.query.substring(0,t+1)+`/*${e}*/`+this.query.substring(t+1)}}applySqlConstructs(){for(const e of Object.keys(this.sqlConstructs)){let n;const r=this.sqlConstructs[e];if(Array.isArray(r))r.forEach((t=>{if("string"!=typeof t||!t.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct entry ${t} is invalid value must be alphanumeric only.`)})),n=r.join(", ");else if(n=t.safeString(r),n.length>0&&!n.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct ${n} is invalid value must be alphanumeric only.`);const i=["update","insert","delete","drop","select"];for(const t of i)if(n.toLowerCase().includes(t))throw new Error(`sql construct ${n} is invalid value must not contain reserved word ${t}.`);const s=`##sqlConstruct:${e}##`;for(;this.query?.includes(s);)this.query=this.query.replace(s,n)}}applyRepeatBlocks(){const t="<repeat";for(;;){const e=this.query?.indexOf(t);if(-1===e||!this.query||"number"!=typeof e)return;const n=this.query.indexOf(">",e);if(-1==n)throw new Error(`Invalid query when finding end symbol matching > in ${this.query} check that you have closed all your tags correctly.`);const r="count=";let i="";const s="join=";let o;const a=this.query.substring(e+7,n).trim().split(" ");for(const t of a)t.includes(r)&&(i=t.substring(t.indexOf(r)+r.length)),t.includes(s)&&(o=t.substring(t.indexOf(s)+s.length));const c="</repeat>",u=this.query.indexOf(c),l=this.query.substring(n+1,u);this.query=this.query.substring(0,e)+this.query.substring(u+c.length);const h=this.namedParams[i.substring(1)];for(let t=0;t<h;t++){let n=l;o&&0!=t&&(n+=o);let r=n.indexOf("::");for(;-1!=r;){const e=n.indexOf("::",r+2);if(-1==e)throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);const i=n.substring(r+2,e);n=n.replace("::"+i+"::",":"+i+t),r=n.indexOf("::")}this.query=this.query.substring(0,e)+n+this.query.substring(e)}}}applyQueryFragments(){for(;;){const t=this.query?.indexOf("[[");if(-1==t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf("]]",t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching ]] in ${this.query} check that you have closed all your tags correctly.`);const n=this.query.substring(t+2,e),r=this.queryProvider.fetchQuery(n);if(!r)throw new Error(`Invalid query, query fragment ${n} not found in named queries.`);this.query=this.query.replace(`[[${n}]]`,r)}}applyPagination(e){const n="##pagination##";if(!e&&this.paginator){const e=this.paginator.s==m.Desc?m.Desc:m.Asc,n=t.safeString(e);if(this.paginator.min||this.paginator.max){let t="WHERE ##sqlConstruct:queryBuilderPaginatorWhere##";this.withSqlConstruct("queryBuilderPaginatorWhere",this.paginator.cn),this.paginator.min&&(t+=">= :queryBuilderPaginatorWhereMin",this.withParam("queryBuilderPaginatorWhereMin",this.paginator.min)),this.paginator.max&&(this.paginator.min&&(t+=" AND ##sqlConstruct:queryBuilderPaginatorWhere##"),t+="< :queryBuilderPaginatorWhereMax",this.withParam("queryBuilderPaginatorWhereMax",this.paginator.max)),this.query+=t}this.query+=` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${n}`,this.withSqlConstruct("queryBuilderOrderBy",this.paginator.cn),this.paginator.l&&(this.query+=" LIMIT :queryBuilderLimit",this.withParam("queryBuilderLimit",this.paginator.l))}if(e&&this.query){const t=this.query.indexOf(n);-1!=t&&(this.query="SELECT COUNT(*) "+this.query.substring(t+14))}for(;this.query?.includes(n);)this.query=this.query.replace(n,"")}applyConditionalBlocks(){const t=">>";for(;;){const e=this.query?.indexOf("<<");if(-1==e||!this.query||"number"!=typeof e)return;const n=this.query.indexOf(t,e);if(-1==n)throw new Error(`Invalid query when finding end symbol matching ${t} in ${this.query} check that you have closed all your tags correctly.`);const r=this.query.substring(e+2,n),i=r.replace(":",""),s=`<</${r}>>`,o=this.query.indexOf(s);if(-1==o)throw new Error(`Invalid query when finding conditional end tag matching ${s} in ${this.query} check that your query contains an exact match of this tag.`);let a=this.query.substring(n+2,o);if(r.startsWith(":")){const t=this.namedParams[i];(null==t||Array.isArray(t)&&0==t.length)&&(a="")}else{const t=this.conditionals[i.replace("!","")];null!=t&&t!=i.startsWith("!")||(a="")}this.debugAnnotateMode&&(a="/* conditional "+i+"*/"),this.query=this.query.substring(0,e)+a+this.query.substring(o+s.length)}}}class p{queryProvider;connectionProvider;queryDefaults;static LONG_QUERY_TIME_MS=8500;serviceName="TBD";constructor(t,e,n){this.queryProvider=t,this.connectionProvider=e,this.queryDefaults=n,this.serviceName="NamedParameterMariaDb"}getQueryDefaults(){return this.queryDefaults}getQueryProvider(){return this.queryProvider}async createNonPooledMysqlStyleConnectionProvider(t,n){if(e.info("createTransactional : %s : %j",t,n),!this.connectionProvider.createNonPooledDatabaseConnection)throw new Error("Connection provider does not implement createNonPooledDatabaseConnection");const r=await this.connectionProvider.createNonPooledDatabaseConnection(t,n);if(!r)throw new Error(`Connection could not be created for DB type ${t}`);return new g(r)}fetchQueryRawTextByName(t){return this.queryProvider.fetchQuery(t)}queryBuilder(t){const e=new w(this.queryProvider);return t&&e.withNamedQuery(t),e}async executeUpdateOrInsertByName(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e??{});return this.buildAndExecuteUpdateOrInsert(r,n)}async buildAndExecuteUpdateOrInsert(t,e=this.queryDefaults.timeoutMS){const n=t.build();return(await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e)).results}async buildAndExecuteUpdateOrInsertWithRetry(t,n,r=this.queryDefaults.timeoutMS){let s,o=0;for(;!s&&o<n;){o++;try{s=await this.buildAndExecuteUpdateOrInsert(t,r)}catch(t){e.info("Caught problem while trying to update/insert : %d : %s ",o,t),await i.wait(2e3*o)}}if(!s)throw new Error(`Failed to execute update after ${n} retries`);return s}async executeQueryByName(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e);return await this.buildAndExecute(r,n)}async executeQueryByNameSingle(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e),i=await this.buildAndExecute(r,n);return 1===i.length?i[0]:null}async buildAndExecute(t,e=this.queryDefaults.timeoutMS){const n=t.build();return(await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e,t.getDebugComment())).results}async buildAndExecuteSingle(t,e=this.queryDefaults.timeoutMS){const n=t.build(),r=await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e,t.getDebugComment());return 1===r.results.length?r.results[0]:null}async buildAndExecuteFetchTotalRows(t,n="",r=this.queryDefaults.timeoutMS){const i=t.buildUnfiltered();let s=i.query.replace("COUNT(*)",`${n} as groupByField, COUNT(*) as count`);s=`${s} GROUP BY ${n}`,e.info("Unfiltered query %s",i.query);return(await this.executeQueryWithMeta(i.transactionIsolationLevel,s,i.namedParams,r)).results}async executeQueryWithMeta(t,n,r={},c=this.queryDefaults.timeoutMS,u){const l=new s;c||(c=this.queryDefaults.timeoutMS),await this.changeNextQueryTransactionIsolationLevel(t);const h=await i.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(n,r,void 0),"Query:"+n,c);if(o.isTimeoutToken(h)){e.warn("Timed out (after %s): %j",a.colonFormatMsDuration(c),h);const t=a.colonFormatMsDuration(c);throw new Error(`Timed out (after ${t}) waiting for query : ${n}`)}const d=h;return d.results||e.error("DB:executeQueryWithMeta:Failure: %j",d),u&&l.elapsedMS()>p.LONG_QUERY_TIME_MS&&e.info("NamedParameterMariaDbService long query: %s, %s",u,l.dump()),d}async shutdown(){let t;e.info("Shutting down %s service",this.serviceName);try{t=await this.connectionProvider.clearConnectionCache()}catch(n){e.error("Failure trying to shutdown : %s",n,n),t=!1}return t}async testConnection(t=!1){t||e.info("Running connection test");const n=(await this.executeQueryWithMeta(y.Default,"SELECT UNIX_TIMESTAMP(now())*1000 AS test")).results,r=1===n.length?n[0].test:null;return t||e.info("Test returned : %j",r),r}async testDbFailure(){await this.executeQueryWithMeta(y.Default,"this is a bad query")}async changeNextQueryTransactionIsolationLevel(t){return t&&t!==y.Default?(e.debug("Setting tx to %s",t),await this.innerExecutePreparedAsPromiseWithRetryCloseConnection("SET TRANSACTION ISOLATION LEVEL "+t,{})):null}async forceCloseConnectionForTesting(){e.warn("Forcing connection closed for testing");const t=await this.getDB();try{return await t.end(),e.info("Connection has been ended, but not set to null"),!0}catch(t){return e.error("Error closing connection : %s",t,t),!1}}async innerExecutePreparedAsPromiseWithRetryCloseConnection(t,n={},s=1){try{return await this.innerExecutePreparedAsPromise(t,n)}catch(o){const a=r.asErr(o);if(a.message.includes("closed state")||a.message.includes("This socket has been ended by the other party")||a.message.includes("ETIMEDOUT")||a.message.includes("RatchetNoConnection")||a.message.includes("ER_LOCK_WAIT_TIMEOUT")){const r=Math.min(1e3*s);if(e.warn("Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)",r,s,a.message),s<4){const o=await this.connectionProvider.clearConnectionCache();return e.info("Clear connection cache returned %s",o),await i.wait(r),this.innerExecutePreparedAsPromiseWithRetryCloseConnection(t,n,s+1)}throw e.warn("Ran out of retries"),new Error("Connection closed and cannot retry any more - dying horribly")}e.error("Named Param DB Query Failed : Err: %s Query: %s Params: %j",a,t,n,a);try{const r=await this.getDB();e.error("-----\nFor paste into tooling only: \n\n%s\n\n",d.renderQueryStringForPasteIntoTool(t,n,(t=>r.escape(t))))}catch(t){e.error("Really bad - failed trying to get the conn for logging : %s",t)}throw a}}async innerExecutePreparedAsPromise(t,n={}){const r=await this.getDB();r.config.namedPlaceholders=!0;const i=new s;try{const[s,o]=await r.query(t,n),a={results:s,fields:o};return e.debug("Success : Finished query : %s\n%s\n\nParams : %j",i.dump(),d.reformatQueryForLogging(t),n),e.debug("-----\nFor paste into tooling only : \n\n%s\n\n",d.renderQueryStringForPasteIntoTool(t,n,(t=>r.escape(t)))),a}finally{r.config.namedPlaceholders=!1}}async getDB(){const t=await this.connectionProvider.getConnection(this.queryDefaults.databaseName);if(!t)throw new Error("RatchetNoConnection : getConnection returned null - likely failed to get connection from db");return t}async resetConnection(){let t=!1;e.info("Resetting connection");try{await this.connectionProvider.clearConnectionCache();t=!!await this.testConnection(),e.info("Reset connection returning %s",t)}catch(t){e.error("Failed to reset connection : %s",t)}return t}}class C{configPromiseProvider;additionalConfig;ssh;static DEFAULT_CONNECTION_OPTIONS={multipleStatements:!0};tunnels=new Map;dbPromise=new Map;cacheConfigPromise;constructor(t,n=C.DEFAULT_CONNECTION_OPTIONS,r){this.configPromiseProvider=t,this.additionalConfig=n,this.ssh=r,this.cacheConfigPromise=this.createConnectionConfig(),e.info("Added shutdown handler to the process (Only once per instantiation)"),this.addShutdownHandlerToProcess()}get usingSshTunnel(){return!!this.ssh}addShutdownHandlerToProcess(){process.on("exit",(()=>{e.info("Process is shutting down, closing connections"),this.clearConnectionCache().catch((t=>{e.error("Shutdown connection failed : %s",t)}))}))}async clearConnectionCache(){e.info("Clearing connection cache for RdsMysqlConnectionProvider");const t=this.dbPromise,n=this.tunnels;if(this.cacheConfigPromise=null,this.dbPromise=new Map,this.tunnels=new Map,t.size>0){const n=Array.from(t.keys());for(const i of n){e.info("Shutting down connection : %s",i);const n=t.get(i);try{const t=await n;t?(await t.destroy(),e.info("Finished destroying old connection")):e.warn("Could not get old connection, so not destroying it")}catch(t){if(!r.asErr(t).message.includes("closed state"))throw e.error("Something went wrong closing the connection : %s",t),t}}}if(n.size>0){const t=Array.from(n.keys());for(const r of t)try{e.info("Shutting down SSH tunnel: %s",r);const t=n.get(r);t?await this.ssh.shutdown(t):e.warn("Could not get old tunnel, so not destroying it"),e.info("SSH Tunnel closed")}catch(t){e.error("Failure closing old tunnel : %s",t)}}return e.info("Old db and tunnel removed"),!1}async getConnection(t){if(e.silly("getConnection : %s",t),!this.dbPromise.has(t)){e.info("No dbPromise found for %s - creating new one",t);const n=await this.getDbConfig(t),r=this.createDatabaseConnection(n,this.additionalConfig,!0);this.dbPromise.set(t,r),e.info("Added dbPromise for %s",t)}return this.dbPromise.get(t)}async createNonPooledDatabaseConnection(t,n=C.DEFAULT_CONNECTION_OPTIONS){e.info("Creating non-pooled connection for %s",t.databaseName);const r=await this.getDbConfig(t.databaseName);return await this.createDatabaseConnection(r,n,!1)}async getDbConfig(n){e.info("RdsMysqlStyleConnectionProvider:getDbConfig:Initiating promise for %s",n);const i=await this.configPromise(),s=t.trimToEmpty(n).toLowerCase(),o=i.dbList.find((e=>t.trimToEmpty(e.label).toLowerCase()===s));if(!o)throw r.fErr("Cannot find any connection config named %s (Available are %j)",n,i.dbList.map((t=>t.label)));return o}async createDatabaseConnection(t,n=C.DEFAULT_CONNECTION_OPTIONS,r,i){e.info("In RdsMysqlStyleConnectionProvider:createDatabaseConnection : %s",t.label);const s=c.omit(c.clone(t),"label","tunnelPort");if(this.usingSshTunnel&&t.tunnelPort){let n=this.tunnels.get(t.label);if(!n){e.debug("Creating SSH tunnel from local port %d to remote host %s and port %d",t.tunnelPort,t.host,t.port);const r=await i;n=await this.ssh.createSSHTunnel(r,t.host,t.port,t.tunnelPort),this.tunnels.set(t.label,n)}s.port=n.serverOptions.port??-1,s.host="localhost"}let o;e.debug("Opening connection for RdsMysqlStyleConnectionProvider");try{o=await u.createConnection({...n,...s})}catch(t){return e.info("Failed trying to create connection : %s : clearing for retry",t),void(r&&(this.dbPromise=new Map))}return o.on("error",(t=>{e.info("An error was detected on the connection : %s : Clearing",t),this.clearConnectionCache().then((t=>{e.info("Connection cleared: %s",t)})).catch((t=>e.error("Failed to clear RDS connection cache: %j",t)))})),e.info("Added error handler to db, there are now %d error handlers and %d shutdown handlers",o.rawListeners("error").length,process.rawListeners("exit").length),o}configPromise(){return this.cacheConfigPromise||(this.cacheConfigPromise=this.createConnectionConfig()),this.cacheConfigPromise}async createConnectionConfig(){n.notNullOrUndefined(this.configPromiseProvider,"input");const t=this.configPromiseProvider();e.info("Creating connection config");const r=await t;if(n.true(r.dbList.length>0,"input.dbList"),this.usingSshTunnel)for(const t of r.dbList)t.tunnelPort=await l();return r}}class P{async shutdown(t){if(!t.connection)return e.info("Not shutting down tunnel - non-tunnel passed"),!1;try{return e.info("Shutting down SSH Tunnel"),t.connection.end(),t.server.close(),!0}catch(t){return e.error("Error closing ssh tunnel : %s",t),!1}}async createSSHTunnel(t,n,r,i){const s={autoClose:!0},o={port:i},a={srcAddr:"localhost",srcPort:i,dstAddr:n,dstPort:r},[c,u]=await h.createTunnel(s,o,t,a);c.on("error",(t=>{e.warn("SSH Server Error : %s",t)}));return{tunnelOptions:s,serverOptions:o,sshOptions:t,forwardOptions:a,server:c,connection:u}}}class b extends p{myQueryProvider;myConnectionProvider;myQueryDefaults;currentTxFlag;static async create(t,n,r){e.info("createTransactionalNamedParameterMariaDbService : %j : %j",n,r);const i=await t.createNonPooledMysqlStyleConnectionProvider(n,r);return new b(t.getQueryProvider(),i,n)}constructor(t,e,n){super(t,e,n),this.myQueryProvider=t,this.myConnectionProvider=e,this.myQueryDefaults=n}async cleanShutdown(){e.info("cleanShutdown");try{const t=await this.myConnectionProvider.getConnection();t&&(e.info("Shutting down connection"),t.destroy())}catch(t){e.info("Failure shutting down single-use connection : %s",t)}}async startTransaction(){if(this.currentTxFlag)r.throwFormattedErr("Tried to start a new transaction while one is already in progress : %s",this.currentTxFlag);else{this.currentTxFlag=t.createRandomHexString(10),e.info("Starting a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.beginTransaction())}}async commitTransaction(){if(this.currentTxFlag){e.info("commit a transaction : %s",this.currentTxFlag);const t=await this.myConnectionProvider.getConnection();await(t?.commit()),this.currentTxFlag=void 0}else r.throwFormattedErr("Cannot commit transaction - none in process")}async rollBackTransaction(){if(this.currentTxFlag){e.info("rollBack a transaction : %s",this.currentTxFlag);const t=await this.myConnectionProvider.getConnection();await(t?.rollback()),this.currentTxFlag=void 0}else r.throwFormattedErr("Cannot rollBack transaction - none in process")}async buildAndExecuteUpdateOrInsertInTransaction(t,n=this.myQueryDefaults.timeoutMS){e.info("buildAndExecuteUpdateOrInsertInTransaction"),await this.startTransaction();try{const e=await this.buildAndExecuteUpdateOrInsert(t,n);return await this.commitTransaction(),e}catch(t){return e.error("Failed - rolling back transaction : %s",t,t),await this.rollBackTransaction(),null}}async buildAndExecuteInTransaction(t,n=this.myQueryDefaults.timeoutMS){e.info("buildAndExecuteInTransaction"),await this.startTransaction();try{const e=await this.buildAndExecute(t,n);return await this.commitTransaction(),e}catch(t){return e.error("Failed - rolling back transaction : %s",t,t),await this.rollBackTransaction(),null}}static async oneStepBuildAndExecuteUpdateOrInsertInTransaction(t,n,r=t.getQueryDefaults().timeoutMS,i){let s,o=null;try{s=await b.create(t,t.getQueryDefaults(),i),o=await s.buildAndExecuteUpdateOrInsertInTransaction(n,r)}catch(t){e.error("Failure in oneStepBuildAndExecuteUpdateOrInsertInTransaction : %j : %s",n,t,t)}finally{s&&await s.cleanShutdown()}return o}static async oneStepBuildAndExecuteInTransaction(t,n,r=t.getQueryDefaults().timeoutMS,i){let s,o=null;try{s=await b.create(t,t.getQueryDefaults(),i),o=await s.buildAndExecuteInTransaction(n,r)}catch(t){e.error("Failure in oneStepbuildAndExecuteInTransaction : %j : %s",n,t,t)}finally{s&&await s.cleanShutdown()}return o}}class q{constructor(){}static buildInformation(){return{version:"208",hash:"3a43ba338d01ad03a47d1a66a926650f5a72e7b7",branch:"alpha-2023-08-25-2",tag:"alpha-2023-08-25-2",timeBuiltISO:"2023-08-25T17:28:48-0700",notes:"No notes"}}}class T{static async uploadObjectArrayToTable(t,r,i,s=!1){if(n.notNullOrUndefined(t,"db"),n.notNullOrUndefined(r,"tableName"),n.notNullOrUndefined(i,"data"),e.info("Writing %d items to %s (clear: %s)",i.length,r,s),s){e.info("Clearing table %s",r);const{results:n}=await t.executeQueryWithMeta(y.Default,"DELETE FROM "+r,{});e.info("Removed %d rows",n.affectedRows)}const o=new Set(i.flatMap((t=>Object.keys(t)))),a=Array.from(o);e.info("Found columns : %j",a);const c="INSERT INTO "+r+" ("+a.join(",")+") VALUES :multiValue",{results:u}=await t.executeQueryWithMeta(y.Default,c,{multiValue:i}),l=u.affectedRows;return e.info("Wrote %d rows",l),l!==i.length&&e.warn("Should have written %d but wrote %d",i.length,l),l}}export{p as NamedParameterMariaDbService,g as NonPooledMysqlStyleConnectionProvider,w as QueryBuilder,f as QueryBuilderResult,d as QueryUtil,q as RatchetRdbmsInfo,C as RdsMysqlStyleConnectionProvider,T as RelationalDatabaseUtils,m as SortDirection,P as SshTunnelService,y as TransactionIsolationLevel,b as TransactionalNamedParameterMariaDbService};
|
|
1
|
+
import{StringRatchet as t,Logger as e,RequireRatchet as n,ErrorRatchet as r,PromiseRatchet as i,StopWatch as s,TimeoutToken as o,DurationRatchet as a}from"@bitblit/ratchet-common";import c from"lodash";import u from"mysql2/promise";import l from"get-port";import*as h from"tunnel-ssh";class d{fields=[];replacements={};addReplacement(t,...e){this.replacements=Object.assign(this.replacements,t),this.addFields(...e)}appendReplacement(t,e,...n){this.replacements[t]=this.replacements[t]+e,this.addFields(...n)}addFields(...t){this.fields=this.fields.concat(...t)}getFields(){return this.fields}getReplacements(){return this.replacements}static sqlInjectionUnsafeParamRenderer(e){const n=e=>"string"==typeof e?'"'+e+'"':t.safeString(e);return Array.isArray(e)?e.map((t=>n(t))).join(","):n(e)}static renderQueryStringForPasteIntoTool(t,e,n=d.sqlInjectionUnsafeParamRenderer){const r=e??{};let i=d.reformatQueryForLogging(t);if(i){const t=Object.keys(r);t.sort(((t,e)=>e.length-t.length));for(const e of t){const t=":"+e,s=n(r[e]);i=i.split(t).join(s)}i.endsWith(";")||(i+=";")}return i}static reformatQueryForLogging(n,r=80){let i=r;if(!t.trimToNull(n))return null;let s="",o=t.trimToEmpty(n).split("\n").join(" ").split("\r").join(" ");for(;o.length>i;){let n=Math.min(o.length,i);for(;n>0&&![" ",","].includes(o.charAt(n));)n--;n>0?(s+=o.substring(0,n)+"\n",o=t.trimToEmpty(o.substring(n))):(e.silly("Input contains a string longer than the max line length - bumping"),i+=2)}return s+(o.length>0?o:"")}}var y,m;!function(t){t.Default="Default",t.ReadUncommitted="READ UNCOMMITTED"}(y||(y={}));class g{connection;constructor(t){this.connection=t,n.notNullOrUndefined(t)}async getConnection(){return this.connection}async clearConnectionCache(){return e.info("clearConnectionCache ignored - not pooled"),!0}}class f{query;namedParams;paginator;transactionIsolationLevel;constructor(t,e,n,r){this.query=t,this.namedParams=e,this.paginator=n,this.transactionIsolationLevel=r}}!function(t){t.Asc="Asc",t.Desc="Desc"}(m||(m={}));class w{static ALLOWED_SQL_CONSTRUCT=/^[a-z0-9_.`]+$/i;queryProvider;query;meta=Object.freeze({});sqlConstructs={};namedParams={};conditionals={};debugComment="";paginator;debugAnnotateMode=!1;transactionIsolationLevel=y.Default;constructor(t){this.queryProvider=t}clone(){const t=new w(this.queryProvider);return this.query&&t.withBaseQuery(this.query),t.sqlConstructs=c.clone(this.sqlConstructs),t.namedParams=c.clone(this.namedParams),t.conditionals=c.clone(this.conditionals),t.paginator=c.clone(this.paginator),t.debugComment=this.debugComment,t.transactionIsolationLevel=this.transactionIsolationLevel,t}withTransactionIsolationLevel(t){return this.transactionIsolationLevel=t,this}withDebugComment(t){return this.debugComment=t,this}appendDebugComment(t){return this.debugComment=this.debugComment+t,this}withNamedQuery(e){return this.query=this.queryProvider.fetchQuery(e),t.trimToNull(this.query)||r.throwFormattedErr("Requested query that does not exist : %s",e),this.meta=Object.freeze({queryPath:e}),this.withDebugComment(" "+e+" "),this}withBaseQuery(t){this.query=t}withSqlConstruct(t,e){return this.sqlConstructs[t]=e,this}withSqlConstructs(t){return this.sqlConstructs=Object.assign(this.sqlConstructs,t),this}removeParam(t){return delete this.namedParams[t],this}paramNames(){return Object.keys(this.namedParams)}withParam(t,e){return this.namedParams[t]=e,this}withParams(t){return this.namedParams=Object.assign(this.namedParams,t),this}withExpandedParam(t,n,r){const i=t+"Length";let s=this.fetchCopyOfParam(i)??0;if(s>0&&!r){e.silly("Old item found and not extending - removing old params");this.paramNames().filter((e=>e.startsWith(t))).forEach((t=>this.removeParam(t))),s=0}this.withParam(i,n.length+s);for(let e=0;e<n.length;e++){const r=n[e];if("object"==typeof r&&r)for(const n of Object.keys(r)){const i=t+n.charAt(0).toUpperCase()+n.slice(1)+(e+s);this.withParam(i,r[n])}else{const n=t+e;this.withParam(n,r)}}return this}withConditional(t,e=!0){return this.conditionals[t]=e,this}withConditionals(t){return this.conditionals=Object.assign(this.conditionals,t),this}withPaginator(t){return n.notNullOrUndefined(t,"paginator"),n.notNullOrUndefined(t.cn,"paginator.cn"),n.true(t.min||t.max||t.l,"paginator must have some limit"),t.s=t.s??m.Asc,this.paginator=t,this}fetchCopyOfParam(t){return this.namedParams[t]}fetchCopyOfConditional(t){return this.conditionals[t]}containsParam(t){return null!=this.namedParams[t]}getDebugComment(){return this.debugComment}containsConditional(t){return null!=this.conditionals[t]}build(){return this.clone().internalBuild(!1)}buildUnfiltered(){return this.clone().internalBuild(!0)}internalBuild(t){return this.applyQueryFragments(),this.applyConditionalBlocks(),this.applyRepeatBlocks(),this.applyPagination(t),this.applySqlConstructs(),this.applyComments(),this.runQueryChecks(),this.stripNonAsciiParams(),new f((this.query??"").trim(),this.namedParams,this.paginator,this.transactionIsolationLevel)}stripNonAsciiParams(){const e=t.stripNonAscii(JSON.stringify(this.namedParams));this.namedParams=JSON.parse(e)}runQueryChecks(){const t=[...this.query?.matchAll(/['"]:[A-z-]*['"]/gm)??[]];t.length>0&&e.warn("The resulting query contains quoted named params check this this is intended. Instances found: %s",t.join(", "))}applyComments(){if(this.debugComment.length&&this.query){const t=this.query.indexOf(" "),e=this.debugComment;this.query=this.query.substring(0,t+1)+`/*${e}*/`+this.query.substring(t+1)}}applySqlConstructs(){for(const e of Object.keys(this.sqlConstructs)){let n;const r=this.sqlConstructs[e];if(Array.isArray(r))r.forEach((t=>{if("string"!=typeof t||!t.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct entry ${t} is invalid value must be alphanumeric only.`)})),n=r.join(", ");else if(n=t.safeString(r),n.length>0&&!n.match(w.ALLOWED_SQL_CONSTRUCT))throw new Error(`sql construct ${n} is invalid value must be alphanumeric only.`);const i=["update","insert","delete","drop","select"];for(const t of i)if(n.toLowerCase().includes(t))throw new Error(`sql construct ${n} is invalid value must not contain reserved word ${t}.`);const s=`##sqlConstruct:${e}##`;for(;this.query?.includes(s);)this.query=this.query.replace(s,n)}}applyRepeatBlocks(){const t="<repeat";for(;;){const e=this.query?.indexOf(t);if(-1===e||!this.query||"number"!=typeof e)return;const n=this.query.indexOf(">",e);if(-1==n)throw new Error(`Invalid query when finding end symbol matching > in ${this.query} check that you have closed all your tags correctly.`);const r="count=";let i="";const s="join=";let o;const a=this.query.substring(e+7,n).trim().split(" ");for(const t of a)t.includes(r)&&(i=t.substring(t.indexOf(r)+r.length)),t.includes(s)&&(o=t.substring(t.indexOf(s)+s.length));const c="</repeat>",u=this.query.indexOf(c),l=this.query.substring(n+1,u);this.query=this.query.substring(0,e)+this.query.substring(u+c.length);const h=this.namedParams[i.substring(1)];for(let t=0;t<h;t++){let n=l;o&&0!=t&&(n+=o);let r=n.indexOf("::");for(;-1!=r;){const e=n.indexOf("::",r+2);if(-1==e)throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);const i=n.substring(r+2,e);n=n.replace("::"+i+"::",":"+i+t),r=n.indexOf("::")}this.query=this.query.substring(0,e)+n+this.query.substring(e)}}}applyQueryFragments(){for(;;){const t=this.query?.indexOf("[[");if(-1==t||!this.query||"number"!=typeof t)return;const e=this.query.indexOf("]]",t);if(-1==e)throw new Error(`Invalid query when finding end symbol matching ]] in ${this.query} check that you have closed all your tags correctly.`);const n=this.query.substring(t+2,e),r=this.queryProvider.fetchQuery(n);if(!r)throw new Error(`Invalid query, query fragment ${n} not found in named queries.`);this.query=this.query.replace(`[[${n}]]`,r)}}applyPagination(e){const n="##pagination##";if(!e&&this.paginator){const e=this.paginator.s==m.Desc?m.Desc:m.Asc,n=t.safeString(e);if(this.paginator.min||this.paginator.max){let t="WHERE ##sqlConstruct:queryBuilderPaginatorWhere##";this.withSqlConstruct("queryBuilderPaginatorWhere",this.paginator.cn),this.paginator.min&&(t+=">= :queryBuilderPaginatorWhereMin",this.withParam("queryBuilderPaginatorWhereMin",this.paginator.min)),this.paginator.max&&(this.paginator.min&&(t+=" AND ##sqlConstruct:queryBuilderPaginatorWhere##"),t+="< :queryBuilderPaginatorWhereMax",this.withParam("queryBuilderPaginatorWhereMax",this.paginator.max)),this.query+=t}this.query+=` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${n}`,this.withSqlConstruct("queryBuilderOrderBy",this.paginator.cn),this.paginator.l&&(this.query+=" LIMIT :queryBuilderLimit",this.withParam("queryBuilderLimit",this.paginator.l))}if(e&&this.query){const t=this.query.indexOf(n);-1!=t&&(this.query="SELECT COUNT(*) "+this.query.substring(t+14))}for(;this.query?.includes(n);)this.query=this.query.replace(n,"")}applyConditionalBlocks(){const t=">>";for(;;){const e=this.query?.indexOf("<<");if(-1==e||!this.query||"number"!=typeof e)return;const n=this.query.indexOf(t,e);if(-1==n)throw new Error(`Invalid query when finding end symbol matching ${t} in ${this.query} check that you have closed all your tags correctly.`);const r=this.query.substring(e+2,n),i=r.replace(":",""),s=`<</${r}>>`,o=this.query.indexOf(s);if(-1==o)throw new Error(`Invalid query when finding conditional end tag matching ${s} in ${this.query} check that your query contains an exact match of this tag.`);let a=this.query.substring(n+2,o);if(r.startsWith(":")){const t=this.namedParams[i];(null==t||Array.isArray(t)&&0==t.length)&&(a="")}else{const t=this.conditionals[i.replace("!","")];null!=t&&t!=i.startsWith("!")||(a="")}this.debugAnnotateMode&&(a="/* conditional "+i+"*/"),this.query=this.query.substring(0,e)+a+this.query.substring(o+s.length)}}}class p{queryProvider;connectionProvider;queryDefaults;static LONG_QUERY_TIME_MS=8500;serviceName="TBD";constructor(t,e,n){this.queryProvider=t,this.connectionProvider=e,this.queryDefaults=n,this.serviceName="NamedParameterMariaDb"}getQueryDefaults(){return this.queryDefaults}getQueryProvider(){return this.queryProvider}async createNonPooledMysqlStyleConnectionProvider(t,n){if(e.info("createTransactional : %s : %j",t,n),!this.connectionProvider.createNonPooledDatabaseConnection)throw new Error("Connection provider does not implement createNonPooledDatabaseConnection");const r=await this.connectionProvider.createNonPooledDatabaseConnection(t,n);if(!r)throw new Error(`Connection could not be created for DB type ${t}`);return new g(r)}fetchQueryRawTextByName(t){return this.queryProvider.fetchQuery(t)}queryBuilder(t){const e=new w(this.queryProvider);return t&&e.withNamedQuery(t),e}async executeUpdateOrInsertByName(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e??{});return this.buildAndExecuteUpdateOrInsert(r,n)}async buildAndExecuteUpdateOrInsert(t,e=this.queryDefaults.timeoutMS){const n=t.build();return(await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e)).results}async buildAndExecuteUpdateOrInsertWithRetry(t,n,r=this.queryDefaults.timeoutMS){let s,o=0;for(;!s&&o<n;){o++;try{s=await this.buildAndExecuteUpdateOrInsert(t,r)}catch(t){e.info("Caught problem while trying to update/insert : %d : %s ",o,t),await i.wait(2e3*o)}}if(!s)throw new Error(`Failed to execute update after ${n} retries`);return s}async executeQueryByName(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e);return await this.buildAndExecute(r,n)}async executeQueryByNameSingle(t,e,n=this.queryDefaults.timeoutMS){const r=this.queryBuilder(t).withParams(e),i=await this.buildAndExecute(r,n);return 1===i.length?i[0]:null}async buildAndExecute(t,e=this.queryDefaults.timeoutMS){const n=t.build();return(await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e,t.getDebugComment())).results}async buildAndExecuteSingle(t,e=this.queryDefaults.timeoutMS){const n=t.build(),r=await this.executeQueryWithMeta(n.transactionIsolationLevel,n.query,n.namedParams,e,t.getDebugComment());return 1===r.results.length?r.results[0]:null}async buildAndExecuteFetchTotalRows(t,n="",r=this.queryDefaults.timeoutMS){const i=t.buildUnfiltered();let s=i.query.replace("COUNT(*)",`${n} as groupByField, COUNT(*) as count`);s=`${s} GROUP BY ${n}`,e.info("Unfiltered query %s",i.query);return(await this.executeQueryWithMeta(i.transactionIsolationLevel,s,i.namedParams,r)).results}async executeQueryWithMeta(t,n,r={},c=this.queryDefaults.timeoutMS,u){const l=new s;c||(c=this.queryDefaults.timeoutMS),await this.changeNextQueryTransactionIsolationLevel(t);const h=await i.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(n,r,void 0),"Query:"+n,c);if(o.isTimeoutToken(h)){e.warn("Timed out (after %s): %j",a.colonFormatMsDuration(c),h);const t=a.colonFormatMsDuration(c);throw new Error(`Timed out (after ${t}) waiting for query : ${n}`)}const d=h;return d.results||e.error("DB:executeQueryWithMeta:Failure: %j",d),u&&l.elapsedMS()>p.LONG_QUERY_TIME_MS&&e.info("NamedParameterMariaDbService long query: %s, %s",u,l.dump()),d}async shutdown(){let t;e.info("Shutting down %s service",this.serviceName);try{t=await this.connectionProvider.clearConnectionCache()}catch(n){e.error("Failure trying to shutdown : %s",n,n),t=!1}return t}async testConnection(t=!1){t||e.info("Running connection test");const n=(await this.executeQueryWithMeta(y.Default,"SELECT UNIX_TIMESTAMP(now())*1000 AS test")).results,r=1===n.length?n[0].test:null;return t||e.info("Test returned : %j",r),r}async testDbFailure(){await this.executeQueryWithMeta(y.Default,"this is a bad query")}async changeNextQueryTransactionIsolationLevel(t){return t&&t!==y.Default?(e.debug("Setting tx to %s",t),await this.innerExecutePreparedAsPromiseWithRetryCloseConnection("SET TRANSACTION ISOLATION LEVEL "+t,{})):null}async forceCloseConnectionForTesting(){e.warn("Forcing connection closed for testing");const t=await this.getDB();try{return await t.end(),e.info("Connection has been ended, but not set to null"),!0}catch(t){return e.error("Error closing connection : %s",t,t),!1}}async innerExecutePreparedAsPromiseWithRetryCloseConnection(t,n={},s=1){try{return await this.innerExecutePreparedAsPromise(t,n)}catch(o){const a=r.asErr(o);if(a.message.includes("closed state")||a.message.includes("This socket has been ended by the other party")||a.message.includes("ETIMEDOUT")||a.message.includes("RatchetNoConnection")||a.message.includes("ER_LOCK_WAIT_TIMEOUT")){const r=Math.min(1e3*s);if(e.warn("Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)",r,s,a.message),s<4){const o=await this.connectionProvider.clearConnectionCache();return e.info("Clear connection cache returned %s",o),await i.wait(r),this.innerExecutePreparedAsPromiseWithRetryCloseConnection(t,n,s+1)}throw e.warn("Ran out of retries"),new Error("Connection closed and cannot retry any more - dying horribly")}e.error("Named Param DB Query Failed : Err: %s Query: %s Params: %j",a,t,n,a);try{const r=await this.getDB();e.error("-----\nFor paste into tooling only: \n\n%s\n\n",d.renderQueryStringForPasteIntoTool(t,n,(t=>r.escape(t))))}catch(t){e.error("Really bad - failed trying to get the conn for logging : %s",t)}throw a}}async innerExecutePreparedAsPromise(t,n={}){const r=await this.getDB();r.config.namedPlaceholders=!0;const i=new s;try{const[s,o]=await r.query(t,n),a={results:s,fields:o};return e.debug("Success : Finished query : %s\n%s\n\nParams : %j",i.dump(),d.reformatQueryForLogging(t),n),e.debug("-----\nFor paste into tooling only : \n\n%s\n\n",d.renderQueryStringForPasteIntoTool(t,n,(t=>r.escape(t)))),a}finally{r.config.namedPlaceholders=!1}}async getDB(){const t=await this.connectionProvider.getConnection(this.queryDefaults.databaseName);if(!t)throw new Error("RatchetNoConnection : getConnection returned null - likely failed to get connection from db");return t}async resetConnection(){let t=!1;e.info("Resetting connection");try{await this.connectionProvider.clearConnectionCache();t=!!await this.testConnection(),e.info("Reset connection returning %s",t)}catch(t){e.error("Failed to reset connection : %s",t)}return t}}class C{configPromiseProvider;additionalConfig;ssh;static DEFAULT_CONNECTION_OPTIONS={multipleStatements:!0};tunnels=new Map;dbPromise=new Map;cacheConfigPromise;constructor(t,n=C.DEFAULT_CONNECTION_OPTIONS,r){this.configPromiseProvider=t,this.additionalConfig=n,this.ssh=r,this.cacheConfigPromise=this.createConnectionConfig(),e.info("Added shutdown handler to the process (Only once per instantiation)"),this.addShutdownHandlerToProcess()}get usingSshTunnel(){return!!this.ssh}addShutdownHandlerToProcess(){process.on("exit",(()=>{e.info("Process is shutting down, closing connections"),this.clearConnectionCache().catch((t=>{e.error("Shutdown connection failed : %s",t)}))}))}async clearConnectionCache(){e.info("Clearing connection cache for RdsMysqlConnectionProvider");const t=this.dbPromise,n=this.tunnels;if(this.cacheConfigPromise=null,this.dbPromise=new Map,this.tunnels=new Map,t.size>0){const n=Array.from(t.keys());for(const i of n){e.info("Shutting down connection : %s",i);const n=t.get(i);try{const t=await n;t?(await t.destroy(),e.info("Finished destroying old connection")):e.warn("Could not get old connection, so not destroying it")}catch(t){if(!r.asErr(t).message.includes("closed state"))throw e.error("Something went wrong closing the connection : %s",t),t}}}if(n.size>0){const t=Array.from(n.keys());for(const r of t)try{e.info("Shutting down SSH tunnel: %s",r);const t=n.get(r);t?await this.ssh.shutdown(t):e.warn("Could not get old tunnel, so not destroying it"),e.info("SSH Tunnel closed")}catch(t){e.error("Failure closing old tunnel : %s",t)}}return e.info("Old db and tunnel removed"),!1}async getConnection(t){if(e.silly("getConnection : %s",t),!this.dbPromise.has(t)){e.info("No dbPromise found for %s - creating new one",t);const n=await this.getDbConfig(t),r=this.createDatabaseConnection(n,this.additionalConfig,!0);this.dbPromise.set(t,r),e.info("Added dbPromise for %s",t)}return this.dbPromise.get(t)}async createNonPooledDatabaseConnection(t,n=C.DEFAULT_CONNECTION_OPTIONS){e.info("Creating non-pooled connection for %s",t.databaseName);const r=await this.getDbConfig(t.databaseName);return await this.createDatabaseConnection(r,n,!1)}async getDbConfig(n){e.info("RdsMysqlStyleConnectionProvider:getDbConfig:Initiating promise for %s",n);const i=await this.configPromise(),s=t.trimToEmpty(n).toLowerCase(),o=i.dbList.find((e=>t.trimToEmpty(e.label).toLowerCase()===s));if(!o)throw r.fErr("Cannot find any connection config named %s (Available are %j)",n,i.dbList.map((t=>t.label)));return o}async createDatabaseConnection(t,n=C.DEFAULT_CONNECTION_OPTIONS,r,i){e.info("In RdsMysqlStyleConnectionProvider:createDatabaseConnection : %s",t.label);const s=c.omit(c.clone(t),"label","tunnelPort");if(this.usingSshTunnel&&t.tunnelPort){let n=this.tunnels.get(t.label);if(!n){e.debug("Creating SSH tunnel from local port %d to remote host %s and port %d",t.tunnelPort,t.host,t.port);const r=await i;n=await this.ssh.createSSHTunnel(r,t.host,t.port,t.tunnelPort),this.tunnels.set(t.label,n)}s.port=n.serverOptions.port??-1,s.host="localhost"}let o;e.debug("Opening connection for RdsMysqlStyleConnectionProvider");try{o=await u.createConnection({...n,...s})}catch(t){return e.info("Failed trying to create connection : %s : clearing for retry",t),void(r&&(this.dbPromise=new Map))}return o.on("error",(t=>{e.info("An error was detected on the connection : %s : Clearing",t),this.clearConnectionCache().then((t=>{e.info("Connection cleared: %s",t)})).catch((t=>e.error("Failed to clear RDS connection cache: %j",t)))})),e.info("Added error handler to db, there are now %d error handlers and %d shutdown handlers",o.rawListeners("error").length,process.rawListeners("exit").length),o}configPromise(){return this.cacheConfigPromise||(this.cacheConfigPromise=this.createConnectionConfig()),this.cacheConfigPromise}async createConnectionConfig(){n.notNullOrUndefined(this.configPromiseProvider,"input");const t=this.configPromiseProvider();e.info("Creating connection config");const r=await t;if(n.true(r.dbList.length>0,"input.dbList"),this.usingSshTunnel)for(const t of r.dbList)t.tunnelPort=await l();return r}}class P{async shutdown(t){if(!t.connection)return e.info("Not shutting down tunnel - non-tunnel passed"),!1;try{return e.info("Shutting down SSH Tunnel"),t.connection.end(),t.server.close(),!0}catch(t){return e.error("Error closing ssh tunnel : %s",t),!1}}async createSSHTunnel(t,n,r,i){const s={autoClose:!0},o={port:i},a={srcAddr:"localhost",srcPort:i,dstAddr:n,dstPort:r},[c,u]=await h.createTunnel(s,o,t,a);c.on("error",(t=>{e.warn("SSH Server Error : %s",t)}));return{tunnelOptions:s,serverOptions:o,sshOptions:t,forwardOptions:a,server:c,connection:u}}}class b extends p{myQueryProvider;myConnectionProvider;myQueryDefaults;currentTxFlag;static async create(t,n,r){e.info("createTransactionalNamedParameterMariaDbService : %j : %j",n,r);const i=await t.createNonPooledMysqlStyleConnectionProvider(n,r);return new b(t.getQueryProvider(),i,n)}constructor(t,e,n){super(t,e,n),this.myQueryProvider=t,this.myConnectionProvider=e,this.myQueryDefaults=n}async cleanShutdown(){e.info("cleanShutdown");try{const t=await this.myConnectionProvider.getConnection();t&&(e.info("Shutting down connection"),t.destroy())}catch(t){e.info("Failure shutting down single-use connection : %s",t)}}async startTransaction(){if(this.currentTxFlag)r.throwFormattedErr("Tried to start a new transaction while one is already in progress : %s",this.currentTxFlag);else{this.currentTxFlag=t.createRandomHexString(10),e.info("Starting a transaction : %s",this.currentTxFlag);const n=await this.myConnectionProvider.getConnection();await(n?.beginTransaction())}}async commitTransaction(){if(this.currentTxFlag){e.info("commit a transaction : %s",this.currentTxFlag);const t=await this.myConnectionProvider.getConnection();await(t?.commit()),this.currentTxFlag=void 0}else r.throwFormattedErr("Cannot commit transaction - none in process")}async rollBackTransaction(){if(this.currentTxFlag){e.info("rollBack a transaction : %s",this.currentTxFlag);const t=await this.myConnectionProvider.getConnection();await(t?.rollback()),this.currentTxFlag=void 0}else r.throwFormattedErr("Cannot rollBack transaction - none in process")}async buildAndExecuteUpdateOrInsertInTransaction(t,n=this.myQueryDefaults.timeoutMS){e.info("buildAndExecuteUpdateOrInsertInTransaction"),await this.startTransaction();try{const e=await this.buildAndExecuteUpdateOrInsert(t,n);return await this.commitTransaction(),e}catch(t){return e.error("Failed - rolling back transaction : %s",t,t),await this.rollBackTransaction(),null}}async buildAndExecuteInTransaction(t,n=this.myQueryDefaults.timeoutMS){e.info("buildAndExecuteInTransaction"),await this.startTransaction();try{const e=await this.buildAndExecute(t,n);return await this.commitTransaction(),e}catch(t){return e.error("Failed - rolling back transaction : %s",t,t),await this.rollBackTransaction(),null}}static async oneStepBuildAndExecuteUpdateOrInsertInTransaction(t,n,r=t.getQueryDefaults().timeoutMS,i){let s,o=null;try{s=await b.create(t,t.getQueryDefaults(),i),o=await s.buildAndExecuteUpdateOrInsertInTransaction(n,r)}catch(t){e.error("Failure in oneStepBuildAndExecuteUpdateOrInsertInTransaction : %j : %s",n,t,t)}finally{s&&await s.cleanShutdown()}return o}static async oneStepBuildAndExecuteInTransaction(t,n,r=t.getQueryDefaults().timeoutMS,i){let s,o=null;try{s=await b.create(t,t.getQueryDefaults(),i),o=await s.buildAndExecuteInTransaction(n,r)}catch(t){e.error("Failure in oneStepbuildAndExecuteInTransaction : %j : %s",n,t,t)}finally{s&&await s.cleanShutdown()}return o}}class q{constructor(){}static buildInformation(){return{version:"209",hash:"c3d61aedd3feeca59f0a4578a09178fca0d3c0f4",branch:"alpha-2023-08-30-2",tag:"alpha-2023-08-30-2",timeBuiltISO:"2023-08-30T10:48:02-0700",notes:"No notes"}}}class T{static async uploadObjectArrayToTable(t,r,i,s=!1){if(n.notNullOrUndefined(t,"db"),n.notNullOrUndefined(r,"tableName"),n.notNullOrUndefined(i,"data"),e.info("Writing %d items to %s (clear: %s)",i.length,r,s),s){e.info("Clearing table %s",r);const{results:n}=await t.executeQueryWithMeta(y.Default,"DELETE FROM "+r,{});e.info("Removed %d rows",n.affectedRows)}const o=new Set(i.flatMap((t=>Object.keys(t)))),a=Array.from(o);e.info("Found columns : %j",a);const c="INSERT INTO "+r+" ("+a.join(",")+") VALUES :multiValue",{results:u}=await t.executeQueryWithMeta(y.Default,c,{multiValue:i}),l=u.affectedRows;return e.info("Wrote %d rows",l),l!==i.length&&e.warn("Should have written %d but wrote %d",i.length,l),l}}export{p as NamedParameterMariaDbService,g as NonPooledMysqlStyleConnectionProvider,w as QueryBuilder,f as QueryBuilderResult,d as QueryUtil,q as RatchetRdbmsInfo,C as RdsMysqlStyleConnectionProvider,T as RelationalDatabaseUtils,m as SortDirection,P as SshTunnelService,y as TransactionIsolationLevel,b as TransactionalNamedParameterMariaDbService};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/query-builder/query-util.ts","../src/model/transaction-isolation-level.ts","../src/model/sort-direction.ts","../src/non-pooled-mysql-style-connection-provider.ts","../src/query-builder/query-builder-result.ts","../src/query-builder/query-builder.ts","../src/named-parameter-maria-db-service.ts","../src/rds-mysql-style-connection-provider.ts","../src/ssh-tunnel-service.ts","../src/transactional-named-parameter-maria-db-service.ts","../src/build/ratchet-rdbms-info.ts","../src/util/relational-database-utils.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null],"names":["QueryUtil","fields","replacements","addReplacement","replacement","this","Object","assign","addFields","appendReplacement","replacementKey","appendValue","concat","getFields","getReplacements","static","value","rFn","val","StringRatchet","safeString","Array","isArray","map","s","join","query","inFields","transform","sqlInjectionUnsafeParamRenderer","rval","reformatQueryForLogging","keys","sort","b","a","length","key","find","repl","split","endsWith","qry","inMaxLineLength","maxLineLength","trimToNull","loggableQuery","cleaned","trimToEmpty","idx","Math","min","includes","charAt","substring","Logger","silly","TransactionIsolationLevel","SortDirection","NonPooledMysqlStyleConnectionProvider","connection","constructor","RequireRatchet","notNullOrUndefined","async","info","QueryBuilderResult","namedParams","paginator","transactionIsolationLevel","QueryBuilder","queryProvider","meta","freeze","sqlConstructs","conditionals","debugComment","debugAnnotateMode","Default","clone","withBaseQuery","_","withTransactionIsolationLevel","level","withDebugComment","comment","appendDebugComment","withNamedQuery","queryPath","fetchQuery","ErrorRatchet","throwFormattedErr","baseQuery","withSqlConstruct","withSqlConstructs","params","removeParam","paramNames","withParam","withParams","withExpandedParam","keyPrefix","values","extendIfExists","lengthParamName","oldSize","fetchCopyOfParam","filter","startsWith","forEach","i","paramKey","toUpperCase","slice","withConditional","tag","state","withConditionals","withPaginator","cn","true","max","l","Asc","paramName","fetchCopyOfConditional","conditionalName","containsParam","undefined","getDebugComment","containsConditional","build","internalBuild","buildUnfiltered","unfiltered","applyQueryFragments","applyConditionalBlocks","applyRepeatBlocks","applyPagination","applySqlConstructs","applyComments","runQueryChecks","stripNonAsciiParams","trim","reduced","stripNonAscii","JSON","stringify","parse","quotedNamedParams","matchAll","warn","firstSpaceIndex","indexOf","v","match","ALLOWED_SQL_CONSTRUCT","Error","sqlReservedWords","word","toLowerCase","rawKey","replace","startSymbol","startIndex","endIndex","countSymbol","countParam","joinSymbol","joinString","param","endTag","endTagIndex","repeatedContent","endSymbol","count","indexedContent","startParamTagIndex","endParamTagIndex","rawName","namedQueryElement","paginationRawKey","sortDirEnum","Desc","sortDir","wc","paginationSplitIndex","rawTag","conditional","NamedParameterMariaDbService","connectionProvider","queryDefaults","serviceName","getQueryDefaults","getQueryProvider","additionalConfig","createNonPooledDatabaseConnection","newConn","fetchQueryRawTextByName","queryBuilder","timeoutMS","builder","buildAndExecuteUpdateOrInsert","executeQueryWithMeta","results","maxRetries","res","retry","err","PromiseRatchet","wait","buildAndExecute","resp","groupBy","sw","StopWatch","changeNextQueryTransactionIsolationLevel","result","timeout","innerExecutePreparedAsPromiseWithRetryCloseConnection","TimeoutToken","isTimeoutToken","DurationRatchet","colonFormatMsDuration","duration","error","elapsedMS","LONG_QUERY_TIME_MS","dump","clearConnectionCache","quietMode","rows","timestamp","test","tx","debug","conn","getDB","end","retryCount","innerExecutePreparedAsPromise","errIn","asErr","message","cleared","renderQueryStringForPasteIntoTool","escape","err2","config","namedPlaceholders","outFields","getConnection","databaseName","testConnection","RdsMysqlStyleConnectionProvider","configPromiseProvider","ssh","multipleStatements","tunnels","Map","dbPromise","cacheConfigPromise","DEFAULT_CONNECTION_OPTIONS","createConnectionConfig","addShutdownHandlerToProcess","usingSshTunnel","process","on","catch","oldDbHooks","oldSshTunnels","size","hookNames","from","hookName","oldDbHook","get","oldConn","destroy","tunnelNames","tunnelName","tunnel","shutdown","name","has","dbConfig","getDbConfig","createDatabaseConnection","set","cfgs","configPromise","finder","dbList","label","fErr","d","dbCfg","clearCacheOnConnectionFailure","sshConfigPromise","cfgCopy","omit","tunnelPort","host","port","sshConfig","createSSHTunnel","serverOptions","maria","createConnection","then","rawListeners","inputPromise","cfg","getPort","SshTunnelService","server","close","sshOptions","dstHost","dstPort","localPort","tunnelOptions","autoClose","forwardOptions","srcAddr","srcPort","dstAddr","TunnelSsh","createTunnel","TransactionalNamedParameterMariaDbService","myQueryProvider","myConnectionProvider","myQueryDefaults","currentTxFlag","src","connProv","createNonPooledMysqlStyleConnectionProvider","super","createRandomHexString","beginTransaction","commit","rollback","startTransaction","commitTransaction","rollBackTransaction","handler","create","buildAndExecuteUpdateOrInsertInTransaction","cleanShutdown","buildAndExecuteInTransaction","RatchetRdbmsInfo","version","hash","branch","timeBuiltISO","notes","RelationalDatabaseUtils","db","tableName","data","clearTableFirst","deleteResult","affectedRows","columns","Set","flatMap","row","colArr","sql","insertResult","multiValue","inserted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/query-builder/query-util.ts","../src/model/transaction-isolation-level.ts","../src/model/sort-direction.ts","../src/non-pooled-mysql-style-connection-provider.ts","../src/query-builder/query-builder-result.ts","../src/query-builder/query-builder.ts","../src/named-parameter-maria-db-service.ts","../src/rds-mysql-style-connection-provider.ts","../src/ssh-tunnel-service.ts","../src/transactional-named-parameter-maria-db-service.ts","../src/build/ratchet-rdbms-info.ts","../src/util/relational-database-utils.ts"],"sourcesContent":["import { Logger, StringRatchet } from '@bitblit/ratchet-common';\nexport class QueryUtil {\n fields = [];\n replacements = {};\n addReplacement(replacement, ...fields) {\n this.replacements = Object.assign(this.replacements, replacement);\n this.addFields(...fields);\n }\n appendReplacement(replacementKey, appendValue, ...fields) {\n this.replacements[replacementKey] = this.replacements[replacementKey] + appendValue;\n this.addFields(...fields);\n }\n addFields(...fields) {\n this.fields = this.fields.concat(...fields);\n }\n getFields() {\n return this.fields;\n }\n getReplacements() {\n return this.replacements;\n }\n static sqlInjectionUnsafeParamRenderer(value) {\n const rFn = (val) => (typeof val === 'string' ? '\"' + val + '\"' : StringRatchet.safeString(val));\n const repl = Array.isArray(value) ? value.map((s) => rFn(s)).join(',') : rFn(value);\n return repl;\n }\n static renderQueryStringForPasteIntoTool(query, inFields, transform = QueryUtil.sqlInjectionUnsafeParamRenderer) {\n const fields = inFields ?? {};\n let rval = QueryUtil.reformatQueryForLogging(query);\n if (rval) {\n const keys = Object.keys(fields);\n keys.sort((b, a) => a.length - b.length);\n for (const key of keys) {\n const val = fields[key];\n const find = ':' + key;\n const repl = transform(val);\n rval = rval.split(find).join(repl);\n }\n if (!rval.endsWith(';')) {\n rval += ';';\n }\n }\n return rval;\n }\n static reformatQueryForLogging(qry, inMaxLineLength = 80) {\n let maxLineLength = inMaxLineLength;\n if (!StringRatchet.trimToNull(qry)) {\n return null;\n }\n let loggableQuery = '';\n let cleaned = StringRatchet.trimToEmpty(qry).split('\\n').join(' ').split('\\r').join(' ');\n while (cleaned.length > maxLineLength) {\n let idx = Math.min(cleaned.length, maxLineLength);\n while (idx > 0 && ![' ', ','].includes(cleaned.charAt(idx))) {\n idx--;\n }\n if (idx > 0) {\n loggableQuery += cleaned.substring(0, idx) + '\\n';\n cleaned = StringRatchet.trimToEmpty(cleaned.substring(idx));\n }\n else {\n Logger.silly('Input contains a string longer than the max line length - bumping');\n maxLineLength += 2;\n }\n }\n return loggableQuery + (cleaned.length > 0 ? cleaned : '');\n }\n}\n//# sourceMappingURL=query-util.js.map","export var TransactionIsolationLevel;\n(function (TransactionIsolationLevel) {\n TransactionIsolationLevel[\"Default\"] = \"Default\";\n TransactionIsolationLevel[\"ReadUncommitted\"] = \"READ UNCOMMITTED\";\n})(TransactionIsolationLevel || (TransactionIsolationLevel = {}));\n//# sourceMappingURL=transaction-isolation-level.js.map","export var SortDirection;\n(function (SortDirection) {\n SortDirection[\"Asc\"] = \"Asc\";\n SortDirection[\"Desc\"] = \"Desc\";\n})(SortDirection || (SortDirection = {}));\n//# sourceMappingURL=sort-direction.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nexport class NonPooledMysqlStyleConnectionProvider {\n connection;\n constructor(connection) {\n this.connection = connection;\n RequireRatchet.notNullOrUndefined(connection);\n }\n async getConnection() {\n return this.connection;\n }\n async clearConnectionCache() {\n Logger.info('clearConnectionCache ignored - not pooled');\n return true;\n }\n}\n//# sourceMappingURL=non-pooled-mysql-style-connection-provider.js.map","export class QueryBuilderResult {\n query;\n namedParams;\n paginator;\n transactionIsolationLevel;\n constructor(query, namedParams, paginator, transactionIsolationLevel) {\n this.query = query;\n this.namedParams = namedParams;\n this.paginator = paginator;\n this.transactionIsolationLevel = transactionIsolationLevel;\n }\n}\n//# sourceMappingURL=query-builder-result.js.map","import { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport _ from 'lodash';\nimport { QueryBuilderResult } from './query-builder-result.js';\nimport { TransactionIsolationLevel } from '../model/transaction-isolation-level.js';\nimport { SortDirection } from '../model/sort-direction.js';\nexport class QueryBuilder {\n static ALLOWED_SQL_CONSTRUCT = /^[a-z0-9_.`]+$/i;\n queryProvider;\n query;\n meta = Object.freeze({});\n sqlConstructs = {};\n namedParams = {};\n conditionals = {};\n debugComment = '';\n paginator;\n debugAnnotateMode = false;\n transactionIsolationLevel = TransactionIsolationLevel.Default;\n constructor(queryProvider) {\n this.queryProvider = queryProvider;\n }\n clone() {\n const clone = new QueryBuilder(this.queryProvider);\n if (this.query) {\n clone.withBaseQuery(this.query);\n }\n clone.sqlConstructs = _.clone(this.sqlConstructs);\n clone.namedParams = _.clone(this.namedParams);\n clone.conditionals = _.clone(this.conditionals);\n clone.paginator = _.clone(this.paginator);\n clone.debugComment = this.debugComment;\n clone.transactionIsolationLevel = this.transactionIsolationLevel;\n return clone;\n }\n withTransactionIsolationLevel(level) {\n this.transactionIsolationLevel = level;\n return this;\n }\n withDebugComment(comment) {\n this.debugComment = comment;\n return this;\n }\n appendDebugComment(comment) {\n this.debugComment = this.debugComment + comment;\n return this;\n }\n withNamedQuery(queryPath) {\n this.query = this.queryProvider.fetchQuery(queryPath);\n if (!StringRatchet.trimToNull(this.query)) {\n ErrorRatchet.throwFormattedErr('Requested query that does not exist : %s', queryPath);\n }\n this.meta = Object.freeze({ queryPath: queryPath });\n this.withDebugComment(' ' + queryPath + ' ');\n return this;\n }\n withBaseQuery(baseQuery) {\n this.query = baseQuery;\n }\n withSqlConstruct(key, value) {\n this.sqlConstructs[key] = value;\n return this;\n }\n withSqlConstructs(params) {\n this.sqlConstructs = Object.assign(this.sqlConstructs, params);\n return this;\n }\n removeParam(key) {\n delete this.namedParams[key];\n return this;\n }\n paramNames() {\n return Object.keys(this.namedParams);\n }\n withParam(key, value) {\n this.namedParams[key] = value;\n return this;\n }\n withParams(params) {\n this.namedParams = Object.assign(this.namedParams, params);\n return this;\n }\n withExpandedParam(keyPrefix, values, extendIfExists) {\n const lengthParamName = keyPrefix + 'Length';\n let oldSize = this.fetchCopyOfParam(lengthParamName) ?? 0;\n if (oldSize > 0 && !extendIfExists) {\n Logger.silly('Old item found and not extending - removing old params');\n const toRemove = this.paramNames().filter((s) => s.startsWith(keyPrefix));\n toRemove.forEach((s) => this.removeParam(s));\n oldSize = 0;\n }\n this.withParam(lengthParamName, values.length + oldSize);\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (typeof value === 'object' && !!value) {\n for (const key of Object.keys(value)) {\n const paramKey = keyPrefix + key.charAt(0).toUpperCase() + key.slice(1) + (i + oldSize);\n this.withParam(paramKey, value[key]);\n }\n }\n else {\n const paramKey = keyPrefix + i;\n this.withParam(paramKey, value);\n }\n }\n return this;\n }\n withConditional(tag, state = true) {\n this.conditionals[tag] = state;\n return this;\n }\n withConditionals(params) {\n this.conditionals = Object.assign(this.conditionals, params);\n return this;\n }\n withPaginator(paginator) {\n RequireRatchet.notNullOrUndefined(paginator, 'paginator');\n RequireRatchet.notNullOrUndefined(paginator.cn, 'paginator.cn');\n RequireRatchet.true(paginator.min || paginator.max || paginator.l, 'paginator must have some limit');\n paginator.s = paginator.s ?? SortDirection.Asc;\n this.paginator = paginator;\n return this;\n }\n fetchCopyOfParam(paramName) {\n return this.namedParams[paramName];\n }\n fetchCopyOfConditional(conditionalName) {\n return this.conditionals[conditionalName];\n }\n containsParam(paramName) {\n return this.namedParams[paramName] != undefined;\n }\n getDebugComment() {\n return this.debugComment;\n }\n containsConditional(conditionalName) {\n return this.conditionals[conditionalName] != undefined;\n }\n build() {\n const build = this.clone();\n return build.internalBuild(false);\n }\n buildUnfiltered() {\n const builder = this.clone();\n return builder.internalBuild(true);\n }\n internalBuild(unfiltered) {\n this.applyQueryFragments();\n this.applyConditionalBlocks();\n this.applyRepeatBlocks();\n this.applyPagination(unfiltered);\n this.applySqlConstructs();\n this.applyComments();\n this.runQueryChecks();\n this.stripNonAsciiParams();\n return new QueryBuilderResult((this.query ?? '').trim(), this.namedParams, this.paginator, this.transactionIsolationLevel);\n }\n stripNonAsciiParams() {\n const reduced = StringRatchet.stripNonAscii(JSON.stringify(this.namedParams));\n this.namedParams = JSON.parse(reduced);\n }\n runQueryChecks() {\n const quotedNamedParams = [...(this.query?.matchAll(/['\"]:[A-z-]*['\"]/gm) ?? [])];\n if (quotedNamedParams.length > 0) {\n Logger.warn('The resulting query contains quoted named params check this this is intended. Instances found: %s', quotedNamedParams.join(', '));\n }\n }\n applyComments() {\n if (this.debugComment.length && this.query) {\n const firstSpaceIndex = this.query.indexOf(' ');\n const comment = this.debugComment;\n this.query = this.query.substring(0, firstSpaceIndex + 1) + `/*${comment}*/` + this.query.substring(firstSpaceIndex + 1);\n }\n }\n applySqlConstructs() {\n for (const key of Object.keys(this.sqlConstructs)) {\n let value;\n const val = this.sqlConstructs[key];\n if (Array.isArray(val)) {\n val.forEach((v) => {\n if (typeof v !== 'string' || !v.match(QueryBuilder.ALLOWED_SQL_CONSTRUCT)) {\n throw new Error(`sql construct entry ${v} is invalid value must be alphanumeric only.`);\n }\n });\n value = val.join(', ');\n }\n else {\n value = StringRatchet.safeString(val);\n if (value.length > 0 && !value.match(QueryBuilder.ALLOWED_SQL_CONSTRUCT)) {\n throw new Error(`sql construct ${value} is invalid value must be alphanumeric only.`);\n }\n }\n const sqlReservedWords = ['update', 'insert', 'delete', 'drop', 'select'];\n for (const word of sqlReservedWords) {\n if (value.toLowerCase().includes(word)) {\n throw new Error(`sql construct ${value} is invalid value must not contain reserved word ${word}.`);\n }\n }\n const rawKey = `##sqlConstruct:${key}##`;\n while (this.query?.includes(rawKey)) {\n this.query = this.query.replace(rawKey, value);\n }\n }\n }\n applyRepeatBlocks() {\n const startSymbol = '<repeat';\n const endSymbol = '>';\n while (true) {\n const startIndex = this.query?.indexOf(startSymbol);\n if (startIndex === -1 || !this.query || typeof startIndex !== 'number') {\n return;\n }\n const endIndex = this.query.indexOf(endSymbol, startIndex);\n if (endIndex == -1) {\n throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);\n }\n const content = this.query.substring(startIndex + startSymbol.length, endIndex).trim();\n const countSymbol = 'count=';\n let countParam = '';\n const joinSymbol = 'join=';\n let joinString;\n const params = content.split(' ');\n for (const param of params) {\n if (param.includes(countSymbol)) {\n countParam = param.substring(param.indexOf(countSymbol) + countSymbol.length);\n }\n if (param.includes(joinSymbol)) {\n joinString = param.substring(param.indexOf(joinSymbol) + joinSymbol.length);\n }\n }\n const endTag = `</repeat>`;\n const endTagIndex = this.query.indexOf(endTag);\n const repeatedContent = this.query.substring(endIndex + endSymbol.length, endTagIndex);\n this.query = this.query.substring(0, startIndex) + this.query.substring(endTagIndex + endTag.length);\n const count = this.namedParams[countParam.substring(1)];\n for (let i = 0; i < count; i++) {\n let indexedContent = repeatedContent;\n if (joinString && i != 0) {\n indexedContent += joinString;\n }\n let startParamTagIndex = indexedContent.indexOf(`::`);\n while (startParamTagIndex != -1) {\n const endParamTagIndex = indexedContent.indexOf(`::`, startParamTagIndex + 2);\n if (endParamTagIndex == -1) {\n throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);\n }\n const param = indexedContent.substring(startParamTagIndex + 2, endParamTagIndex);\n indexedContent = indexedContent.replace('::' + param + '::', ':' + param + i);\n startParamTagIndex = indexedContent.indexOf(`::`);\n }\n this.query = this.query.substring(0, startIndex) + indexedContent + this.query.substring(startIndex);\n }\n }\n }\n applyQueryFragments() {\n const startSymbol = '[[';\n const endSymbol = ']]';\n while (true) {\n const startIndex = this.query?.indexOf(startSymbol);\n if (startIndex == -1 || !this.query || typeof startIndex !== 'number') {\n return;\n }\n const endIndex = this.query.indexOf(endSymbol, startIndex);\n if (endIndex == -1) {\n throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);\n }\n const rawName = this.query.substring(startIndex + startSymbol.length, endIndex);\n const namedQueryElement = this.queryProvider.fetchQuery(rawName);\n if (!namedQueryElement) {\n throw new Error(`Invalid query, query fragment ${rawName} not found in named queries.`);\n }\n this.query = this.query.replace(`[[${rawName}]]`, namedQueryElement);\n }\n }\n applyPagination(unfiltered) {\n const paginationRawKey = '##pagination##';\n if (!unfiltered && this.paginator) {\n const sortDirEnum = this.paginator.s == SortDirection.Desc ? SortDirection.Desc : SortDirection.Asc;\n const sortDir = StringRatchet.safeString(sortDirEnum);\n if (this.paginator.min || this.paginator.max) {\n let wc = 'WHERE ##sqlConstruct:queryBuilderPaginatorWhere##';\n this.withSqlConstruct('queryBuilderPaginatorWhere', this.paginator.cn);\n if (this.paginator.min) {\n wc += '>= :queryBuilderPaginatorWhereMin';\n this.withParam('queryBuilderPaginatorWhereMin', this.paginator.min);\n }\n if (this.paginator.max) {\n if (this.paginator.min) {\n wc += ' AND ##sqlConstruct:queryBuilderPaginatorWhere##';\n }\n wc += '< :queryBuilderPaginatorWhereMax';\n this.withParam('queryBuilderPaginatorWhereMax', this.paginator.max);\n }\n this.query += wc;\n }\n this.query += ` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${sortDir}`;\n this.withSqlConstruct('queryBuilderOrderBy', this.paginator.cn);\n if (this.paginator.l) {\n this.query += ' LIMIT :queryBuilderLimit';\n this.withParam('queryBuilderLimit', this.paginator.l);\n }\n }\n if (unfiltered && this.query) {\n const paginationSplitIndex = this.query.indexOf(paginationRawKey);\n if (paginationSplitIndex != -1) {\n this.query = 'SELECT COUNT(*) ' + this.query.substring(paginationSplitIndex + paginationRawKey.length);\n }\n }\n while (this.query?.includes(paginationRawKey)) {\n this.query = this.query.replace(paginationRawKey, '');\n }\n }\n applyConditionalBlocks() {\n const startSymbol = '<<';\n const endSymbol = '>>';\n while (true) {\n const startIndex = this.query?.indexOf(startSymbol);\n if (startIndex == -1 || !this.query || typeof startIndex !== 'number') {\n return;\n }\n const endIndex = this.query.indexOf(endSymbol, startIndex);\n if (endIndex == -1) {\n throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);\n }\n const rawTag = this.query.substring(startIndex + startSymbol.length, endIndex);\n const tag = rawTag.replace(':', '');\n const endTag = `<</${rawTag}>>`;\n const endTagIndex = this.query.indexOf(endTag);\n if (endTagIndex == -1) {\n throw new Error(`Invalid query when finding conditional end tag matching ${endTag} in ${this.query} check that your query contains an exact match of this tag.`);\n }\n let replacement = this.query.substring(endIndex + endSymbol.length, endTagIndex);\n if (rawTag.startsWith(':')) {\n const param = this.namedParams[tag];\n if (param == null || (Array.isArray(param) && param.length == 0)) {\n replacement = '';\n }\n }\n else {\n const conditional = this.conditionals[tag.replace('!', '')];\n if (conditional == undefined || conditional == tag.startsWith('!')) {\n replacement = '';\n }\n }\n if (this.debugAnnotateMode) {\n replacement = '/* conditional ' + tag + '*/';\n }\n this.query = this.query.substring(0, startIndex) + replacement + this.query.substring(endTagIndex + endTag.length);\n }\n }\n}\n//# sourceMappingURL=query-builder.js.map","import { DurationRatchet, ErrorRatchet, Logger, PromiseRatchet, StopWatch, TimeoutToken } from '@bitblit/ratchet-common';\nimport { QueryUtil } from './query-builder/query-util.js';\nimport { TransactionIsolationLevel } from './model/transaction-isolation-level.js';\nimport { NonPooledMysqlStyleConnectionProvider } from './non-pooled-mysql-style-connection-provider.js';\nimport { QueryBuilder } from './query-builder/query-builder.js';\nexport class NamedParameterMariaDbService {\n queryProvider;\n connectionProvider;\n queryDefaults;\n static LONG_QUERY_TIME_MS = 8500;\n serviceName = 'TBD';\n constructor(queryProvider, connectionProvider, queryDefaults) {\n this.queryProvider = queryProvider;\n this.connectionProvider = connectionProvider;\n this.queryDefaults = queryDefaults;\n this.serviceName = 'NamedParameterMariaDb';\n }\n getQueryDefaults() {\n return this.queryDefaults;\n }\n getQueryProvider() {\n return this.queryProvider;\n }\n async createNonPooledMysqlStyleConnectionProvider(queryDefaults, additionalConfig) {\n Logger.info('createTransactional : %s : %j', queryDefaults, additionalConfig);\n if (!this.connectionProvider.createNonPooledDatabaseConnection) {\n throw new Error(`Connection provider does not implement createNonPooledDatabaseConnection`);\n }\n const newConn = await this.connectionProvider.createNonPooledDatabaseConnection(queryDefaults, additionalConfig);\n if (!newConn) {\n throw new Error(`Connection could not be created for DB type ${queryDefaults}`);\n }\n return new NonPooledMysqlStyleConnectionProvider(newConn);\n }\n fetchQueryRawTextByName(queryPath) {\n return this.queryProvider.fetchQuery(queryPath);\n }\n queryBuilder(queryPath) {\n const queryBuilder = new QueryBuilder(this.queryProvider);\n if (queryPath) {\n queryBuilder.withNamedQuery(queryPath);\n }\n return queryBuilder;\n }\n async executeUpdateOrInsertByName(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {\n const builder = this.queryBuilder(queryPath).withParams(params ?? {});\n return this.buildAndExecuteUpdateOrInsert(builder, timeoutMS);\n }\n async buildAndExecuteUpdateOrInsert(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {\n const build = queryBuilder.build();\n const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS);\n const rval = resp.results;\n return rval;\n }\n async buildAndExecuteUpdateOrInsertWithRetry(queryBuilder, maxRetries, timeoutMS = this.queryDefaults.timeoutMS) {\n let retry = 0;\n let res;\n while (!res && retry < maxRetries) {\n retry++;\n try {\n res = await this.buildAndExecuteUpdateOrInsert(queryBuilder, timeoutMS);\n }\n catch (err) {\n Logger.info('Caught problem while trying to update/insert : %d : %s ', retry, err);\n await PromiseRatchet.wait(retry * 2000);\n }\n }\n if (!res) {\n throw new Error(`Failed to execute update after ${maxRetries} retries`);\n }\n return res;\n }\n async executeQueryByName(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {\n const builder = this.queryBuilder(queryPath).withParams(params);\n const resp = await this.buildAndExecute(builder, timeoutMS);\n return resp;\n }\n async executeQueryByNameSingle(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {\n const builder = this.queryBuilder(queryPath).withParams(params);\n const resp = await this.buildAndExecute(builder, timeoutMS);\n return resp.length === 1 ? resp[0] : null;\n }\n async buildAndExecute(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {\n const build = queryBuilder.build();\n const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS, queryBuilder.getDebugComment());\n return resp.results;\n }\n async buildAndExecuteSingle(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {\n const build = queryBuilder.build();\n const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS, queryBuilder.getDebugComment());\n return resp.results.length === 1 ? resp.results[0] : null;\n }\n async buildAndExecuteFetchTotalRows(queryBuilder, groupBy = '', timeoutMS = this.queryDefaults.timeoutMS) {\n const buildUnfiltered = queryBuilder.buildUnfiltered();\n let query = buildUnfiltered.query.replace('COUNT(*)', `${groupBy} as groupByField, COUNT(*) as count`);\n query = `${query} GROUP BY ${groupBy}`;\n Logger.info('Unfiltered query %s', buildUnfiltered.query);\n const resp = await this.executeQueryWithMeta(buildUnfiltered.transactionIsolationLevel, query, buildUnfiltered.namedParams, timeoutMS);\n return resp.results;\n }\n async executeQueryWithMeta(transactionIsolationLevel, query, fields = {}, timeoutMS = this.queryDefaults.timeoutMS, debugComment) {\n const sw = new StopWatch();\n if (!timeoutMS) {\n timeoutMS = this.queryDefaults.timeoutMS;\n }\n await this.changeNextQueryTransactionIsolationLevel(transactionIsolationLevel);\n const result = await PromiseRatchet.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields, undefined), 'Query:' + query, timeoutMS);\n if (TimeoutToken.isTimeoutToken(result)) {\n Logger.warn('Timed out (after %s): %j', DurationRatchet.colonFormatMsDuration(timeoutMS), result);\n const duration = DurationRatchet.colonFormatMsDuration(timeoutMS);\n throw new Error(`Timed out (after ${duration}) waiting for query : ${query}`);\n }\n const rval = result;\n if (!rval.results) {\n Logger.error('DB:executeQueryWithMeta:Failure: %j', rval);\n }\n if (debugComment && sw.elapsedMS() > NamedParameterMariaDbService.LONG_QUERY_TIME_MS) {\n Logger.info('NamedParameterMariaDbService long query: %s, %s', debugComment, sw.dump());\n }\n return rval;\n }\n async shutdown() {\n Logger.info('Shutting down %s service', this.serviceName);\n let rval;\n try {\n rval = await this.connectionProvider.clearConnectionCache();\n }\n catch (err) {\n Logger.error('Failure trying to shutdown : %s', err, err);\n rval = false;\n }\n return rval;\n }\n async testConnection(quietMode = false) {\n if (!quietMode) {\n Logger.info('Running connection test');\n }\n const res = await this.executeQueryWithMeta(TransactionIsolationLevel.Default, 'SELECT UNIX_TIMESTAMP(now())*1000 AS test');\n const rows = res.results;\n const timestamp = rows.length === 1 ? rows[0].test : null;\n if (!quietMode) {\n Logger.info('Test returned : %j', timestamp);\n }\n return timestamp;\n }\n async testDbFailure() {\n await this.executeQueryWithMeta(TransactionIsolationLevel.Default, 'this is a bad query');\n }\n async changeNextQueryTransactionIsolationLevel(tx) {\n if (tx && tx !== TransactionIsolationLevel.Default) {\n Logger.debug('Setting tx to %s', tx);\n return await this.innerExecutePreparedAsPromiseWithRetryCloseConnection('SET TRANSACTION ISOLATION LEVEL ' + tx, {});\n }\n return null;\n }\n async forceCloseConnectionForTesting() {\n Logger.warn('Forcing connection closed for testing');\n const conn = await this.getDB();\n try {\n await conn.end();\n Logger.info('Connection has been ended, but not set to null');\n return true;\n }\n catch (err) {\n Logger.error('Error closing connection : %s', err, err);\n return false;\n }\n }\n async innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields = {}, retryCount = 1) {\n try {\n const result = await this.innerExecutePreparedAsPromise(query, fields);\n return result;\n }\n catch (errIn) {\n const err = ErrorRatchet.asErr(errIn);\n if (err.message.includes('closed state') ||\n err.message.includes('This socket has been ended by the other party') ||\n err.message.includes('ETIMEDOUT') ||\n err.message.includes('RatchetNoConnection') ||\n err.message.includes('ER_LOCK_WAIT_TIMEOUT')) {\n const wait = Math.min(1000 * retryCount);\n Logger.warn('Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)', wait, retryCount, err.message);\n if (retryCount < 4) {\n const cleared = await this.connectionProvider.clearConnectionCache();\n Logger.info('Clear connection cache returned %s', cleared);\n await PromiseRatchet.wait(wait);\n return this.innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields, retryCount + 1);\n }\n else {\n Logger.warn('Ran out of retries');\n throw new Error('Connection closed and cannot retry any more - dying horribly');\n }\n }\n else {\n Logger.error('Named Param DB Query Failed : Err: %s Query: %s Params: %j', err, query, fields, err);\n try {\n const conn = await this.getDB();\n Logger.error('-----\\nFor paste into tooling only: \\n\\n%s\\n\\n', QueryUtil.renderQueryStringForPasteIntoTool(query, fields, (v) => conn.escape(v)));\n }\n catch (err2) {\n Logger.error('Really bad - failed trying to get the conn for logging : %s', err2);\n }\n throw err;\n }\n }\n }\n async innerExecutePreparedAsPromise(query, fields = {}) {\n const conn = await this.getDB();\n conn.config.namedPlaceholders = true;\n const sw = new StopWatch();\n try {\n const [rows, outFields] = await conn.query(query, fields);\n const rval = {\n results: rows,\n fields: outFields,\n };\n Logger.debug('Success : Finished query : %s\\n%s\\n\\nParams : %j', sw.dump(), QueryUtil.reformatQueryForLogging(query), fields);\n Logger.debug('-----\\nFor paste into tooling only : \\n\\n%s\\n\\n', QueryUtil.renderQueryStringForPasteIntoTool(query, fields, (v) => conn.escape(v)));\n return rval;\n }\n finally {\n conn.config.namedPlaceholders = false;\n }\n }\n async getDB() {\n const conn = await this.connectionProvider.getConnection(this.queryDefaults.databaseName);\n if (!conn) {\n throw new Error('RatchetNoConnection : getConnection returned null - likely failed to get connection from db');\n }\n return conn;\n }\n async resetConnection() {\n let rval = false;\n Logger.info('Resetting connection');\n try {\n await this.connectionProvider.clearConnectionCache();\n const tmpValue = await this.testConnection();\n rval = !!tmpValue;\n Logger.info('Reset connection returning %s', rval);\n }\n catch (err) {\n Logger.error('Failed to reset connection : %s', err);\n }\n return rval;\n }\n}\n//# sourceMappingURL=named-parameter-maria-db-service.js.map","import maria from 'mysql2/promise';\nimport { ErrorRatchet, Logger, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';\nimport getPort from 'get-port';\nimport _ from 'lodash';\nexport class RdsMysqlStyleConnectionProvider {\n configPromiseProvider;\n additionalConfig;\n ssh;\n static DEFAULT_CONNECTION_OPTIONS = { multipleStatements: true };\n tunnels = new Map();\n dbPromise = new Map();\n cacheConfigPromise;\n constructor(configPromiseProvider, additionalConfig = RdsMysqlStyleConnectionProvider.DEFAULT_CONNECTION_OPTIONS, ssh) {\n this.configPromiseProvider = configPromiseProvider;\n this.additionalConfig = additionalConfig;\n this.ssh = ssh;\n this.cacheConfigPromise = this.createConnectionConfig();\n Logger.info('Added shutdown handler to the process (Only once per instantiation)');\n this.addShutdownHandlerToProcess();\n }\n get usingSshTunnel() {\n return !!this.ssh;\n }\n addShutdownHandlerToProcess() {\n process.on('exit', () => {\n Logger.info('Process is shutting down, closing connections');\n this.clearConnectionCache().catch((err) => {\n Logger.error('Shutdown connection failed : %s', err);\n });\n });\n }\n async clearConnectionCache() {\n const rval = false;\n Logger.info('Clearing connection cache for RdsMysqlConnectionProvider');\n const oldDbHooks = this.dbPromise;\n const oldSshTunnels = this.tunnels;\n this.cacheConfigPromise = null;\n this.dbPromise = new Map();\n this.tunnels = new Map();\n if (oldDbHooks.size > 0) {\n const hookNames = Array.from(oldDbHooks.keys());\n for (const hookName of hookNames) {\n Logger.info('Shutting down connection : %s', hookName);\n const oldDbHook = oldDbHooks.get(hookName);\n try {\n const oldConn = await oldDbHook;\n if (oldConn) {\n await oldConn.destroy();\n Logger.info('Finished destroying old connection');\n }\n else {\n Logger.warn('Could not get old connection, so not destroying it');\n }\n }\n catch (err) {\n if (ErrorRatchet.asErr(err).message.includes('closed state')) {\n }\n else {\n Logger.error('Something went wrong closing the connection : %s', err);\n throw err;\n }\n }\n }\n }\n if (oldSshTunnels.size > 0) {\n const tunnelNames = Array.from(oldSshTunnels.keys());\n for (const tunnelName of tunnelNames) {\n try {\n Logger.info('Shutting down SSH tunnel: %s', tunnelName);\n const tunnel = oldSshTunnels.get(tunnelName);\n if (tunnel) {\n await this.ssh.shutdown(tunnel);\n }\n else {\n Logger.warn('Could not get old tunnel, so not destroying it');\n }\n Logger.info('SSH Tunnel closed');\n }\n catch (err) {\n Logger.error('Failure closing old tunnel : %s', err);\n }\n }\n }\n Logger.info('Old db and tunnel removed');\n return rval;\n }\n async getConnection(name) {\n Logger.silly('getConnection : %s', name);\n if (!this.dbPromise.has(name)) {\n Logger.info('No dbPromise found for %s - creating new one', name);\n const dbConfig = await this.getDbConfig(name);\n const connection = this.createDatabaseConnection(dbConfig, this.additionalConfig, true);\n this.dbPromise.set(name, connection);\n Logger.info('Added dbPromise for %s', name);\n }\n return this.dbPromise.get(name);\n }\n async createNonPooledDatabaseConnection(queryDefaults, additionalConfig = RdsMysqlStyleConnectionProvider.DEFAULT_CONNECTION_OPTIONS) {\n Logger.info('Creating non-pooled connection for %s', queryDefaults.databaseName);\n const dbConfig = await this.getDbConfig(queryDefaults.databaseName);\n const rval = await this.createDatabaseConnection(dbConfig, additionalConfig, false);\n return rval;\n }\n async getDbConfig(name) {\n Logger.info('RdsMysqlStyleConnectionProvider:getDbConfig:Initiating promise for %s', name);\n const cfgs = await this.configPromise();\n const finder = StringRatchet.trimToEmpty(name).toLowerCase();\n const dbConfig = cfgs.dbList.find((s) => StringRatchet.trimToEmpty(s.label).toLowerCase() === finder);\n if (!dbConfig) {\n throw ErrorRatchet.fErr('Cannot find any connection config named %s (Available are %j)', name, cfgs.dbList.map((d) => d.label));\n }\n return dbConfig;\n }\n async createDatabaseConnection(dbCfg, additionalConfig = RdsMysqlStyleConnectionProvider.DEFAULT_CONNECTION_OPTIONS, clearCacheOnConnectionFailure, sshConfigPromise) {\n Logger.info('In RdsMysqlStyleConnectionProvider:createDatabaseConnection : %s', dbCfg.label);\n const cfgCopy = _.omit(_.clone(dbCfg), 'label', 'tunnelPort');\n if (this.usingSshTunnel && dbCfg.tunnelPort) {\n let tunnel = this.tunnels.get(dbCfg.label);\n if (!tunnel) {\n Logger.debug('Creating SSH tunnel from local port %d to remote host %s and port %d', dbCfg.tunnelPort, dbCfg.host, dbCfg.port);\n const sshConfig = await sshConfigPromise;\n tunnel = await this.ssh.createSSHTunnel(sshConfig, dbCfg.host, dbCfg.port, dbCfg.tunnelPort);\n this.tunnels.set(dbCfg.label, tunnel);\n }\n cfgCopy.port = tunnel.serverOptions.port ?? -1;\n cfgCopy.host = 'localhost';\n }\n Logger.debug('Opening connection for RdsMysqlStyleConnectionProvider');\n let connection;\n try {\n connection = await maria.createConnection({ ...additionalConfig, ...cfgCopy });\n }\n catch (err) {\n Logger.info('Failed trying to create connection : %s : clearing for retry', err);\n if (clearCacheOnConnectionFailure) {\n this.dbPromise = new Map();\n }\n return undefined;\n }\n connection.on('error', (err) => {\n Logger.info('An error was detected on the connection : %s : Clearing', err);\n this.clearConnectionCache()\n .then((cleared) => {\n Logger.info('Connection cleared: %s', cleared);\n })\n .catch((err) => Logger.error('Failed to clear RDS connection cache: %j', err));\n });\n Logger.info('Added error handler to db, there are now %d error handlers and %d shutdown handlers', connection.rawListeners('error').length, process.rawListeners('exit').length);\n return connection;\n }\n configPromise() {\n if (!this.cacheConfigPromise) {\n this.cacheConfigPromise = this.createConnectionConfig();\n }\n return this.cacheConfigPromise;\n }\n async createConnectionConfig() {\n RequireRatchet.notNullOrUndefined(this.configPromiseProvider, 'input');\n const inputPromise = this.configPromiseProvider();\n Logger.info('Creating connection config');\n const cfg = await inputPromise;\n RequireRatchet.true(cfg.dbList.length > 0, 'input.dbList');\n if (this.usingSshTunnel) {\n for (const dbConfig of cfg.dbList) {\n dbConfig.tunnelPort = await getPort();\n }\n }\n return cfg;\n }\n}\n//# sourceMappingURL=rds-mysql-style-connection-provider.js.map","import * as TunnelSsh from 'tunnel-ssh';\nimport { Logger } from '@bitblit/ratchet-common';\nexport class SshTunnelService {\n async shutdown(ssh) {\n if (!ssh.connection) {\n Logger.info('Not shutting down tunnel - non-tunnel passed');\n return false;\n }\n try {\n Logger.info('Shutting down SSH Tunnel');\n ssh.connection.end();\n ssh.server.close();\n return true;\n }\n catch (err) {\n Logger.error('Error closing ssh tunnel : %s', err);\n return false;\n }\n }\n async createSSHTunnel(sshOptions, dstHost, dstPort, localPort) {\n const tunnelOptions = {\n autoClose: true,\n };\n const serverOptions = {\n port: localPort,\n };\n const forwardOptions = {\n srcAddr: 'localhost',\n srcPort: localPort,\n dstAddr: dstHost,\n dstPort: dstPort,\n };\n const [server, connection] = await TunnelSsh.createTunnel(tunnelOptions, serverOptions, sshOptions, forwardOptions);\n server.on('error', (err) => {\n Logger.warn('SSH Server Error : %s', err);\n });\n const rval = {\n tunnelOptions: tunnelOptions,\n serverOptions: serverOptions,\n sshOptions: sshOptions,\n forwardOptions: forwardOptions,\n server: server,\n connection: connection,\n };\n return rval;\n }\n}\n//# sourceMappingURL=ssh-tunnel-service.js.map","import { NamedParameterMariaDbService } from './named-parameter-maria-db-service.js';\nimport { ErrorRatchet, Logger, StringRatchet } from '@bitblit/ratchet-common';\nexport class TransactionalNamedParameterMariaDbService extends NamedParameterMariaDbService {\n myQueryProvider;\n myConnectionProvider;\n myQueryDefaults;\n currentTxFlag;\n static async create(src, queryDefaults, additionalConfig) {\n Logger.info('createTransactionalNamedParameterMariaDbService : %j : %j', queryDefaults, additionalConfig);\n const connProv = await src.createNonPooledMysqlStyleConnectionProvider(queryDefaults, additionalConfig);\n return new TransactionalNamedParameterMariaDbService(src.getQueryProvider(), connProv, queryDefaults);\n }\n constructor(myQueryProvider, myConnectionProvider, myQueryDefaults) {\n super(myQueryProvider, myConnectionProvider, myQueryDefaults);\n this.myQueryProvider = myQueryProvider;\n this.myConnectionProvider = myConnectionProvider;\n this.myQueryDefaults = myQueryDefaults;\n }\n async cleanShutdown() {\n Logger.info('cleanShutdown');\n try {\n const conn = await this.myConnectionProvider.getConnection();\n if (conn) {\n Logger.info('Shutting down connection');\n conn.destroy();\n }\n }\n catch (err) {\n Logger.info('Failure shutting down single-use connection : %s', err);\n }\n }\n async startTransaction() {\n if (!this.currentTxFlag) {\n this.currentTxFlag = StringRatchet.createRandomHexString(10);\n Logger.info('Starting a transaction : %s', this.currentTxFlag);\n const conn = await this.myConnectionProvider.getConnection();\n await conn?.beginTransaction();\n }\n else {\n ErrorRatchet.throwFormattedErr('Tried to start a new transaction while one is already in progress : %s', this.currentTxFlag);\n }\n }\n async commitTransaction() {\n if (this.currentTxFlag) {\n Logger.info('commit a transaction : %s', this.currentTxFlag);\n const conn = await this.myConnectionProvider.getConnection();\n await conn?.commit();\n this.currentTxFlag = undefined;\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot commit transaction - none in process');\n }\n }\n async rollBackTransaction() {\n if (this.currentTxFlag) {\n Logger.info('rollBack a transaction : %s', this.currentTxFlag);\n const conn = await this.myConnectionProvider.getConnection();\n await conn?.rollback();\n this.currentTxFlag = undefined;\n }\n else {\n ErrorRatchet.throwFormattedErr('Cannot rollBack transaction - none in process');\n }\n }\n async buildAndExecuteUpdateOrInsertInTransaction(queryBuilder, timeoutMS = this.myQueryDefaults.timeoutMS) {\n Logger.info('buildAndExecuteUpdateOrInsertInTransaction');\n await this.startTransaction();\n try {\n const rval = await this.buildAndExecuteUpdateOrInsert(queryBuilder, timeoutMS);\n await this.commitTransaction();\n return rval;\n }\n catch (err) {\n Logger.error('Failed - rolling back transaction : %s', err, err);\n await this.rollBackTransaction();\n return null;\n }\n }\n async buildAndExecuteInTransaction(queryBuilder, timeoutMS = this.myQueryDefaults.timeoutMS) {\n Logger.info('buildAndExecuteInTransaction');\n await this.startTransaction();\n try {\n const rval = await this.buildAndExecute(queryBuilder, timeoutMS);\n await this.commitTransaction();\n return rval;\n }\n catch (err) {\n Logger.error('Failed - rolling back transaction : %s', err, err);\n await this.rollBackTransaction();\n return null;\n }\n }\n static async oneStepBuildAndExecuteUpdateOrInsertInTransaction(src, queryBuilder, timeoutMS = src.getQueryDefaults().timeoutMS, additionalConfig) {\n let handler;\n let rval = null;\n try {\n handler = await TransactionalNamedParameterMariaDbService.create(src, src.getQueryDefaults(), additionalConfig);\n rval = await handler.buildAndExecuteUpdateOrInsertInTransaction(queryBuilder, timeoutMS);\n }\n catch (err) {\n Logger.error('Failure in oneStepBuildAndExecuteUpdateOrInsertInTransaction : %j : %s', queryBuilder, err, err);\n }\n finally {\n if (handler) {\n await handler.cleanShutdown();\n }\n }\n return rval;\n }\n static async oneStepBuildAndExecuteInTransaction(src, queryBuilder, timeoutMS = src.getQueryDefaults().timeoutMS, additionalConfig) {\n let handler;\n let rval = null;\n try {\n handler = await TransactionalNamedParameterMariaDbService.create(src, src.getQueryDefaults(), additionalConfig);\n rval = await handler.buildAndExecuteInTransaction(queryBuilder, timeoutMS);\n }\n catch (err) {\n Logger.error('Failure in oneStepbuildAndExecuteInTransaction : %j : %s', queryBuilder, err, err);\n }\n finally {\n if (handler) {\n await handler.cleanShutdown();\n }\n }\n return rval;\n }\n}\n//# sourceMappingURL=transactional-named-parameter-maria-db-service.js.map","export class RatchetRdbmsInfo {\n constructor() { }\n static buildInformation() {\n const val = {\n version: 'LOCAL-SNAPSHOT',\n hash: 'LOCAL-HASH',\n branch: 'LOCAL-BRANCH',\n tag: 'LOCAL-TAG',\n timeBuiltISO: 'LOCAL-TIME-ISO',\n notes: 'LOCAL-NOTES',\n };\n return val;\n }\n}\n//# sourceMappingURL=ratchet-rdbms-info.js.map","import { Logger, RequireRatchet } from '@bitblit/ratchet-common';\nimport { TransactionIsolationLevel } from '../model/transaction-isolation-level.js';\nexport class RelationalDatabaseUtils {\n static async uploadObjectArrayToTable(db, tableName, data, clearTableFirst = false) {\n RequireRatchet.notNullOrUndefined(db, 'db');\n RequireRatchet.notNullOrUndefined(tableName, 'tableName');\n RequireRatchet.notNullOrUndefined(data, 'data');\n Logger.info('Writing %d items to %s (clear: %s)', data.length, tableName, clearTableFirst);\n if (clearTableFirst) {\n Logger.info('Clearing table %s', tableName);\n const { results: deleteResult } = await db.executeQueryWithMeta(TransactionIsolationLevel.Default, 'DELETE FROM ' + tableName, {});\n Logger.info('Removed %d rows', deleteResult.affectedRows);\n }\n const columns = new Set(data.flatMap((row) => Object.keys(row)));\n const colArr = Array.from(columns);\n Logger.info('Found columns : %j', colArr);\n const sql = 'INSERT INTO ' + tableName + ' (' + colArr.join(',') + ') VALUES :multiValue';\n const { results: insertResult } = await db.executeQueryWithMeta(TransactionIsolationLevel.Default, sql, {\n multiValue: data,\n });\n const inserted = insertResult.affectedRows;\n Logger.info('Wrote %d rows', inserted);\n if (inserted !== data.length) {\n Logger.warn('Should have written %d but wrote %d', data.length, inserted);\n }\n return inserted;\n }\n}\n//# sourceMappingURL=relational-database-utils.js.map"],"names":["QueryUtil","fields","replacements","addReplacement","replacement","this","Object","assign","addFields","appendReplacement","replacementKey","appendValue","concat","getFields","getReplacements","static","value","rFn","val","StringRatchet","safeString","Array","isArray","map","s","join","query","inFields","transform","sqlInjectionUnsafeParamRenderer","rval","reformatQueryForLogging","keys","sort","b","a","length","key","find","repl","split","endsWith","qry","inMaxLineLength","maxLineLength","trimToNull","loggableQuery","cleaned","trimToEmpty","idx","Math","min","includes","charAt","substring","Logger","silly","TransactionIsolationLevel","SortDirection","NonPooledMysqlStyleConnectionProvider","connection","constructor","RequireRatchet","notNullOrUndefined","async","info","QueryBuilderResult","namedParams","paginator","transactionIsolationLevel","QueryBuilder","queryProvider","meta","freeze","sqlConstructs","conditionals","debugComment","debugAnnotateMode","Default","clone","withBaseQuery","_","withTransactionIsolationLevel","level","withDebugComment","comment","appendDebugComment","withNamedQuery","queryPath","fetchQuery","ErrorRatchet","throwFormattedErr","baseQuery","withSqlConstruct","withSqlConstructs","params","removeParam","paramNames","withParam","withParams","withExpandedParam","keyPrefix","values","extendIfExists","lengthParamName","oldSize","fetchCopyOfParam","filter","startsWith","forEach","i","paramKey","toUpperCase","slice","withConditional","tag","state","withConditionals","withPaginator","cn","true","max","l","Asc","paramName","fetchCopyOfConditional","conditionalName","containsParam","undefined","getDebugComment","containsConditional","build","internalBuild","buildUnfiltered","unfiltered","applyQueryFragments","applyConditionalBlocks","applyRepeatBlocks","applyPagination","applySqlConstructs","applyComments","runQueryChecks","stripNonAsciiParams","trim","reduced","stripNonAscii","JSON","stringify","parse","quotedNamedParams","matchAll","warn","firstSpaceIndex","indexOf","v","match","ALLOWED_SQL_CONSTRUCT","Error","sqlReservedWords","word","toLowerCase","rawKey","replace","startSymbol","startIndex","endIndex","countSymbol","countParam","joinSymbol","joinString","param","endTag","endTagIndex","repeatedContent","endSymbol","count","indexedContent","startParamTagIndex","endParamTagIndex","rawName","namedQueryElement","paginationRawKey","sortDirEnum","Desc","sortDir","wc","paginationSplitIndex","rawTag","conditional","NamedParameterMariaDbService","connectionProvider","queryDefaults","serviceName","getQueryDefaults","getQueryProvider","additionalConfig","createNonPooledDatabaseConnection","newConn","fetchQueryRawTextByName","queryBuilder","timeoutMS","builder","buildAndExecuteUpdateOrInsert","executeQueryWithMeta","results","maxRetries","res","retry","err","PromiseRatchet","wait","buildAndExecute","resp","groupBy","sw","StopWatch","changeNextQueryTransactionIsolationLevel","result","timeout","innerExecutePreparedAsPromiseWithRetryCloseConnection","TimeoutToken","isTimeoutToken","DurationRatchet","colonFormatMsDuration","duration","error","elapsedMS","LONG_QUERY_TIME_MS","dump","clearConnectionCache","quietMode","rows","timestamp","test","tx","debug","conn","getDB","end","retryCount","innerExecutePreparedAsPromise","errIn","asErr","message","cleared","renderQueryStringForPasteIntoTool","escape","err2","config","namedPlaceholders","outFields","getConnection","databaseName","testConnection","RdsMysqlStyleConnectionProvider","configPromiseProvider","ssh","multipleStatements","tunnels","Map","dbPromise","cacheConfigPromise","DEFAULT_CONNECTION_OPTIONS","createConnectionConfig","addShutdownHandlerToProcess","usingSshTunnel","process","on","catch","oldDbHooks","oldSshTunnels","size","hookNames","from","hookName","oldDbHook","get","oldConn","destroy","tunnelNames","tunnelName","tunnel","shutdown","name","has","dbConfig","getDbConfig","createDatabaseConnection","set","cfgs","configPromise","finder","dbList","label","fErr","d","dbCfg","clearCacheOnConnectionFailure","sshConfigPromise","cfgCopy","omit","tunnelPort","host","port","sshConfig","createSSHTunnel","serverOptions","maria","createConnection","then","rawListeners","inputPromise","cfg","getPort","SshTunnelService","server","close","sshOptions","dstHost","dstPort","localPort","tunnelOptions","autoClose","forwardOptions","srcAddr","srcPort","dstAddr","TunnelSsh","createTunnel","TransactionalNamedParameterMariaDbService","myQueryProvider","myConnectionProvider","myQueryDefaults","currentTxFlag","src","connProv","createNonPooledMysqlStyleConnectionProvider","super","createRandomHexString","beginTransaction","commit","rollback","startTransaction","commitTransaction","rollBackTransaction","handler","create","buildAndExecuteUpdateOrInsertInTransaction","cleanShutdown","buildAndExecuteInTransaction","RatchetRdbmsInfo","version","hash","branch","timeBuiltISO","notes","RelationalDatabaseUtils","db","tableName","data","clearTableFirst","deleteResult","affectedRows","columns","Set","flatMap","row","colArr","sql","insertResult","multiValue","inserted"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitblit/ratchet-rdbms",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.209-alpha",
|
|
4
4
|
"description": "Ratchet tooling for working with relational databases",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -48,12 +48,13 @@
|
|
|
48
48
|
},
|
|
49
49
|
"license": "Apache-2.0",
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@bitblit/ratchet-common": "4.0.
|
|
51
|
+
"@bitblit/ratchet-common": "4.0.209-alpha",
|
|
52
52
|
"get-port": "7.0.0",
|
|
53
53
|
"mysql2": "3.6.0",
|
|
54
54
|
"tunnel-ssh": "5.1.1"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
|
-
"@bitblit/ratchet-common": "4.0.
|
|
57
|
+
"@bitblit/ratchet-common": "4.0.209-alpha",
|
|
58
|
+
"mysql2": "^3.6.0"
|
|
58
59
|
}
|
|
59
60
|
}
|