faststep 0.0.8.1 → 0.1.0.beta1

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.
@@ -43,12 +43,12 @@ static VALUE faststep_connection_new(int argc, VALUE* argv, VALUE class) {
43
43
  }
44
44
 
45
45
  static VALUE faststep_connection_connect(VALUE self) {
46
- mongo_connection_options* options = (mongo_connection_options*)bson_malloc(sizeof(mongo_connection_options));
46
+ mongo_host_port* host_port = (mongo_host_port*)bson_malloc(sizeof(mongo_host_port));
47
47
 
48
- strcpy(options->host, RSTRING_PTR(rb_iv_get(self, "@host")));
49
- options->port = NUM2INT(rb_iv_get(self, "@port"));
48
+ strcpy(host_port->host, RSTRING_PTR(rb_iv_get(self, "@host")));
49
+ host_port->port = NUM2INT(rb_iv_get(self, "@port"));
50
50
 
51
- _faststep_connect_or_raise(GetFaststepConnection(self), options);
51
+ _faststep_connect_or_raise(GetFaststepConnection(self), host_port);
52
52
 
53
53
  return Qnil;
54
54
  }
@@ -67,8 +67,8 @@ static VALUE faststep_connection_master(const VALUE self) {
67
67
  return bool_to_ruby(mongo_cmd_ismaster(GetFaststepConnection(self), NULL));
68
68
  }
69
69
 
70
- static void _faststep_connect_or_raise(mongo_connection* conn, mongo_connection_options* options) {
71
- mongo_connect(conn, options);
70
+ static void _faststep_connect_or_raise(mongo_connection* conn, mongo_host_port* host_port) {
71
+ mongo_connect(conn, host_port->host, host_port->port);
72
72
 
73
73
  if(conn->connected == 0) {
74
74
  mongo_destroy(conn);
@@ -13,5 +13,5 @@ static VALUE faststep_connection_master(const VALUE);
13
13
 
14
14
  mongo_connection* GetFaststepConnection(const VALUE);
15
15
 
16
- static void _faststep_connect_or_raise(mongo_connection*, mongo_connection_options*);
16
+ static void _faststep_connect_or_raise(mongo_connection*, mongo_host_port*);
17
17
  #endif
@@ -58,7 +58,7 @@ static VALUE faststep_cursor_each(const VALUE self) {
58
58
  fs_cursor->cursor = _faststep_build_mongo_cursor(self);
59
59
  fs_cursor->initialized = 1;
60
60
 
61
- while(mongo_cursor_next(fs_cursor->cursor)) {
61
+ while(MONGO_OK == mongo_cursor_next(fs_cursor->cursor)) {
62
62
  rb_yield(ruby_hash_from_bson(&fs_cursor->cursor->current));
63
63
  }
64
64
  }
@@ -0,0 +1,136 @@
1
+ /*
2
+ * Copyright 2009-2010 10gen, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ /*
18
+ * Portions Copyright 2001 Unicode, Inc.
19
+ *
20
+ * Disclaimer
21
+ *
22
+ * This source code is provided as is by Unicode, Inc. No claims are
23
+ * made as to fitness for any particular purpose. No warranties of any
24
+ * kind are expressed or implied. The recipient agrees to determine
25
+ * applicability of information provided. If this file has been
26
+ * purchased on magnetic or optical media from Unicode, Inc., the
27
+ * sole remedy for any claim will be exchange of defective media
28
+ * within 90 days of receipt.
29
+ *
30
+ * Limitations on Rights to Redistribute This Code
31
+ *
32
+ * Unicode, Inc. hereby grants the right to freely use the information
33
+ * supplied in this file in the creation of products supporting the
34
+ * Unicode Standard, and to make copies of this file in any form
35
+ * for internal or external distribution as long as this notice
36
+ * remains attached.
37
+ */
38
+
39
+
40
+ #include "bson.h"
41
+ #include "encoding.h"
42
+
43
+ /*
44
+ * Index into the table below with the first byte of a UTF-8 sequence to
45
+ * get the number of trailing bytes that are supposed to follow it.
46
+ */
47
+ static const char trailingBytesForUTF8[256] = {
48
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
49
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
50
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
51
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
52
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
53
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
54
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
55
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
56
+ };
57
+
58
+ /* --------------------------------------------------------------------- */
59
+
60
+ /*
61
+ * Utility routine to tell whether a sequence of bytes is legal UTF-8.
62
+ * This must be called with the length pre-determined by the first byte.
63
+ * The length can be set by:
64
+ * length = trailingBytesForUTF8[*source]+1;
65
+ * and the sequence is illegal right away if there aren't that many bytes
66
+ * available.
67
+ * If presented with a length > 4, this returns 0. The Unicode
68
+ * definition of UTF-8 goes up to 4-byte sequences.
69
+ */
70
+ static int isLegalUTF8(const unsigned char* source, int length) {
71
+ unsigned char a;
72
+ const unsigned char* srcptr = source + length;
73
+ switch (length) {
74
+ default: return 0;
75
+ /* Everything else falls through when "true"... */
76
+ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
77
+ case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
78
+ case 2: if ((a = (*--srcptr)) > 0xBF) return 0;
79
+ switch (*source) {
80
+ /* no fall-through in this inner switch */
81
+ case 0xE0: if (a < 0xA0) return 0; break;
82
+ case 0xF0: if (a < 0x90) return 0; break;
83
+ case 0xF4: if (a > 0x8F) return 0; break;
84
+ default: if (a < 0x80) return 0;
85
+ }
86
+ case 1: if (*source >= 0x80 && *source < 0xC2) return 0;
87
+ if (*source > 0xF4) return 0;
88
+ }
89
+ return 1;
90
+ }
91
+
92
+ static int bson_validate_string( bson_buffer* b, const unsigned char* string,
93
+ const int length, const char check_utf8, const char check_dot,
94
+ const char check_dollar) {
95
+
96
+ int position = 0;
97
+ int sequence_length = 1;
98
+
99
+ if( check_dollar && string[0] == '$' ) {
100
+ b->err |= BSON_FIELD_INIT_DOLLAR;
101
+ }
102
+
103
+ while (position < length) {
104
+ if (check_dot && *(string + position) == '.') {
105
+ b->err |= BSON_FIELD_HAS_DOT;
106
+ }
107
+
108
+ if (check_utf8) {
109
+ sequence_length = trailingBytesForUTF8[*(string + position)] + 1;
110
+ if ((position + sequence_length) > length) {
111
+ b->err |= BSON_NOT_UTF8;
112
+ return BSON_ERROR;
113
+ }
114
+ if (!isLegalUTF8(string + position, sequence_length)) {
115
+ b->err |= BSON_NOT_UTF8;
116
+ return BSON_ERROR;
117
+ }
118
+ }
119
+ position += sequence_length;
120
+ }
121
+
122
+ return BSON_OK;
123
+ }
124
+
125
+
126
+ int bson_check_string( bson_buffer* b, const unsigned char* string,
127
+ const int length ) {
128
+
129
+ return bson_validate_string( b, string, length, 1, 0, 0 );
130
+ }
131
+
132
+ int bson_check_field_name( bson_buffer* b, const unsigned char* string,
133
+ const int length ) {
134
+
135
+ return bson_validate_string( b, string, length, 1, 1, 1 );
136
+ }
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright 2009-2010 10gen, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #ifndef _BSON_ENCODING_H_
18
+ #define _BSON_ENCODING_H_
19
+
20
+ MONGO_EXTERN_C_START
21
+
22
+ /**
23
+ * Check that a field name is valid UTF8, does not start with a '$',
24
+ * and contains no '.' characters. Set buffer bit field appropriately.
25
+ * Note that we don't need to check for '\0' because we're using
26
+ * strlen(3), which stops at '\0'.
27
+ *
28
+ * @param b The bson_buffer to which field name will be appended.
29
+ * @param string The field name as char*.
30
+ * @param length The length of the field name.
31
+ *
32
+ * @return BSON_OK if valid UTF8 and BSON_ERROR if not. All BSON strings must be
33
+ * valid UTF8. This function will also check whether the string
34
+ * contains '.' or starts with '$', since the validity of this depends on context.
35
+ * Set the value of b->err appropriately.
36
+ */
37
+ int bson_check_field_name( bson_buffer* b, const unsigned char* string,
38
+ const int length );
39
+
40
+ /**
41
+ * Check that a string is valid UTF8. Sets the buffer bit field appropriately.
42
+ *
43
+ * @param b The bson_buffer to which string will be appended.
44
+ * @param string The string to check.
45
+ * @param length The length of the string.
46
+ *
47
+ * @return BSON_OK if valid UTF-8; otherwise, BSON_ERROR.
48
+ * Sets b->err on error.
49
+ */
50
+ bson_bool_t bson_check_string( bson_buffer* b, const unsigned char* string,
51
+ const int length );
52
+
53
+ MONGO_EXTERN_C_END
54
+ #endif
@@ -103,7 +103,7 @@ int gridfs_init(mongo_connection * client, const char * dbname,
103
103
  bson_append_int(&bb, "filename", 1);
104
104
  bson_from_buffer(&b, &bb);
105
105
  options = 0;
106
- success = mongo_create_index(gfs->client, gfs->files_ns, &b, options, &out);
106
+ success = (mongo_create_index(gfs->client, gfs->files_ns, &b, options, &out) == MONGO_OK);
107
107
  bson_destroy(&b);
108
108
  if (!success) {
109
109
  free((char*)gfs->dbname);
@@ -118,7 +118,7 @@ int gridfs_init(mongo_connection * client, const char * dbname,
118
118
  bson_append_int(&bb, "n", 1);
119
119
  bson_from_buffer(&b, &bb);
120
120
  options = MONGO_INDEX_UNIQUE;
121
- success = mongo_create_index(gfs->client, gfs->chunks_ns, &b, options, &out);
121
+ success = (mongo_create_index(gfs->client, gfs->chunks_ns, &b, options, &out) == MONGO_OK);
122
122
  bson_destroy(&b);
123
123
  if (!success) {
124
124
  free((char*)gfs->dbname);
@@ -160,8 +160,7 @@ static bson gridfs_insert_file( gridfs* gfs, const char* name,
160
160
  bson_append_oid(&buf, "filemd5", &id);
161
161
  bson_append_string(&buf, "root", gfs->prefix);
162
162
  bson_from_buffer(&command, &buf);
163
- assert(mongo_run_command(gfs->client, gfs->dbname,
164
- &command, &res));
163
+ assert(mongo_run_command(gfs->client, gfs->dbname, &command, &res) == MONGO_OK);
165
164
  bson_destroy(&command);
166
165
 
167
166
  /* Create and insert BSON for file metadata */
@@ -325,6 +324,7 @@ bson gridfile_writer_done( gridfile* gfile )
325
324
  oChunk = chunk_new(gfile->id, gfile->chunk_num, gfile->pending_data, gfile->pending_len);
326
325
  mongo_insert(gfile->gfs->client, gfile->gfs->chunks_ns, oChunk);
327
326
  chunk_free(oChunk);
327
+ free(gfile->pending_data);
328
328
  gfile->length += gfile->pending_len;
329
329
  }
330
330
 
@@ -399,7 +399,7 @@ void gridfs_remove_filename(gridfs* gfs, const char* filename )
399
399
  bson_destroy(&query);
400
400
 
401
401
  /* Remove each file and it's chunks from files named filename */
402
- while (mongo_cursor_next(files)) {
402
+ while (mongo_cursor_next(files) == MONGO_OK) {
403
403
  file = files->current;
404
404
  bson_find(&it, &file, "_id");
405
405
  id = *bson_iterator_oid(&it);
@@ -444,7 +444,7 @@ int gridfs_find_query(gridfs* gfs, bson* query,
444
444
 
445
445
 
446
446
  i = (mongo_find_one(gfs->client, gfs->files_ns,
447
- &finalQuery, NULL, &out));
447
+ &finalQuery, NULL, &out) == MONGO_OK);
448
448
  bson_destroy(&uploadDate);
449
449
  bson_destroy(&finalQuery);
450
450
  if (!i)
@@ -658,7 +658,7 @@ bson gridfile_get_chunk(gridfile* gfile, int n)
658
658
 
659
659
  assert(mongo_find_one(gfile->gfs->client,
660
660
  gfile->gfs->chunks_ns,
661
- &query, NULL, &out));
661
+ &query, NULL, &out) == MONGO_OK);
662
662
  return out;
663
663
  }
664
664
 
@@ -719,7 +719,6 @@ gridfs_offset gridfile_write_file(gridfile* gfile, FILE *stream)
719
719
  const int num = gridfile_get_numchunks( gfile );
720
720
 
721
721
  for ( i=0; i<num; i++ ){
722
- printf("N: %d", i);
723
722
  chunk = gridfile_get_chunk( gfile, i );
724
723
  bson_find( &it, &chunk, "data" );
725
724
  len = bson_iterator_bin_len( &it );
@@ -1,3 +1,7 @@
1
+ /**
2
+ * @file gridfs.h
3
+ * @brief GridFS Declarations
4
+ */
1
5
  /*--------------------------------------------------------------------*/
2
6
  /* gridfs.h */
3
7
  /* Author: Christopher Triolo */
@@ -82,7 +86,8 @@ void gridfs_destroy( gridfs* gfs );
82
86
  *
83
87
  * @return - 1 if successful, 0 otherwise
84
88
  */
85
- void gridfile_writer_init( gridfile* gfile, gridfs* gfs, const char* remote_name, const char* content_type );
89
+ void gridfile_writer_init( gridfile* gfile, gridfs* gfs, const char* remote_name,
90
+ const char* content_type );
86
91
 
87
92
  /** Write to a GridFS file incrementally. You can call this function any number
88
93
  * of times with a new buffer each time. This allows you to effectively
@@ -90,7 +95,8 @@ void gridfile_writer_init( gridfile* gfile, gridfs* gfs, const char* remote_name
90
95
  *
91
96
  * @return - 1 if successful, 0 otherwise
92
97
  */
93
- void gridfile_write_buffer( gridfile* gfile, const char* data, gridfs_offset length );
98
+ void gridfile_write_buffer( gridfile* gfile, const char* data,
99
+ gridfs_offset length );
94
100
 
95
101
  /** Signal that writing of this gridfile is complete by
96
102
  * writing any buffered chunks along with the entry in the
data/ext/faststep/md5.h CHANGED
@@ -1,3 +1,5 @@
1
+ /** @file md5.h */
2
+
1
3
  /*
2
4
  Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
3
5