bson_ext 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,260 @@
1
+ /* mongo.h */
2
+
3
+ /* Copyright 2009, 2010 10gen Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #ifndef _MONGO_H_
19
+ #define _MONGO_H_
20
+
21
+ #include "mongo_except.h"
22
+ #include "bson.h"
23
+
24
+ #ifdef _WIN32
25
+ #include <windows.h>
26
+ #include <winsock.h>
27
+ #define mongo_close_socket(sock) ( closesocket(sock) )
28
+ typedef int socklen_t;
29
+ #else
30
+ #include <arpa/inet.h>
31
+ #include <sys/types.h>
32
+ #include <sys/socket.h>
33
+ #include <netdb.h>
34
+ #include <netinet/in.h>
35
+ #include <netinet/tcp.h>
36
+ #define mongo_close_socket(sock) ( close(sock) )
37
+ #endif
38
+
39
+ #if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || _POSIX_C_SOURCE >= 1
40
+ #define _MONGO_USE_GETADDRINFO
41
+ #endif
42
+
43
+ MONGO_EXTERN_C_START
44
+
45
+ typedef struct mongo_host_port {
46
+ char host[255];
47
+ int port;
48
+ struct mongo_host_port* next;
49
+ } mongo_host_port;
50
+
51
+ typedef struct {
52
+ mongo_host_port* seeds; /*< The list of seed nodes provided by the user. */
53
+ mongo_host_port* hosts; /*< The list of host and ports reported by the replica set */
54
+ char* name; /*< The name of the replica set. */
55
+ bson_bool_t primary_connected; /*< Whether we've managed to connect to a primary node. */
56
+ } mongo_replset;
57
+
58
+ typedef struct {
59
+ mongo_host_port* primary;
60
+ mongo_replset* replset;
61
+ int sock;
62
+ bson_bool_t connected;
63
+ mongo_exception_context exception;
64
+ } mongo_connection;
65
+
66
+ #pragma pack(1)
67
+ typedef struct {
68
+ int len;
69
+ int id;
70
+ int responseTo;
71
+ int op;
72
+ } mongo_header;
73
+
74
+ typedef struct {
75
+ mongo_header head;
76
+ char data;
77
+ } mongo_message;
78
+
79
+ typedef struct {
80
+ int flag; /* non-zero on failure */
81
+ int64_t cursorID;
82
+ int start;
83
+ int num;
84
+ } mongo_reply_fields;
85
+
86
+ typedef struct {
87
+ mongo_header head;
88
+ mongo_reply_fields fields;
89
+ char objs;
90
+ } mongo_reply;
91
+ #pragma pack()
92
+
93
+ typedef struct {
94
+ mongo_reply * mm; /* message is owned by cursor */
95
+ mongo_connection * conn; /* connection is *not* owned by cursor */
96
+ const char* ns; /* owned by cursor */
97
+ bson current;
98
+ } mongo_cursor;
99
+
100
+ enum mongo_operations {
101
+ mongo_op_msg = 1000, /* generic msg command followed by a string */
102
+ mongo_op_update = 2001, /* update object */
103
+ mongo_op_insert = 2002,
104
+ mongo_op_query = 2004,
105
+ mongo_op_get_more = 2005,
106
+ mongo_op_delete = 2006,
107
+ mongo_op_kill_cursors = 2007
108
+ };
109
+
110
+
111
+ /*
112
+ * CONNECTIONS
113
+ */
114
+ typedef enum {
115
+ mongo_conn_success = 0,
116
+ mongo_conn_bad_arg,
117
+ mongo_conn_no_socket,
118
+ mongo_conn_fail,
119
+ mongo_conn_not_master, /* leaves conn connected to slave */
120
+ mongo_conn_bad_set_name, /* The provided replica set name doesn't match the existing replica set */
121
+ mongo_conn_cannot_find_primary
122
+ } mongo_conn_return;
123
+
124
+ /*
125
+ * Connect to a single MongoDB server.
126
+ *
127
+ * @param conn a mongo_connection object.
128
+ * @param host a numerical network address or a network hostname.
129
+ * @param port the port to connect to.
130
+ *
131
+ * @return mongo_conn_return
132
+ */
133
+ mongo_conn_return mongo_connect( mongo_connection * conn , const char* host, int port );
134
+
135
+ /*
136
+ * Initialize a connection object for connecting with a replica set.
137
+ *
138
+ * @param conn a mongo_connection object.
139
+ * @param name the name of the replica set to connect to.
140
+ * */
141
+ void mongo_replset_init_conn( mongo_connection* conn, const char* name );
142
+
143
+ /*
144
+ * Add a seed node to the connection object.
145
+ *
146
+ * You must specify at least one seed node before connecting to a replica set.
147
+ *
148
+ * @param conn a mongo_connection object.
149
+ * @param host a numerical network address or a network hostname.
150
+ * @param port the port to connect to.
151
+ */
152
+ int mongo_replset_add_seed( mongo_connection* conn, const char* host, int port );
153
+
154
+ /*
155
+ * Connect to a replica set.
156
+ *
157
+ * Before passing a connection object to this method, you must already have called
158
+ * mongo_replset_init_conn and mongo_replset_add_seed.
159
+ *
160
+ * @param conn a mongo_connection object.
161
+ *
162
+ * @return mongo_conn_return
163
+ */
164
+ mongo_conn_return mongo_replset_connect( mongo_connection* conn );
165
+
166
+ /*
167
+ * Try reconnecting to the server using the existing connection settings.
168
+ *
169
+ * This method will disconnect the current socket. If you've authentication,
170
+ * you'll need to re-authenticate after calling this function.
171
+ *
172
+ * @param conn
173
+ *
174
+ * @return mongo_conn_return
175
+ */
176
+ mongo_conn_return mongo_reconnect( mongo_connection * conn );
177
+
178
+ /*
179
+ * Close the current connection to the server.
180
+ */
181
+ bson_bool_t mongo_disconnect( mongo_connection * conn );
182
+
183
+ /*
184
+ * Close any existing connection to the server and free all allocated
185
+ * memory associated with the conn object.
186
+ *
187
+ * You must always call this method when finished with the connection object.
188
+ *
189
+ * @param conn
190
+ *
191
+ * @return bson_bool_t
192
+ */
193
+ bson_bool_t mongo_destroy( mongo_connection * conn );
194
+
195
+ /* ----------------------------
196
+ CORE METHODS - insert update remove query getmore
197
+ ------------------------------ */
198
+
199
+ void mongo_insert( mongo_connection * conn , const char * ns , bson * data );
200
+ void mongo_insert_batch( mongo_connection * conn , const char * ns , bson ** data , int num );
201
+
202
+ static const int MONGO_UPDATE_UPSERT = 0x1;
203
+ static const int MONGO_UPDATE_MULTI = 0x2;
204
+ void mongo_update(mongo_connection* conn, const char* ns, const bson* cond, const bson* op, int flags);
205
+
206
+ void mongo_remove(mongo_connection* conn, const char* ns, const bson* cond);
207
+
208
+ mongo_cursor* mongo_find(mongo_connection* conn, const char* ns, bson* query, bson* fields ,int nToReturn ,int nToSkip, int options);
209
+ bson_bool_t mongo_cursor_next(mongo_cursor* cursor);
210
+ void mongo_cursor_destroy(mongo_cursor* cursor);
211
+
212
+ /* out can be NULL if you don't care about results. useful for commands */
213
+ bson_bool_t mongo_find_one(mongo_connection* conn, const char* ns, bson* query, bson* fields, bson* out);
214
+
215
+ int64_t mongo_count(mongo_connection* conn, const char* db, const char* coll, bson* query);
216
+
217
+ /* ----------------------------
218
+ HIGHER LEVEL - indexes - command helpers eval
219
+ ------------------------------ */
220
+
221
+ /* Returns true on success */
222
+ /* WARNING: Unlike other drivers these do not cache results */
223
+
224
+ static const int MONGO_INDEX_UNIQUE = 0x1;
225
+ static const int MONGO_INDEX_DROP_DUPS = 0x2;
226
+ bson_bool_t mongo_create_index(mongo_connection * conn, const char * ns, bson * key, int options, bson * out);
227
+ bson_bool_t mongo_create_simple_index(mongo_connection * conn, const char * ns, const char* field, int options, bson * out);
228
+
229
+ /* ----------------------------
230
+ COMMANDS
231
+ ------------------------------ */
232
+
233
+ bson_bool_t mongo_run_command(mongo_connection * conn, const char * db, bson * command, bson * out);
234
+
235
+ /* for simple commands with a single k-v pair */
236
+ bson_bool_t mongo_simple_int_command(mongo_connection * conn, const char * db, const char* cmd, int arg, bson * out);
237
+ bson_bool_t mongo_simple_str_command(mongo_connection * conn, const char * db, const char* cmd, const char* arg, bson * out);
238
+
239
+ bson_bool_t mongo_cmd_drop_db(mongo_connection * conn, const char * db);
240
+ bson_bool_t mongo_cmd_drop_collection(mongo_connection * conn, const char * db, const char * collection, bson * out);
241
+
242
+ void mongo_cmd_add_user(mongo_connection* conn, const char* db, const char* user, const char* pass);
243
+ bson_bool_t mongo_cmd_authenticate(mongo_connection* conn, const char* db, const char* user, const char* pass);
244
+
245
+ /* return value is master status */
246
+ bson_bool_t mongo_cmd_ismaster(mongo_connection * conn, bson * out);
247
+
248
+ /* true return indicates error */
249
+ bson_bool_t mongo_cmd_get_last_error(mongo_connection * conn, const char * db, bson * out);
250
+ bson_bool_t mongo_cmd_get_prev_error(mongo_connection * conn, const char * db, bson * out);
251
+ void mongo_cmd_reset_error(mongo_connection * conn, const char * db);
252
+
253
+ /* ----------------------------
254
+ UTILS
255
+ ------------------------------ */
256
+
257
+ MONGO_EXTERN_C_END
258
+
259
+
260
+ #endif
@@ -0,0 +1,143 @@
1
+ /* mongo_except.h */
2
+
3
+ /* Copyright 2009 10gen Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /* This file is based loosely on cexcept (http://www.nicemice.net/cexcept/). I
19
+ * have modified it to work better with mongo's API.
20
+ *
21
+ * The MONGO_TRY, MONGO_CATCH, and MONGO_TROW macros assume that a pointer to
22
+ * the current connection is available as 'conn'. If you would like to use a
23
+ * different name, use the _GENERIC version of these macros.
24
+ *
25
+ * WARNING: do not return or otherwise jump (excluding MONGO_TRHOW()) out of a
26
+ * MONGO_TRY block as the nessesary clean-up code will not be called. Jumping
27
+ * out of the MONGO_CATCH block is OK.
28
+ */
29
+
30
+ #ifdef MONGO_CODE_EXAMPLE
31
+ mongo_connection conn[1]; /* makes conn a ptr to the connection */
32
+
33
+ MONGO_TRY{
34
+ mongo_find_one(...);
35
+ MONGO_THROW(conn, MONGO_EXCEPT_NETWORK);
36
+ }MONGO_CATCH{
37
+ switch(conn->exception->type){
38
+ case MONGO_EXCEPT_NETWORK:
39
+ do_something();
40
+ case MONGO_EXCEPT_FIND_ERR:
41
+ do_something();
42
+ default:
43
+ MONGO_RETHROW();
44
+ }
45
+ }
46
+ #endif
47
+
48
+ /* ORIGINAL CEXEPT COPYRIGHT:
49
+ cexcept: README 2.0.1 (2008-Jul-23-Wed)
50
+ http://www.nicemice.net/cexcept/
51
+ Adam M. Costello
52
+ http://www.nicemice.net/amc/
53
+
54
+ The package is both free-as-in-speech and free-as-in-beer:
55
+
56
+ Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
57
+ This package may be modified only if its author and version
58
+ information is updated accurately, and may be redistributed
59
+ only if accompanied by this unaltered notice. Subject to those
60
+ restrictions, permission is granted to anyone to do anything with
61
+ this package. The copyright holders make no guarantees regarding
62
+ this package, and are not responsible for any damage resulting from
63
+ its use.
64
+ */
65
+
66
+ #ifndef _MONGO_EXCEPT_H_
67
+ #define _MONGO_EXCEPT_H_
68
+
69
+ #include <setjmp.h>
70
+
71
+ /* always non-zero */
72
+ typedef enum{
73
+ MONGO_EXCEPT_NETWORK=1,
74
+ MONGO_EXCEPT_FIND_ERR
75
+ }mongo_exception_type;
76
+
77
+
78
+ typedef struct {
79
+ jmp_buf base_handler;
80
+ jmp_buf *penv;
81
+ int caught;
82
+ volatile mongo_exception_type type;
83
+ }mongo_exception_context;
84
+
85
+ #define MONGO_TRY MONGO_TRY_GENERIC(conn)
86
+ #define MONGO_CATCH MONGO_CATCH_GENERIC(conn)
87
+ #define MONGO_THROW(e) MONGO_THROW_GENERIC(conn, e)
88
+ #define MONGO_RETHROW() MONGO_RETHROW_GENERIC(conn)
89
+
90
+ /* the rest of this file is implementation details */
91
+
92
+ /* this is done in mongo_connect */
93
+ #define MONGO_INIT_EXCEPTION(exception_ptr) \
94
+ do{ \
95
+ mongo_exception_type t; /* exception_ptr won't be available */\
96
+ (exception_ptr)->penv = &(exception_ptr)->base_handler; \
97
+ if ((t = setjmp((exception_ptr)->base_handler))) { /* yes, '=' is correct */ \
98
+ switch(t){ \
99
+ case MONGO_EXCEPT_NETWORK: bson_fatal_msg(0, "network error"); \
100
+ case MONGO_EXCEPT_FIND_ERR: bson_fatal_msg(0, "error in find"); \
101
+ default: bson_fatal_msg(0, "unknown exception"); \
102
+ } \
103
+ } \
104
+ }while(0)
105
+
106
+ #define MONGO_TRY_GENERIC(connection) \
107
+ { \
108
+ jmp_buf *exception__prev, exception__env; \
109
+ exception__prev = (connection)->exception.penv; \
110
+ (connection)->exception.penv = &exception__env; \
111
+ if (setjmp(exception__env) == 0) { \
112
+ do
113
+
114
+ #define MONGO_CATCH_GENERIC(connection) \
115
+ while ((connection)->exception.caught = 0, \
116
+ (connection)->exception.caught); \
117
+ } \
118
+ else { \
119
+ (connection)->exception.caught = 1; \
120
+ } \
121
+ (connection)->exception.penv = exception__prev; \
122
+ } \
123
+ if (!(connection)->exception.caught ) { } \
124
+ else
125
+
126
+ /* Try ends with do, and Catch begins with while(0) and ends with */
127
+ /* else, to ensure that Try/Catch syntax is similar to if/else */
128
+ /* syntax. */
129
+ /* */
130
+ /* The 0 in while(0) is expressed as x=0,x in order to appease */
131
+ /* compilers that warn about constant expressions inside while(). */
132
+ /* Most compilers should still recognize that the condition is always */
133
+ /* false and avoid generating code for it. */
134
+
135
+ #define MONGO_THROW_GENERIC(connection, type_in) \
136
+ for (;; longjmp(*(connection)->exception.penv, type_in)) \
137
+ (connection)->exception.type = type_in
138
+
139
+ #define MONGO_RETHROW_GENERIC(connection) \
140
+ MONGO_THROW_GENERIC(connection, (connection)->exception.type)
141
+
142
+
143
+ #endif
@@ -0,0 +1,127 @@
1
+ /* Copyright 2009 10gen Inc.
2
+ *
3
+ * Licensed under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License.
5
+ * You may obtain a copy of the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS,
11
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ * See the License for the specific language governing permissions and
13
+ * limitations under the License.
14
+ */
15
+
16
+ /* all the numbers that fit in a 4 byte string */
17
+ const char bson_numstrs[1000][4] = {
18
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
19
+ "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
20
+ "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
21
+ "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
22
+ "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
23
+ "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
24
+ "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
25
+ "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
26
+ "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
27
+ "90", "91", "92", "93", "94", "95", "96", "97", "98", "99",
28
+
29
+ "100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
30
+ "110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
31
+ "120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
32
+ "130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
33
+ "140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
34
+ "150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
35
+ "160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
36
+ "170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
37
+ "180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
38
+ "190", "191", "192", "193", "194", "195", "196", "197", "198", "199",
39
+
40
+ "200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
41
+ "210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
42
+ "220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
43
+ "230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
44
+ "240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
45
+ "250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
46
+ "260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
47
+ "270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
48
+ "280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
49
+ "290", "291", "292", "293", "294", "295", "296", "297", "298", "299",
50
+
51
+ "300", "301", "302", "303", "304", "305", "306", "307", "308", "309",
52
+ "310", "311", "312", "313", "314", "315", "316", "317", "318", "319",
53
+ "320", "321", "322", "323", "324", "325", "326", "327", "328", "329",
54
+ "330", "331", "332", "333", "334", "335", "336", "337", "338", "339",
55
+ "340", "341", "342", "343", "344", "345", "346", "347", "348", "349",
56
+ "350", "351", "352", "353", "354", "355", "356", "357", "358", "359",
57
+ "360", "361", "362", "363", "364", "365", "366", "367", "368", "369",
58
+ "370", "371", "372", "373", "374", "375", "376", "377", "378", "379",
59
+ "380", "381", "382", "383", "384", "385", "386", "387", "388", "389",
60
+ "390", "391", "392", "393", "394", "395", "396", "397", "398", "399",
61
+
62
+ "400", "401", "402", "403", "404", "405", "406", "407", "408", "409",
63
+ "410", "411", "412", "413", "414", "415", "416", "417", "418", "419",
64
+ "420", "421", "422", "423", "424", "425", "426", "427", "428", "429",
65
+ "430", "431", "432", "433", "434", "435", "436", "437", "438", "439",
66
+ "440", "441", "442", "443", "444", "445", "446", "447", "448", "449",
67
+ "450", "451", "452", "453", "454", "455", "456", "457", "458", "459",
68
+ "460", "461", "462", "463", "464", "465", "466", "467", "468", "469",
69
+ "470", "471", "472", "473", "474", "475", "476", "477", "478", "479",
70
+ "480", "481", "482", "483", "484", "485", "486", "487", "488", "489",
71
+ "490", "491", "492", "493", "494", "495", "496", "497", "498", "499",
72
+
73
+ "500", "501", "502", "503", "504", "505", "506", "507", "508", "509",
74
+ "510", "511", "512", "513", "514", "515", "516", "517", "518", "519",
75
+ "520", "521", "522", "523", "524", "525", "526", "527", "528", "529",
76
+ "530", "531", "532", "533", "534", "535", "536", "537", "538", "539",
77
+ "540", "541", "542", "543", "544", "545", "546", "547", "548", "549",
78
+ "550", "551", "552", "553", "554", "555", "556", "557", "558", "559",
79
+ "560", "561", "562", "563", "564", "565", "566", "567", "568", "569",
80
+ "570", "571", "572", "573", "574", "575", "576", "577", "578", "579",
81
+ "580", "581", "582", "583", "584", "585", "586", "587", "588", "589",
82
+ "590", "591", "592", "593", "594", "595", "596", "597", "598", "599",
83
+
84
+ "600", "601", "602", "603", "604", "605", "606", "607", "608", "609",
85
+ "610", "611", "612", "613", "614", "615", "616", "617", "618", "619",
86
+ "620", "621", "622", "623", "624", "625", "626", "627", "628", "629",
87
+ "630", "631", "632", "633", "634", "635", "636", "637", "638", "639",
88
+ "640", "641", "642", "643", "644", "645", "646", "647", "648", "649",
89
+ "650", "651", "652", "653", "654", "655", "656", "657", "658", "659",
90
+ "660", "661", "662", "663", "664", "665", "666", "667", "668", "669",
91
+ "670", "671", "672", "673", "674", "675", "676", "677", "678", "679",
92
+ "680", "681", "682", "683", "684", "685", "686", "687", "688", "689",
93
+ "690", "691", "692", "693", "694", "695", "696", "697", "698", "699",
94
+
95
+ "700", "701", "702", "703", "704", "705", "706", "707", "708", "709",
96
+ "710", "711", "712", "713", "714", "715", "716", "717", "718", "719",
97
+ "720", "721", "722", "723", "724", "725", "726", "727", "728", "729",
98
+ "730", "731", "732", "733", "734", "735", "736", "737", "738", "739",
99
+ "740", "741", "742", "743", "744", "745", "746", "747", "748", "749",
100
+ "750", "751", "752", "753", "754", "755", "756", "757", "758", "759",
101
+ "760", "761", "762", "763", "764", "765", "766", "767", "768", "769",
102
+ "770", "771", "772", "773", "774", "775", "776", "777", "778", "779",
103
+ "780", "781", "782", "783", "784", "785", "786", "787", "788", "789",
104
+ "790", "791", "792", "793", "794", "795", "796", "797", "798", "799",
105
+
106
+ "800", "801", "802", "803", "804", "805", "806", "807", "808", "809",
107
+ "810", "811", "812", "813", "814", "815", "816", "817", "818", "819",
108
+ "820", "821", "822", "823", "824", "825", "826", "827", "828", "829",
109
+ "830", "831", "832", "833", "834", "835", "836", "837", "838", "839",
110
+ "840", "841", "842", "843", "844", "845", "846", "847", "848", "849",
111
+ "850", "851", "852", "853", "854", "855", "856", "857", "858", "859",
112
+ "860", "861", "862", "863", "864", "865", "866", "867", "868", "869",
113
+ "870", "871", "872", "873", "874", "875", "876", "877", "878", "879",
114
+ "880", "881", "882", "883", "884", "885", "886", "887", "888", "889",
115
+ "890", "891", "892", "893", "894", "895", "896", "897", "898", "899",
116
+
117
+ "900", "901", "902", "903", "904", "905", "906", "907", "908", "909",
118
+ "910", "911", "912", "913", "914", "915", "916", "917", "918", "919",
119
+ "920", "921", "922", "923", "924", "925", "926", "927", "928", "929",
120
+ "930", "931", "932", "933", "934", "935", "936", "937", "938", "939",
121
+ "940", "941", "942", "943", "944", "945", "946", "947", "948", "949",
122
+ "950", "951", "952", "953", "954", "955", "956", "957", "958", "959",
123
+ "960", "961", "962", "963", "964", "965", "966", "967", "968", "969",
124
+ "970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
125
+ "980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
126
+ "990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
127
+ };