Skip to content

Commit 3611543

Browse files
committed
adding documentdb scripting
1 parent fe4bb7a commit 3611543

27 files changed

+395
-28
lines changed

WebJobs.Script.sln

+14
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EasyTable-Node", "EasyTable
172172
sample\EasyTables-Node\index.js = sample\EasyTables-Node\index.js
173173
EndProjectSection
174174
EndProject
175+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DocumentDB-CSharp", "DocumentDB-CSharp", "{437EB182-8CB9-42BD-9019-E5F6E69D1DB3}"
176+
ProjectSection(SolutionItems) = preProject
177+
sample\DocumentDB-CSharp\function.json = sample\DocumentDB-CSharp\function.json
178+
sample\DocumentDB-CSharp\run.csx = sample\DocumentDB-CSharp\run.csx
179+
EndProjectSection
180+
EndProject
181+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DocumentDB-Node", "DocumentDB-Node", "{8811DCFB-1023-4577-AB9C-B4F191200082}"
182+
ProjectSection(SolutionItems) = preProject
183+
sample\DocumentDB-Node\function.json = sample\DocumentDB-Node\function.json
184+
sample\DocumentDB-Node\index.js = sample\DocumentDB-Node\index.js
185+
EndProjectSection
186+
EndProject
175187
Global
176188
GlobalSection(SolutionConfigurationPlatforms) = preSolution
177189
Debug|Any CPU = Debug|Any CPU
@@ -232,5 +244,7 @@ Global
232244
{C23BB3D1-6921-4FCF-8E45-09540E1F986E} = {FF9C0818-30D3-437A-A62D-7A61CA44F459}
233245
{B51AE854-21D2-49D2-B83D-9FA18780A175} = {FF9C0818-30D3-437A-A62D-7A61CA44F459}
234246
{87E44645-EA02-4F12-8C3E-820B5710292D} = {FF9C0818-30D3-437A-A62D-7A61CA44F459}
247+
{437EB182-8CB9-42BD-9019-E5F6E69D1DB3} = {FF9C0818-30D3-437A-A62D-7A61CA44F459}
248+
{8811DCFB-1023-4577-AB9C-B4F191200082} = {FF9C0818-30D3-437A-A62D-7A61CA44F459}
235249
EndGlobalSection
236250
EndGlobal
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"bindings": [
3+
{
4+
"type": "queueTrigger",
5+
"direction": "in",
6+
"queueName": "samples-documentdb-csharp"
7+
},
8+
{
9+
"type": "documentdb",
10+
"direction": "out",
11+
"name": "newItem",
12+
"databaseName": "ItemDb",
13+
"collectionName": "ItemCollection",
14+
"createIfNotExists": false
15+
}
16+
]
17+
}

sample/DocumentDB-CSharp/run.csx

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
public static void Run(string input, out object newItem)
4+
{
5+
newItem = new
6+
{
7+
text = "Hello from C#! " + input
8+
};
9+
}

sample/DocumentDB-Node/function.json

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"bindings": [
3+
{
4+
"type": "queueTrigger",
5+
"direction": "in",
6+
"queueName": "samples-documentdb-node"
7+
},
8+
{
9+
"type": "documentdb",
10+
"direction": "out",
11+
"name": "item",
12+
"databaseName": "ItemDb",
13+
"collectionName": "ItemCollection",
14+
"createIfNotExists": false
15+
}
16+
]
17+
}

sample/DocumentDB-Node/index.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = function (context, input) {
2+
context.log('Node.js queue-triggered DocumentDB function called with input ' + input);
3+
4+
context.bindings.item = {
5+
text: "Hello from Node! " + input
6+
};
7+
8+
context.done();
9+
}

sample/EasyTables-Node/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module.exports = function (context, input) {
2-
context.log('Node.js triggered function via EasyTables called with input ' + input);
2+
context.log('Node.js queue-triggered EasyTable function called with input ' + input);
33

44
context.bindings.item = {
55
Text: "Hello from Node! " + input

src/WebJobs.Script.Host/WebJobs.Script.Host.csproj

+10-2
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,24 @@
6363
<HintPath>..\..\packages\Microsoft.AspNet.WebHooks.Receivers.1.2.0-beta6\lib\net45\Microsoft.AspNet.WebHooks.Receivers.dll</HintPath>
6464
<Private>True</Private>
6565
</Reference>
66+
<Reference Include="Microsoft.Azure.Documents.Client, Version=1.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
67+
<HintPath>..\..\packages\Microsoft.Azure.DocumentDB.1.5.3\lib\net40\Microsoft.Azure.Documents.Client.dll</HintPath>
68+
<Private>True</Private>
69+
</Reference>
6670
<Reference Include="Microsoft.Azure.WebJobs, Version=1.1.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
6771
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Core.1.1.2-alpha-10267\lib\net45\Microsoft.Azure.WebJobs.dll</HintPath>
6872
<Private>True</Private>
6973
</Reference>
7074
<Reference Include="Microsoft.Azure.WebJobs.Extensions, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">
71-
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.1.0.2-alpha-10251\lib\net45\Microsoft.Azure.WebJobs.Extensions.dll</HintPath>
75+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.1.0.2-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.dll</HintPath>
76+
<Private>True</Private>
77+
</Reference>
78+
<Reference Include="Microsoft.Azure.WebJobs.Extensions.DocumentDB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
79+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.DocumentDB.1.0.0-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.DocumentDB.dll</HintPath>
7280
<Private>True</Private>
7381
</Reference>
7482
<Reference Include="Microsoft.Azure.WebJobs.Extensions.EasyTables, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
75-
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.EasyTables.1.0.0-alpha-10251\lib\net45\Microsoft.Azure.WebJobs.Extensions.EasyTables.dll</HintPath>
83+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.EasyTables.1.0.0-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.EasyTables.dll</HintPath>
7684
<Private>True</Private>
7785
</Reference>
7886
<Reference Include="Microsoft.Azure.WebJobs.Extensions.SendGrid, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">

src/WebJobs.Script.Host/packages.config

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
77
<package id="Microsoft.AspNet.WebHooks.Common" version="1.2.0-rc1" targetFramework="net46" />
88
<package id="Microsoft.AspNet.WebHooks.Receivers" version="1.2.0-beta6" targetFramework="net46" />
9+
<package id="Microsoft.Azure.DocumentDB" version="1.5.3" targetFramework="net46" />
910
<package id="Microsoft.Azure.Mobile.Client" version="2.0.1" targetFramework="net46" />
1011
<package id="Microsoft.Azure.ServiceBus.EventProcessorHost" version="1.4.0" targetFramework="net46" />
1112
<package id="Microsoft.Azure.WebJobs" version="1.1.2-alpha-10267" targetFramework="net46" />
1213
<package id="Microsoft.Azure.WebJobs.Core" version="1.1.2-alpha-10267" targetFramework="net46" />
13-
<package id="Microsoft.Azure.WebJobs.Extensions" version="1.0.2-alpha-10251" targetFramework="net46" />
14-
<package id="Microsoft.Azure.WebJobs.Extensions.EasyTables" version="1.0.0-alpha-10251" targetFramework="net46" />
14+
<package id="Microsoft.Azure.WebJobs.Extensions" version="1.0.2-alpha-10252" targetFramework="net46" />
15+
<package id="Microsoft.Azure.WebJobs.Extensions.DocumentDB" version="1.0.0-alpha-10252" targetFramework="net46" />
16+
<package id="Microsoft.Azure.WebJobs.Extensions.EasyTables" version="1.0.0-alpha-10252" targetFramework="net46" />
1517
<package id="Microsoft.Azure.WebJobs.Extensions.SendGrid" version="1.0.2-alpha-10251" targetFramework="net46" />
1618
<package id="Microsoft.Azure.WebJobs.ServiceBus" version="1.1.2-alpha-10267" targetFramework="net46" />
1719
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net46" />

src/WebJobs.Script.WebHost/WebJobs.Script.WebHost.csproj

+10-2
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,24 @@
119119
<HintPath>..\..\packages\Microsoft.AspNet.WebHooks.Receivers.WordPress.1.2.0-beta6\lib\net45\Microsoft.AspNet.WebHooks.Receivers.WordPress.dll</HintPath>
120120
<Private>True</Private>
121121
</Reference>
122+
<Reference Include="Microsoft.Azure.Documents.Client, Version=1.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
123+
<HintPath>..\..\packages\Microsoft.Azure.DocumentDB.1.5.3\lib\net40\Microsoft.Azure.Documents.Client.dll</HintPath>
124+
<Private>True</Private>
125+
</Reference>
122126
<Reference Include="Microsoft.Azure.WebJobs, Version=1.1.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
123127
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Core.1.1.2-alpha-10267\lib\net45\Microsoft.Azure.WebJobs.dll</HintPath>
124128
<Private>True</Private>
125129
</Reference>
126130
<Reference Include="Microsoft.Azure.WebJobs.Extensions, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">
127-
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.1.0.2-alpha-10251\lib\net45\Microsoft.Azure.WebJobs.Extensions.dll</HintPath>
131+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.1.0.2-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.dll</HintPath>
132+
<Private>True</Private>
133+
</Reference>
134+
<Reference Include="Microsoft.Azure.WebJobs.Extensions.DocumentDB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
135+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.DocumentDB.1.0.0-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.DocumentDB.dll</HintPath>
128136
<Private>True</Private>
129137
</Reference>
130138
<Reference Include="Microsoft.Azure.WebJobs.Extensions.EasyTables, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
131-
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.EasyTables.1.0.0-alpha-10251\lib\net45\Microsoft.Azure.WebJobs.Extensions.EasyTables.dll</HintPath>
139+
<HintPath>..\..\packages\Microsoft.Azure.WebJobs.Extensions.EasyTables.1.0.0-alpha-10252\lib\net45\Microsoft.Azure.WebJobs.Extensions.EasyTables.dll</HintPath>
132140
<Private>True</Private>
133141
</Reference>
134142
<Reference Include="Microsoft.Azure.WebJobs.Extensions.SendGrid, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">

src/WebJobs.Script.WebHost/packages.config

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222
<package id="Microsoft.AspNet.WebHooks.Receivers.Stripe" version="1.2.0-beta6" targetFramework="net45" />
2323
<package id="Microsoft.AspNet.WebHooks.Receivers.Trello" version="1.2.0-beta6" targetFramework="net45" />
2424
<package id="Microsoft.AspNet.WebHooks.Receivers.WordPress" version="1.2.0-beta6" targetFramework="net45" />
25+
<package id="Microsoft.Azure.DocumentDB" version="1.5.3" targetFramework="net46" />
2526
<package id="Microsoft.Azure.Mobile.Client" version="2.0.1" targetFramework="net46" />
2627
<package id="Microsoft.Azure.WebJobs" version="1.1.2-alpha-10267" targetFramework="net46" />
2728
<package id="Microsoft.Azure.WebJobs.Core" version="1.1.2-alpha-10267" targetFramework="net46" />
28-
<package id="Microsoft.Azure.WebJobs.Extensions" version="1.0.2-alpha-10251" targetFramework="net46" />
29-
<package id="Microsoft.Azure.WebJobs.Extensions.EasyTables" version="1.0.0-alpha-10251" targetFramework="net46" />
29+
<package id="Microsoft.Azure.WebJobs.Extensions" version="1.0.2-alpha-10252" targetFramework="net46" />
30+
<package id="Microsoft.Azure.WebJobs.Extensions.DocumentDB" version="1.0.0-alpha-10252" targetFramework="net46" />
31+
<package id="Microsoft.Azure.WebJobs.Extensions.EasyTables" version="1.0.0-alpha-10252" targetFramework="net46" />
3032
<package id="Microsoft.Azure.WebJobs.Extensions.SendGrid" version="1.0.2-alpha-10251" targetFramework="net46" />
3133
<package id="Microsoft.Azure.WebJobs.ServiceBus" version="1.1.2-alpha-10267" targetFramework="net46" />
3234
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net46" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.IO;
6+
using System.Reflection;
7+
using System.Reflection.Emit;
8+
using System.Text;
9+
using System.Threading.Tasks;
10+
using Microsoft.Azure.WebJobs.Script.Description;
11+
using Newtonsoft.Json.Linq;
12+
13+
namespace Microsoft.Azure.WebJobs.Script.Binding
14+
{
15+
internal class DocumentDBBinding : FunctionBinding
16+
{
17+
private BindingDirection _bindingDirection;
18+
19+
public DocumentDBBinding(ScriptHostConfiguration config, string name, string databaseName, string collectionName, bool createIfNotExists, FileAccess access, BindingDirection direction) :
20+
base(config, name, BindingType.DocumentDB, access, false)
21+
{
22+
DatabaseName = databaseName;
23+
CollectionName = collectionName;
24+
CreateIfNotExists = createIfNotExists;
25+
_bindingDirection = direction;
26+
}
27+
28+
public string DatabaseName { get; private set; }
29+
30+
public string CollectionName { get; private set; }
31+
32+
public bool CreateIfNotExists { get; private set; }
33+
34+
public override bool HasBindingParameters
35+
{
36+
get
37+
{
38+
return false;
39+
}
40+
}
41+
42+
public override CustomAttributeBuilder GetCustomAttribute()
43+
{
44+
Type attributeType = typeof(DocumentDBAttribute);
45+
PropertyInfo[] props = new[]
46+
{
47+
attributeType.GetProperty("DatabaseName"),
48+
attributeType.GetProperty("CollectionName"),
49+
attributeType.GetProperty("CreateIfNotExists")
50+
};
51+
52+
object[] propValues = new object[]
53+
{
54+
DatabaseName,
55+
CollectionName,
56+
CreateIfNotExists
57+
};
58+
59+
ConstructorInfo constructor = attributeType.GetConstructor(System.Type.EmptyTypes);
60+
61+
return new CustomAttributeBuilder(constructor, new object[] { }, props, propValues);
62+
}
63+
64+
public override async Task BindAsync(BindingContext context)
65+
{
66+
DocumentDBAttribute attribute = new DocumentDBAttribute
67+
{
68+
DatabaseName = DatabaseName,
69+
CollectionName = CollectionName,
70+
CreateIfNotExists = CreateIfNotExists
71+
};
72+
73+
// Only output bindings are supported.
74+
if (Access == FileAccess.Write && _bindingDirection == BindingDirection.Out)
75+
{
76+
IAsyncCollector<JObject> collector = context.Binder.Bind<IAsyncCollector<JObject>>(attribute);
77+
byte[] bytes;
78+
using (MemoryStream ms = new MemoryStream())
79+
{
80+
context.Value.CopyTo(ms);
81+
bytes = ms.ToArray();
82+
}
83+
JObject entity = JObject.Parse(Encoding.UTF8.GetString(bytes));
84+
await collector.AddAsync(entity);
85+
}
86+
}
87+
}
88+
}

src/WebJobs.Script/Binding/EasyTableBinding.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public class EasyTableBinding : FunctionBinding
1818
public EasyTableBinding(ScriptHostConfiguration config, string name, string tableName, string id, FileAccess access, BindingDirection direction) :
1919
base(config, name, BindingType.EasyTable, access, false)
2020
{
21-
this.TableName = tableName;
22-
this.Id = id;
21+
TableName = tableName;
22+
Id = id;
2323
_bindingDirection = direction;
2424
}
2525

@@ -45,8 +45,8 @@ public override CustomAttributeBuilder GetCustomAttribute()
4545

4646
object[] propValues = new[]
4747
{
48-
this.TableName,
49-
this.Id
48+
TableName,
49+
Id
5050
};
5151

5252
ConstructorInfo constructor = typeof(EasyTableAttribute).GetConstructor(System.Type.EmptyTypes);
@@ -58,12 +58,12 @@ public override async Task BindAsync(BindingContext context)
5858
{
5959
EasyTableAttribute attribute = new EasyTableAttribute
6060
{
61-
TableName = this.TableName,
62-
Id = this.Id
61+
TableName = TableName,
62+
Id = Id
6363
};
6464

6565
// Only output bindings are supported.
66-
if (this.Access == FileAccess.Write && _bindingDirection == BindingDirection.Out)
66+
if (Access == FileAccess.Write && _bindingDirection == BindingDirection.Out)
6767
{
6868
IAsyncCollector<JObject> collector = context.Binder.Bind<IAsyncCollector<JObject>>(attribute);
6969
byte[] bytes;

src/WebJobs.Script/Binding/FunctionBinding.cs

+4
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ internal static Collection<FunctionBinding> GetBindings(ScriptHostConfiguration
114114
EasyTableBindingMetadata easyTableMetadata = (EasyTableBindingMetadata)bindingMetadata;
115115
bindings.Add(new EasyTableBinding(config, name, easyTableMetadata.TableName, easyTableMetadata.Id, fileAccess, bindingMetadata.Direction));
116116
break;
117+
case BindingType.DocumentDB:
118+
DocumentDBBindingMetadata docDBMetadata = (DocumentDBBindingMetadata)bindingMetadata;
119+
bindings.Add(new DocumentDBBinding(config, name, docDBMetadata.DatabaseName, docDBMetadata.CollectionName, docDBMetadata.CreateIfNotExists, fileAccess, bindingMetadata.Direction));
120+
break;
117121
}
118122
}
119123
}

src/WebJobs.Script/Description/BindingType.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public enum BindingType
1818
Table,
1919
ManualTrigger,
2020
TimerTrigger,
21-
EasyTable
21+
EasyTable,
22+
DocumentDB
2223
}
2324
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Microsoft.Azure.WebJobs.Extensions.DocumentDB;
6+
7+
namespace Microsoft.Azure.WebJobs.Script.Description
8+
{
9+
internal class DocumentDBBindingMetadata : BindingMetadata
10+
{
11+
public string DatabaseName { get; set; }
12+
13+
public string CollectionName { get; set; }
14+
15+
public bool CreateIfNotExists { get; set; }
16+
17+
[AllowNameResolution]
18+
public string ConnectionString { get; set; }
19+
20+
public override void ApplyToConfig(JobHostConfigurationBuilder configBuilder)
21+
{
22+
if (configBuilder == null)
23+
{
24+
throw new ArgumentNullException("configBuilder");
25+
}
26+
27+
DocumentDBConfiguration config = new DocumentDBConfiguration();
28+
if (!string.IsNullOrEmpty(ConnectionString))
29+
{
30+
config.ConnectionString = ConnectionString;
31+
}
32+
33+
configBuilder.Config.UseDocumentDB(config);
34+
}
35+
}
36+
}

src/WebJobs.Script/Host/ScriptHost.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,9 @@ private static BindingMetadata ParseBindingMetadata(JObject binding, INameResolv
321321
case BindingType.EasyTable:
322322
bindingMetadata = binding.ToObject<EasyTableBindingMetadata>();
323323
break;
324+
case BindingType.DocumentDB:
325+
bindingMetadata = binding.ToObject<DocumentDBBindingMetadata>();
326+
break;
324327
}
325328

326329
bindingMetadata.Type = bindingType;
@@ -352,7 +355,7 @@ private Collection<FunctionDescriptor> ReadFunctions(ScriptHostConfiguration con
352355

353356
functionName = Path.GetFileNameWithoutExtension(scriptDir);
354357

355-
if (ScriptConfig.Functions != null &&
358+
if (ScriptConfig.Functions != null &&
356359
!ScriptConfig.Functions.Contains(functionName, StringComparer.OrdinalIgnoreCase))
357360
{
358361
// a functions filter has been specified and the current function is

0 commit comments

Comments
 (0)