Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include "rel_remote.h"
15 :
16 : #define mapi_prefix "mapi:monetdb://"
17 :
18 : int
19 93 : mapiuri_valid( const char *uri)
20 : {
21 93 : int i = 0, l = 0;
22 93 : const char *p = uri;
23 :
24 93 : if (strncmp(p, mapi_prefix, strlen(mapi_prefix)))
25 : return 0;
26 : /* optional host (todo limit to valid hostnames ??) */
27 93 : p += strlen(mapi_prefix);
28 93 : if (*p == '[') { //check for IPv6 addresses
29 0 : for (; *p; p++) {
30 0 : if (*p == ']')
31 : break;
32 : }
33 : }
34 : if (!p)
35 : return 0;
36 966 : for (; *p; p++) {
37 966 : if (*p == ':' || *p == '/')
38 : break;
39 : }
40 93 : if (!p)
41 : return 0;
42 93 : if (*p == ':') {
43 93 : char *x;
44 93 : int i = strtol(p+1, &x, 10);
45 :
46 93 : if (!x || i < 0 || i >= 64*1024)
47 0 : return 0;
48 93 : p = x;
49 : }
50 93 : if (*p != '/')
51 : return 0;
52 93 : p++;
53 : /* now find at most 2 '/'s, with some string inbetween */
54 1295 : for(; *p; p++, l++) {
55 1202 : if (*p == '/') {
56 61 : if (l == 0) /* no string inbetween */
57 : return 0;
58 61 : if (i == 2) /* 3 parts (ie database/schema/table) */
59 : return 0;
60 61 : i++;
61 61 : l=0;
62 : }
63 : }
64 93 : if (i == 0 && l == 0) /* missing database name */
65 : return 0;
66 : return 1;
67 : }
68 :
69 : /* assume valid uri's next functions */
70 :
71 : /* mapiuri_uri prefix including database name */
72 : const char *
73 540 : mapiuri_uri( const char *uri, allocator *sa)
74 : {
75 540 : const char *p = uri, *b = uri, *e;
76 :
77 540 : p = strchr(p, '/')+1;
78 540 : p++;
79 540 : e = p = strchr(p, '/');
80 540 : e = strchr(p+1, '/');
81 540 : if (e)
82 321 : return sa_strndup(sa, b, e - b);
83 : else
84 219 : return sa_strdup(sa, b);
85 : }
86 :
87 : const char *
88 0 : mapiuri_database( const char *uri, allocator *sa)
89 : {
90 0 : const char *p = uri, *b, *e;
91 :
92 0 : p = strchr(p, '/')+1;
93 0 : p++;
94 0 : b = p = strchr(p, '/')+1;
95 0 : e = strchr(p, '/');
96 :
97 0 : if (e) {
98 0 : return sa_strndup(sa, b, e - b);
99 : } else {
100 0 : return sa_strdup(sa, b);
101 : }
102 : }
103 :
104 : const char *
105 211 : mapiuri_schema( const char *uri, allocator *sa, const char *fallback)
106 : {
107 211 : const char *p = uri, *b, *e;
108 :
109 211 : p = strchr(p, '/')+1;
110 211 : p = strchr(p+1, '/');
111 211 : p = strchr(p+1, '/');
112 211 : if (!p)
113 : return fallback;
114 142 : b = ++p;
115 142 : e = strchr(p, '/');
116 :
117 142 : if (e) {
118 142 : return sa_strndup(sa, b, e - b);
119 : } else {
120 0 : return sa_strdup(sa, b);
121 : }
122 : }
123 :
124 : const char *
125 524 : mapiuri_table( const char *uri, allocator *sa, const char *fallback)
126 : {
127 524 : const char *p = uri, *b;
128 :
129 524 : p = strchr(p, '/')+1;
130 524 : p = strchr(p+1, '/');
131 524 : p = strchr(p+1, '/');
132 524 : if (!p)
133 : return fallback;
134 316 : p = strchr(p+1, '/');
135 316 : if (!p)
136 : return fallback;
137 315 : b = ++p;
138 315 : return sa_strdup(sa, b);
139 : }
|