@@ -76,6 +76,8 @@ type SqlRequest struct {
7676}
7777
7878type SqlResultResponse struct {
79+ Schema string `json:"schema,omitempty"`
80+ Table string `json:"table,omitempty"`
7981 Sql string `json:"sql"`
8082 LastInsertId int64 `json:"last_insert_id,omitempty"`
8183 RowsAffected int `json:"rows_affected,omitempty"`
@@ -93,6 +95,7 @@ type TokenizerResponse struct {
9395var (
9496 reRoutePing = regexp .MustCompile (`^/?$` )
9597 reRouteSchema = regexp .MustCompile (`^/([a-zA-Z][a-zA-Z0-9_-]+)/?$` )
98+ reRouteTable = regexp .MustCompile (`^/([a-zA-Z][a-zA-Z0-9_-]+)/([^/]+)/?$` )
9699 reRouteTokenizer = regexp .MustCompile (`^/-/tokenize/?$` )
97100 reRouteQuery = regexp .MustCompile (`^/-/q/?$` )
98101)
@@ -118,6 +121,11 @@ func (p *plugin) AddHandlers(ctx context.Context, provider Provider) error {
118121 return err
119122 }
120123
124+ // Add handler for table
125+ if err := provider .AddHandlerFuncEx (ctx , reRouteTable , p .ServeTable ); err != nil {
126+ return err
127+ }
128+
121129 // Add handler for SQL tokenizer
122130 if err := provider .AddHandlerFuncEx (ctx , reRouteTokenizer , p .ServeTokenizer , http .MethodPost ); err != nil {
123131 return err
@@ -223,6 +231,65 @@ func (p *plugin) ServeSchema(w http.ResponseWriter, req *http.Request) {
223231 router .ServeJSON (w , response , http .StatusOK , 2 )
224232}
225233
234+ func (p * plugin ) ServeTable (w http.ResponseWriter , req * http.Request ) {
235+ // Query parameters
236+ var q struct {
237+ Offset uint `json:"offset"`
238+ Limit uint `json:"limit"`
239+ }
240+
241+ // Decode params, params[0] is the schema name and params[1] is the table name
242+ params := router .RequestParams (req )
243+
244+ // Decode query
245+ if err := router .RequestQuery (req , & q ); err != nil {
246+ router .ServeError (w , http .StatusBadRequest , err .Error ())
247+ return
248+ }
249+
250+ // Get a connection
251+ conn := p .Get (req .Context ())
252+ if conn == nil {
253+ router .ServeError (w , http .StatusBadGateway , "No connection" )
254+ return
255+ }
256+ defer p .Put (conn )
257+
258+ // Check for schema
259+ if ! stringSliceContainsElement (conn .Schemas (), params [0 ]) {
260+ router .ServeError (w , http .StatusNotFound , "Schema not found" , strconv .Quote (params [0 ]))
261+ return
262+ }
263+ if ! stringSliceContainsElement (conn .Tables (params [0 ]), params [1 ]) {
264+ router .ServeError (w , http .StatusNotFound , "Table not found" , strconv .Quote (params [1 ]))
265+ return
266+ }
267+
268+ // Populate response
269+ var response SqlResultResponse
270+ if err := conn .Do (req .Context (), SQLITE_TXN_DEFAULT , func (txn SQTransaction ) error {
271+ r , err := txn .Query (S (N (params [1 ]).WithSchema (params [0 ])).WithLimitOffset (q .Limit , q .Offset ))
272+ if err != nil {
273+ return err
274+ }
275+ if r , err := results (r ); err != nil {
276+ return err
277+ } else {
278+ response = r
279+ response .Schema = params [0 ]
280+ response .Table = params [1 ]
281+ }
282+ // Return success
283+ return nil
284+ }); err != nil {
285+ router .ServeError (w , http .StatusBadRequest , err .Error ())
286+ return
287+ }
288+
289+ // Serve response
290+ router .ServeJSON (w , response , http .StatusOK , 2 )
291+ }
292+
226293func (p * plugin ) ServeTokenizer (w http.ResponseWriter , req * http.Request ) {
227294 // Decode request
228295 query := SqlRequest {}
@@ -302,6 +369,9 @@ func (p *plugin) ServeQuery(w http.ResponseWriter, req *http.Request) {
302369 router .ServeJSON (w , response , http .StatusOK , 2 )
303370}
304371
372+ ///////////////////////////////////////////////////////////////////////////////
373+ // PRIVATE METHODS
374+
305375func results (r SQResults ) (SqlResultResponse , error ) {
306376 result := SqlResultResponse {
307377 Sql : r .ExpandedSQL (),
@@ -327,9 +397,6 @@ func results(r SQResults) (SqlResultResponse, error) {
327397 return result , nil
328398}
329399
330- ///////////////////////////////////////////////////////////////////////////////
331- // PRIVATE METHODS
332-
333400func stringSliceContainsElement (v []string , elem string ) bool {
334401 for _ , v := range v {
335402 if v == elem {
0 commit comments