@@ -574,7 +574,10 @@ private module SpannerCsv {
574
574
"@google-cloud/spanner;;@google-cloud/spanner;;Member[Spanner]" ,
575
575
"@google-cloud/spanner;Database;@google-cloud/spanner;;ReturnValue.Member[instance].ReturnValue.Member[database].ReturnValue" ,
576
576
"@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" ,
578
581
"@google-cloud/spanner;BatchTransaction;@google-cloud/spanner;Database;Member[batchTransaction].ReturnValue" ,
579
582
"@google-cloud/spanner;BatchTransaction;@google-cloud/spanner;Database;Member[createBatchTransaction].ReturnValue.Awaited" ,
580
583
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Database;Member[run,runPartitionedUpdate,runStream]" ,
@@ -597,146 +600,22 @@ private module SpannerCsv {
597
600
]
598
601
}
599
602
}
600
- }
601
603
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" , ] }
616
606
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
+ ]
726
614
}
727
615
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"
731
619
}
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 ( ) }
741
620
}
742
621
}
0 commit comments