@@ -574,7 +574,10 @@ private module SpannerCsv {
574574 "@google-cloud/spanner;;@google-cloud/spanner;;Member[Spanner]" ,
575575 "@google-cloud/spanner;Database;@google-cloud/spanner;;ReturnValue.Member[instance].ReturnValue.Member[database].ReturnValue" ,
576576 "@google-cloud/spanner;v1.SpannerClient;@google-cloud/spanner;;Member[v1].Member[SpannerClient].Instance" ,
577- "@google-cloud/spanner;Transaction;@google-cloud/spanner;Database;Member[runTransaction,runTransactionAsync].Argument[0..1].Parameter[1]" ,
577+ "@google-cloud/spanner;Transaction;@google-cloud/spanner;Database;Member[runTransaction,runTransactionAsync,getTransaction].Argument[0..1].Parameter[1]" ,
578+ "@google-cloud/spanner;Transaction;@google-cloud/spanner;Database;Member[getTransaction].ReturnValue.Awaited" ,
579+ "@google-cloud/spanner;Snapshot;@google-cloud/spanner;Database;Member[getSnapshot].Argument[0..1].Parameter[1]" ,
580+ "@google-cloud/spanner;Snapshot;@google-cloud/spanner;Database;Member[getSnapshot].ReturnValue.Awaited" ,
578581 "@google-cloud/spanner;BatchTransaction;@google-cloud/spanner;Database;Member[batchTransaction].ReturnValue" ,
579582 "@google-cloud/spanner;BatchTransaction;@google-cloud/spanner;Database;Member[createBatchTransaction].ReturnValue.Awaited" ,
580583 "@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Database;Member[run,runPartitionedUpdate,runStream]" ,
@@ -597,146 +600,22 @@ private module SpannerCsv {
597600 ]
598601 }
599602 }
600- }
601603
602- /**
603- * Provides classes modeling the Google Cloud Spanner library.
604- */
605- private module Spanner {
606- /**
607- * Gets a node that refers to the `Spanner` class
608- */
609- API:: Node spanner ( ) {
610- // older versions
611- result = API:: moduleImport ( "@google-cloud/spanner" )
612- or
613- // newer versions
614- result = API:: moduleImport ( "@google-cloud/spanner" ) .getMember ( "Spanner" )
615- }
604+ class SpannerSources extends ModelInput:: SourceModelCsv {
605+ string spannerClass ( ) { result = [ "v1.SpannerClient" , "Database" , "Transaction" , "Snapshot" , ] }
616606
617- /**
618- * Gets a node that refers to an instance of the `Database` class.
619- */
620- API:: Node database ( ) {
621- result =
622- spanner ( ) .getReturn ( ) .getMember ( "instance" ) .getReturn ( ) .getMember ( "database" ) .getReturn ( )
623- or
624- result = API:: Node:: ofType ( "@google-cloud/spanner" , "Database" )
625- }
626-
627- /**
628- * Gets a node that refers to an instance of the `v1.SpannerClient` class.
629- */
630- API:: Node v1SpannerClient ( ) {
631- result = spanner ( ) .getMember ( "v1" ) .getMember ( "SpannerClient" ) .getInstance ( )
632- or
633- result = API:: Node:: ofType ( "@google-cloud/spanner" , "v1.SpannerClient" )
634- }
635-
636- /**
637- * Gets a node that refers to a transaction object.
638- */
639- API:: Node transaction ( ) {
640- result =
641- database ( )
642- .getMember ( [ "runTransaction" , "runTransactionAsync" ] )
643- .getParameter ( [ 0 , 1 ] )
644- .getParameter ( 1 )
645- or
646- result = API:: Node:: ofType ( "@google-cloud/spanner" , "Transaction" )
647- }
648-
649- /**
650- * Gets a node that refers to a snapshot object.
651- */
652- API:: Node snapshot ( ) {
653- result = database ( ) .getMember ( "getSnapshot" ) .getParameter ( [ 0 , 1 ] ) .getParameter ( 1 )
654- or
655- result = API:: Node:: ofType ( "@google-cloud/spanner" , "Snapshot" )
656- }
657-
658- /** Gets an API node referring to a `BatchTransaction` object. */
659- API:: Node batchTransaction ( ) {
660- result = database ( ) .getMember ( "batchTransaction" ) .getReturn ( )
661- or
662- result = database ( ) .getMember ( "createBatchTransaction" ) .getReturn ( ) .getPromised ( )
663- or
664- result = API:: Node:: ofType ( "@google-cloud/spanner" , "BatchTransaction" )
665- }
666-
667- /**
668- * A call to a Spanner method that executes a SQL query.
669- */
670- abstract class SqlExecution extends DatabaseAccess , DataFlow:: InvokeNode { }
671-
672- /**
673- * A SQL execution that takes the input directly in the first argument or in the `sql` option.
674- */
675- class SqlExecutionDirect extends SqlExecution {
676- SqlExecutionDirect ( ) {
677- this = database ( ) .getMember ( [ "run" , "runPartitionedUpdate" , "runStream" ] ) .getACall ( )
678- or
679- this = transaction ( ) .getMember ( [ "run" , "runStream" , "runUpdate" ] ) .getACall ( )
680- or
681- this = batchTransaction ( ) .getMember ( "createQueryPartitions" ) .getACall ( )
682- or
683- this = snapshot ( ) .getMember ( [ "run" , "runStream" ] ) .getACall ( )
684- }
685-
686- override DataFlow:: Node getAResult ( ) {
687- PromiseFlow:: loadStep ( this .getALocalUse ( ) , result , Promises:: valueProp ( ) )
688- or
689- this = [ database ( ) , transaction ( ) , snapshot ( ) ] .getMember ( "run" ) .getACall ( ) and
690- result = this .getCallback ( _) .getParameter ( 1 )
691- }
692-
693- override DataFlow:: Node getAQueryArgument ( ) {
694- result = this .getArgument ( 0 )
695- or
696- result = this .getOptionArgument ( 0 , "sql" )
697- }
698- }
699-
700- /**
701- * A SQL execution that takes an array of SQL strings or { sql: string } objects.
702- */
703- class SqlExecutionBatch extends SqlExecution , API:: CallNode {
704- SqlExecutionBatch ( ) { this = transaction ( ) .getMember ( "batchUpdate" ) .getACall ( ) }
705-
706- override DataFlow:: Node getAResult ( ) {
707- none ( ) // no results, batch update callbacks get only row counts.
708- }
709-
710- override DataFlow:: Node getAQueryArgument ( ) {
711- // just use the whole array as the query argument, as arrays becomes tainted if one of the elements
712- // are tainted
713- result = this .getArgument ( 0 )
714- or
715- result = this .getParameter ( 0 ) .getUnknownMember ( ) .getMember ( "sql" ) .getARhs ( )
716- }
717- }
718-
719- /**
720- * A SQL execution that only takes the input in the `sql` option, and do not accept query strings
721- * directly.
722- */
723- class SqlExecutionWithOption extends SqlExecution , DataFlow:: CallNode {
724- SqlExecutionWithOption ( ) {
725- this = v1SpannerClient ( ) .getMember ( [ "executeSql" , "executeStreamingSql" ] ) .getACall ( )
607+ string resultPath ( ) {
608+ result =
609+ [
610+ "Member[executeSql].Argument[0..].Parameter[1]" ,
611+ "Member[executeSql].ReturnValue.Awaited.Member[0]" , "Member[run].ReturnValue.Awaited" ,
612+ "Member[run].Argument[0..].Parameter[1]" ,
613+ ]
726614 }
727615
728- override DataFlow :: Node getAResult ( ) {
729- this = v1SpannerClient ( ) . getMember ( "executeSql" ) . getACall ( ) and
730- result = this . getCallback ( _ ) . getParameter ( 1 )
616+ override predicate row ( string row ) {
617+ row =
618+ "@google-cloud/spanner;" + spannerClass ( ) + ";" + resultPath ( ) + ";database-access-result"
731619 }
732-
733- override DataFlow:: Node getAQueryArgument ( ) { result = this .getOptionArgument ( 0 , "sql" ) }
734- }
735-
736- /**
737- * An expression that is interpreted as a SQL string.
738- */
739- class QueryString extends SQL:: SqlString {
740- QueryString ( ) { this = any ( SqlExecution se ) .getAQueryArgument ( ) .asExpr ( ) }
741620 }
742621}
0 commit comments