bson_ext 1.5.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ };