You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Darwinism/RQL/Repository/LinqAPI.vb

80 lines
2.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

Imports System.Collections.Specialized
Imports Microsoft.VisualBasic.CommandLine.Reflection
Imports Microsoft.VisualBasic.ComputingServices.TaskHost
Imports Microsoft.VisualBasic.Net
Imports Microsoft.VisualBasic.SecurityString.MD5Hash
Imports Microsoft.VisualBasic.Serialization
Imports Microsoft.VisualBasic.Serialization.JSON
Imports SMRUCC.WebCloud.HTTPInternal.AppEngine
Imports SMRUCC.WebCloud.HTTPInternal.AppEngine.APIMethods
Imports SMRUCC.WebCloud.HTTPInternal.Platform
Namespace Linq
''' <summary>
''' 对外部提供Linq查询服务的WebApp
''' </summary>
Public Class LinqAPI : Inherits LinqPool
Public ReadOnly Property Repository As Repository
''' <summary>
''' {hashCode.tolower, linq_uid}
''' </summary>
ReadOnly __uidMaps As New Dictionary(Of String, String)
Sub New(repo As Repository)
Me.Repository = repo
End Sub
''' <summary>
'''
''' </summary>
''' <param name="url">数据源的引用位置</param>
''' <param name="args">查询参数</param>
''' <returns></returns>
Public Overloads Function OpenQuery(url As String, args As String) As LinqEntry
Dim source As IEnumerable = Repository.GetRepository(url, args) ' expr为空的话则没有where测试则返回所有数据
Dim type As Type = Repository.GetType(url) ' 得到元素的类型信息
Dim linq As IPEndPoint = OpenQuery(source, type)
Dim result As New LinqEntry(type) With {
.Linq = linq,
.uid = (linq.ToString & Now.ToString).GetMd5Hash.ToLower
}
Call __uidMaps.Add(result.uid, result.Linq.ToString)
Return result
End Function
''' <summary>
''' Linq数据源的MD5哈希值
''' </summary>
Const uid As String = "uid"
Const n As String = "n"
''' <summary>
'''
''' </summary>
''' <param name="args">uid,n</param>
''' <returns></returns>
Public Function MoveNext(args As NameValueCollection) As String
Dim uid As String = args(LinqAPI.uid)
Dim n As Integer = Scripting.CastInteger(args(LinqAPI.n))
Dim linq As LinqProvider = GetLinq(__uidMaps(uid))
Dim source As Object = linq.Moves(n)
Dim json As String = JsonContract.GetObjectJson(source, linq.BaseType)
Return json
End Function
''' <summary>
''' 释放掉一个Linq查询的资源
''' </summary>
''' <param name="args"></param>
''' <returns></returns>
Public Overloads Function Free(args As NameValueCollection) As String
Dim uid As String = args(LinqAPI.uid)
Call MyBase.Free(__uidMaps(uid))
Call __uidMaps.Remove(uid)
Return True
End Function
End Class
End Namespace