appoptics_apm 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +43 -0
  3. data/.dockerignore +5 -0
  4. data/.gitignore +23 -0
  5. data/.rubocop.yml +5 -0
  6. data/.travis.yml +82 -0
  7. data/CHANGELOG.md +769 -0
  8. data/CONFIG.md +33 -0
  9. data/Dockerfile +41 -0
  10. data/Dockerfile_test +66 -0
  11. data/Gemfile +41 -0
  12. data/LICENSE +193 -0
  13. data/README.md +351 -0
  14. data/Rakefile +202 -0
  15. data/Vagrantfile +67 -0
  16. data/appoptics_apm.gemspec +55 -0
  17. data/build_gems.sh +15 -0
  18. data/docker-compose.yml +73 -0
  19. data/examples/DNT.md +35 -0
  20. data/examples/carrying_context.rb +220 -0
  21. data/examples/instrumenting_metal_controller.rb +8 -0
  22. data/examples/puma_on_heroku_config.rb +17 -0
  23. data/examples/tracing_async_threads.rb +124 -0
  24. data/examples/tracing_background_jobs.rb +53 -0
  25. data/examples/tracing_forked_processes.rb +99 -0
  26. data/examples/unicorn_on_heroku_config.rb +28 -0
  27. data/ext/oboe_metal/extconf.rb +54 -0
  28. data/ext/oboe_metal/lib/.keep +0 -0
  29. data/ext/oboe_metal/lib/liboboe-1.0.so.0.0.0 +0 -0
  30. data/ext/oboe_metal/noop/noop.c +7 -0
  31. data/ext/oboe_metal/src/VERSION +1 -0
  32. data/ext/oboe_metal/src/bson/bson.h +221 -0
  33. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  34. data/ext/oboe_metal/src/oboe.h +883 -0
  35. data/ext/oboe_metal/src/oboe.hpp +793 -0
  36. data/ext/oboe_metal/src/oboe_debug.h +50 -0
  37. data/ext/oboe_metal/src/oboe_wrap.cxx +6088 -0
  38. data/ext/oboe_metal/tests/test.rb +11 -0
  39. data/gemfiles/delayed_job.gemfile +36 -0
  40. data/gemfiles/frameworks.gemfile +44 -0
  41. data/gemfiles/instrumentation_mocked.gemfile +29 -0
  42. data/gemfiles/libraries.gemfile +85 -0
  43. data/gemfiles/rails23.gemfile +39 -0
  44. data/gemfiles/rails30.gemfile +42 -0
  45. data/gemfiles/rails31.gemfile +44 -0
  46. data/gemfiles/rails32.gemfile +54 -0
  47. data/gemfiles/rails40.gemfile +27 -0
  48. data/gemfiles/rails41.gemfile +27 -0
  49. data/gemfiles/rails42.gemfile +35 -0
  50. data/gemfiles/rails50.gemfile +44 -0
  51. data/gemfiles/rails51.gemfile +44 -0
  52. data/get_version.rb +5 -0
  53. data/init.rb +4 -0
  54. data/lib/appoptics_apm/api/layerinit.rb +39 -0
  55. data/lib/appoptics_apm/api/logging.rb +359 -0
  56. data/lib/appoptics_apm/api/memcache.rb +34 -0
  57. data/lib/appoptics_apm/api/profiling.rb +201 -0
  58. data/lib/appoptics_apm/api/tracing.rb +152 -0
  59. data/lib/appoptics_apm/api/util.rb +128 -0
  60. data/lib/appoptics_apm/api.rb +18 -0
  61. data/lib/appoptics_apm/base.rb +252 -0
  62. data/lib/appoptics_apm/config.rb +281 -0
  63. data/lib/appoptics_apm/frameworks/grape.rb +93 -0
  64. data/lib/appoptics_apm/frameworks/padrino/templates.rb +58 -0
  65. data/lib/appoptics_apm/frameworks/padrino.rb +52 -0
  66. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +106 -0
  67. data/lib/appoptics_apm/frameworks/rails/inst/action_controller2.rb +61 -0
  68. data/lib/appoptics_apm/frameworks/rails/inst/action_controller3.rb +58 -0
  69. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
  70. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
  71. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
  72. data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +58 -0
  73. data/lib/appoptics_apm/frameworks/rails/inst/action_view_2x.rb +56 -0
  74. data/lib/appoptics_apm/frameworks/rails/inst/action_view_30.rb +50 -0
  75. data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
  76. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  77. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  78. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  79. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +120 -0
  80. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +101 -0
  81. data/lib/appoptics_apm/frameworks/rails.rb +116 -0
  82. data/lib/appoptics_apm/frameworks/sinatra/templates.rb +56 -0
  83. data/lib/appoptics_apm/frameworks/sinatra.rb +71 -0
  84. data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
  85. data/lib/appoptics_apm/inst/bunny-consumer.rb +92 -0
  86. data/lib/appoptics_apm/inst/curb.rb +329 -0
  87. data/lib/appoptics_apm/inst/dalli.rb +85 -0
  88. data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
  89. data/lib/appoptics_apm/inst/em-http-request.rb +105 -0
  90. data/lib/appoptics_apm/inst/excon.rb +130 -0
  91. data/lib/appoptics_apm/inst/faraday.rb +77 -0
  92. data/lib/appoptics_apm/inst/http.rb +83 -0
  93. data/lib/appoptics_apm/inst/httpclient.rb +176 -0
  94. data/lib/appoptics_apm/inst/memcache.rb +102 -0
  95. data/lib/appoptics_apm/inst/memcached.rb +94 -0
  96. data/lib/appoptics_apm/inst/mongo.rb +242 -0
  97. data/lib/appoptics_apm/inst/mongo2.rb +225 -0
  98. data/lib/appoptics_apm/inst/moped.rb +466 -0
  99. data/lib/appoptics_apm/inst/rack.rb +146 -0
  100. data/lib/appoptics_apm/inst/redis.rb +275 -0
  101. data/lib/appoptics_apm/inst/resque.rb +151 -0
  102. data/lib/appoptics_apm/inst/rest-client.rb +50 -0
  103. data/lib/appoptics_apm/inst/sequel.rb +178 -0
  104. data/lib/appoptics_apm/inst/sidekiq-client.rb +53 -0
  105. data/lib/appoptics_apm/inst/sidekiq-worker.rb +67 -0
  106. data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
  107. data/lib/appoptics_apm/inst/typhoeus.rb +113 -0
  108. data/lib/appoptics_apm/instrumentation.rb +22 -0
  109. data/lib/appoptics_apm/legacy_method_profiling.rb +97 -0
  110. data/lib/appoptics_apm/loading.rb +66 -0
  111. data/lib/appoptics_apm/logger.rb +41 -0
  112. data/lib/appoptics_apm/method_profiling.rb +33 -0
  113. data/lib/appoptics_apm/ruby.rb +35 -0
  114. data/lib/appoptics_apm/support.rb +135 -0
  115. data/lib/appoptics_apm/test.rb +94 -0
  116. data/lib/appoptics_apm/thread_local.rb +26 -0
  117. data/lib/appoptics_apm/util.rb +312 -0
  118. data/lib/appoptics_apm/version.rb +15 -0
  119. data/lib/appoptics_apm/xtrace.rb +103 -0
  120. data/lib/appoptics_apm.rb +72 -0
  121. data/lib/joboe_metal.rb +214 -0
  122. data/lib/oboe/README +2 -0
  123. data/lib/oboe/backward_compatibility.rb +80 -0
  124. data/lib/oboe/inst/rack.rb +11 -0
  125. data/lib/oboe.rb +7 -0
  126. data/lib/oboe_metal.rb +187 -0
  127. data/lib/rails/generators/appoptics_apm/install_generator.rb +45 -0
  128. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +222 -0
  129. data/ruby_setup.sh +47 -0
  130. data/run_docker_build_gem_upload_to_packagecloud.sh +20 -0
  131. data/run_tests_docker.rb +32 -0
  132. data/test/benchmark/README.md +65 -0
  133. data/test/benchmark/logging_bench.rb +54 -0
  134. data/test/benchmark/with_libraries_gemfile/bunny_bench.rb +69 -0
  135. data/test/benchmark/with_rails5x_gemfile/action_controller5x_bench.rb +43 -0
  136. data/test/frameworks/apps/grape_nested.rb +33 -0
  137. data/test/frameworks/apps/grape_simple.rb +80 -0
  138. data/test/frameworks/apps/padrino_simple.rb +80 -0
  139. data/test/frameworks/apps/sinatra_simple.rb +55 -0
  140. data/test/frameworks/grape_test.rb +286 -0
  141. data/test/frameworks/padrino_test.rb +222 -0
  142. data/test/frameworks/rails3x_test.rb +554 -0
  143. data/test/frameworks/rails4x_test.rb +570 -0
  144. data/test/frameworks/rails5x_api_test.rb +210 -0
  145. data/test/frameworks/rails5x_test.rb +376 -0
  146. data/test/frameworks/rails_shared_tests.rb +172 -0
  147. data/test/frameworks/sinatra_test.rb +140 -0
  148. data/test/instrumentation/bunny_client_test.rb +276 -0
  149. data/test/instrumentation/bunny_consumer_test.rb +204 -0
  150. data/test/instrumentation/curb_test.rb +398 -0
  151. data/test/instrumentation/dalli_test.rb +177 -0
  152. data/test/instrumentation/em_http_request_test.rb +89 -0
  153. data/test/instrumentation/excon_test.rb +231 -0
  154. data/test/instrumentation/faraday_test.rb +228 -0
  155. data/test/instrumentation/http_test.rb +143 -0
  156. data/test/instrumentation/httpclient_test.rb +320 -0
  157. data/test/instrumentation/memcache_test.rb +260 -0
  158. data/test/instrumentation/memcached_test.rb +229 -0
  159. data/test/instrumentation/mongo_v1_test.rb +479 -0
  160. data/test/instrumentation/mongo_v2_index_test.rb +124 -0
  161. data/test/instrumentation/mongo_v2_test.rb +584 -0
  162. data/test/instrumentation/mongo_v2_view_test.rb +435 -0
  163. data/test/instrumentation/moped_test.rb +517 -0
  164. data/test/instrumentation/rack_test.rb +165 -0
  165. data/test/instrumentation/redis_hashes_test.rb +268 -0
  166. data/test/instrumentation/redis_keys_test.rb +321 -0
  167. data/test/instrumentation/redis_lists_test.rb +310 -0
  168. data/test/instrumentation/redis_misc_test.rb +163 -0
  169. data/test/instrumentation/redis_sets_test.rb +296 -0
  170. data/test/instrumentation/redis_sortedsets_test.rb +328 -0
  171. data/test/instrumentation/redis_strings_test.rb +349 -0
  172. data/test/instrumentation/resque_test.rb +185 -0
  173. data/test/instrumentation/rest-client_test.rb +288 -0
  174. data/test/instrumentation/sequel_mysql2_test.rb +353 -0
  175. data/test/instrumentation/sequel_mysql_test.rb +334 -0
  176. data/test/instrumentation/sequel_pg_test.rb +336 -0
  177. data/test/instrumentation/sidekiq-client_test.rb +159 -0
  178. data/test/instrumentation/sidekiq-worker_test.rb +180 -0
  179. data/test/instrumentation/twitter-cassandra_test.rb +424 -0
  180. data/test/instrumentation/typhoeus_test.rb +284 -0
  181. data/test/jobs/delayed_job/db_worker_job.rb +29 -0
  182. data/test/jobs/delayed_job/error_worker_job.rb +10 -0
  183. data/test/jobs/delayed_job/remote_call_worker_job.rb +20 -0
  184. data/test/jobs/resque/db_worker_job.rb +29 -0
  185. data/test/jobs/resque/error_worker_job.rb +10 -0
  186. data/test/jobs/resque/remote_call_worker_job.rb +20 -0
  187. data/test/jobs/sidekiq/db_worker_job.rb +29 -0
  188. data/test/jobs/sidekiq/error_worker_job.rb +10 -0
  189. data/test/jobs/sidekiq/remote_call_worker_job.rb +20 -0
  190. data/test/minitest_helper.rb +276 -0
  191. data/test/mocked/curb_mocked_test.rb +311 -0
  192. data/test/mocked/excon_mocked_test.rb +166 -0
  193. data/test/mocked/faraday_mocked_test.rb +93 -0
  194. data/test/mocked/http_mocked_test.rb +129 -0
  195. data/test/mocked/httpclient_mocked_test.rb +245 -0
  196. data/test/mocked/rest_client_mocked_test.rb +103 -0
  197. data/test/mocked/typhoeus_mocked_test.rb +192 -0
  198. data/test/models/widget.rb +36 -0
  199. data/test/profiling/legacy_method_profiling_test.rb +201 -0
  200. data/test/profiling/method_profiling_test.rb +631 -0
  201. data/test/queues/delayed_job-client_test.rb +95 -0
  202. data/test/queues/delayed_job-worker_test.rb +91 -0
  203. data/test/reporter/reporter_test.rb +14 -0
  204. data/test/servers/delayed_job.rb +107 -0
  205. data/test/servers/rackapp_8101.rb +29 -0
  206. data/test/servers/rails3x_8140.rb +96 -0
  207. data/test/servers/rails4x_8140.rb +96 -0
  208. data/test/servers/rails5x_8140.rb +95 -0
  209. data/test/servers/rails5x_api_8150.rb +78 -0
  210. data/test/servers/sidekiq.rb +29 -0
  211. data/test/servers/sidekiq.yml +7 -0
  212. data/test/servers/sidekiq_initializer.rb +25 -0
  213. data/test/settings +0 -0
  214. data/test/support/auto_tracing_test.rb +50 -0
  215. data/test/support/backcompat_test.rb +276 -0
  216. data/test/support/config_test.rb +149 -0
  217. data/test/support/dnt_test.rb +98 -0
  218. data/test/support/init_report_test.rb +25 -0
  219. data/test/support/liboboe_settings_test.rb +110 -0
  220. data/test/support/logging_test.rb +130 -0
  221. data/test/support/noop_test.rb +88 -0
  222. data/test/support/sql_sanitize_test.rb +55 -0
  223. data/test/support/tracing_mode_test.rb +33 -0
  224. data/test/support/tvalias_test.rb +15 -0
  225. data/test/support/xtrace_test.rb +41 -0
  226. metadata +475 -0
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'mkmf'
5
+ require 'rbconfig'
6
+
7
+ ext_dir = File.expand_path(File.dirname(__FILE__))
8
+
9
+ # Check if we're running in JRuby
10
+ jruby = defined?(JRUBY_VERSION) ? true : false
11
+
12
+ # Set the mkmf lib paths so we have no issues linking to
13
+ # the AppOpticsAPM libs.
14
+ ao_lib = File.join(ext_dir, 'lib')
15
+ ao_include = File.join(ext_dir, 'src')
16
+
17
+ # Create symlinks for the AppOpticsAPM library
18
+ target = File.join(ao_lib, 'liboboe-1.0.so.0.0.0')
19
+ File.symlink(target, File.join(ao_lib, 'liboboe.so'))
20
+ File.symlink(target, File.join(ao_lib, 'liboboe-1.0.so.0'))
21
+
22
+ dir_config('oboe', ao_include, ao_lib)
23
+
24
+ if jruby || ENV.key?('APPOPTICS_URL')
25
+ # Build the noop extension under JRuby and Heroku.
26
+ # The oboe-heroku gem builds it's own c extension which links to
27
+ # libs specific to a Heroku dyno
28
+ # FIXME: For JRuby we need to remove the c extension entirely
29
+ create_makefile('oboe_noop', 'noop')
30
+
31
+ elsif have_library('oboe', 'oboe_config_get_revision', 'oboe.h')
32
+
33
+ $libs = append_library($libs, 'oboe')
34
+ $libs = append_library($libs, 'stdc++')
35
+
36
+ $CFLAGS << " #{ENV['CFLAGS']}"
37
+ $CPPFLAGS << " #{ENV['CPPFLAGS']}"
38
+ $LIBS << " #{ENV['LIBS']}"
39
+ $LDFLAGS << " #{ENV['LDFLAGS']} -Wl,-rpath=#{ao_lib}"
40
+
41
+ if RUBY_VERSION < '1.9'
42
+ cpp_command('g++')
43
+ $CPPFLAGS << '-I./src/'
44
+ end
45
+ create_makefile('oboe_metal', 'src')
46
+
47
+ else
48
+ if have_library('oboe')
49
+ $stderr.puts 'Error: The oboe gem requires an updated liboboe. Please update your liboboe packages.'
50
+ end
51
+
52
+ $stderr.puts 'Error: Could not find the base liboboe libraries. No tracing will occur.'
53
+ create_makefile('oboe_noop', 'noop')
54
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ #include <ruby.h>
2
+
3
+ /* ruby calls this to load the extension */
4
+ void Init_oboe_noop(void) {
5
+ /* assume we haven't yet defined Hola */
6
+ VALUE klass = rb_define_class("OboeNoop", rb_cObject);
7
+ }
@@ -0,0 +1 @@
1
+ 2.0.5
@@ -0,0 +1,221 @@
1
+ /* bson.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 _BSON_H_
19
+ #define _BSON_H_
20
+
21
+ #define MONGO_HAVE_STDINT
22
+ #include "platform_hacks.h"
23
+ #include <time.h>
24
+
25
+ MONGO_EXTERN_C_START
26
+
27
+ typedef enum {
28
+ bson_error=-1,
29
+ bson_eoo=0,
30
+ bson_double=1,
31
+ bson_string=2,
32
+ bson_object=3,
33
+ bson_array=4,
34
+ bson_bindata=5,
35
+ bson_undefined=6,
36
+ bson_oid=7,
37
+ bson_bool=8,
38
+ bson_date=9,
39
+ bson_null=10,
40
+ bson_regex=11,
41
+ bson_dbref=12, /* deprecated */
42
+ bson_code=13,
43
+ bson_symbol=14,
44
+ bson_codewscope=15,
45
+ bson_int = 16,
46
+ bson_timestamp = 17,
47
+ bson_long = 18
48
+ } bson_type;
49
+
50
+ typedef int bson_bool_t;
51
+
52
+ typedef struct {
53
+ char * data;
54
+ bson_bool_t owned;
55
+ } bson;
56
+
57
+ typedef struct {
58
+ const char * cur;
59
+ bson_bool_t first;
60
+ } bson_iterator;
61
+
62
+ typedef struct {
63
+ char * buf;
64
+ char * cur;
65
+ int bufSize;
66
+ bson_bool_t finished;
67
+ int stack[32];
68
+ int stackPos;
69
+ } bson_buffer;
70
+
71
+ #pragma pack(1)
72
+ typedef union{
73
+ char bytes[12];
74
+ int ints[3];
75
+ } bson_oid_t;
76
+ #pragma pack()
77
+
78
+ typedef int64_t bson_date_t; /* milliseconds since epoch UTC */
79
+
80
+ /* ----------------------------
81
+ READING
82
+ ------------------------------ */
83
+
84
+
85
+ bson * bson_empty(bson * obj); /* returns pointer to static empty bson object */
86
+ int bson_copy(bson* out, const bson* in); /* puts data in new buffer. NOOP if out==NULL */
87
+ bson * bson_from_buffer(bson * b, bson_buffer * buf);
88
+ bson * bson_init( bson * b , char * data , bson_bool_t mine );
89
+ bson * bson_init_safe( bson * b , char * data , bson_bool_t mine , size_t buflen);
90
+ int bson_size(const bson * b );
91
+ void bson_destroy( bson * b );
92
+
93
+ void bson_print( bson * b );
94
+ void bson_print_raw( const char * bson , int depth );
95
+
96
+ /* advances iterator to named field */
97
+ /* returns bson_eoo (which is false) if field not found */
98
+ bson_type bson_find(bson_iterator* it, const bson* obj, const char* name);
99
+
100
+ void bson_iterator_init( bson_iterator * i , const char * bson );
101
+
102
+ /* more returns true for eoo. best to loop with bson_iterator_next(&it) */
103
+ bson_bool_t bson_iterator_more( const bson_iterator * i );
104
+ bson_type bson_iterator_next( bson_iterator * i );
105
+
106
+ bson_type bson_iterator_type( const bson_iterator * i );
107
+ const char * bson_iterator_key( const bson_iterator * i );
108
+ const char * bson_iterator_value( const bson_iterator * i );
109
+
110
+ /* these convert to the right type (return 0 if non-numeric) */
111
+ double bson_iterator_double( const bson_iterator * i );
112
+ int bson_iterator_int( const bson_iterator * i );
113
+ int64_t bson_iterator_long( const bson_iterator * i );
114
+
115
+ /* false: boolean false, 0 in any type, or null */
116
+ /* true: anything else (even empty strings and objects) */
117
+ bson_bool_t bson_iterator_bool( const bson_iterator * i );
118
+
119
+ /* these assume you are using the right type */
120
+ double bson_iterator_double_raw( const bson_iterator * i );
121
+ int bson_iterator_int_raw( const bson_iterator * i );
122
+ int64_t bson_iterator_long_raw( const bson_iterator * i );
123
+ bson_bool_t bson_iterator_bool_raw( const bson_iterator * i );
124
+ bson_oid_t* bson_iterator_oid( const bson_iterator * i );
125
+
126
+ /* these can also be used with bson_code and bson_symbol*/
127
+ const char * bson_iterator_string( const bson_iterator * i );
128
+ int bson_iterator_string_len( const bson_iterator * i );
129
+
130
+ /* works with bson_code, bson_codewscope, and bson_string */
131
+ /* returns NULL for everything else */
132
+ const char * bson_iterator_code(const bson_iterator * i);
133
+
134
+ /* calls bson_empty on scope if not a bson_codewscope */
135
+ void bson_iterator_code_scope(const bson_iterator * i, bson * scope);
136
+
137
+ /* both of these only work with bson_date */
138
+ bson_date_t bson_iterator_date(const bson_iterator * i);
139
+ time_t bson_iterator_time_t(const bson_iterator * i);
140
+
141
+ int bson_iterator_bin_len( const bson_iterator * i );
142
+ char bson_iterator_bin_type( const bson_iterator * i );
143
+ const char * bson_iterator_bin_data( const bson_iterator * i );
144
+
145
+ const char * bson_iterator_regex( const bson_iterator * i );
146
+ const char * bson_iterator_regex_opts( const bson_iterator * i );
147
+
148
+ /* these work with bson_object and bson_array */
149
+ void bson_iterator_subobject(const bson_iterator * i, bson * sub);
150
+ void bson_iterator_subiterator(const bson_iterator * i, bson_iterator * sub);
151
+
152
+ /* str must be at least 24 hex chars + null byte */
153
+ void bson_oid_from_string(bson_oid_t* oid, const char* str);
154
+ void bson_oid_to_string(const bson_oid_t* oid, char* str);
155
+ void bson_oid_gen(bson_oid_t* oid);
156
+
157
+ time_t bson_oid_generated_time(bson_oid_t* oid); /* Gives the time the OID was created */
158
+
159
+ /* ----------------------------
160
+ BUILDING
161
+ ------------------------------ */
162
+
163
+ bson_buffer * bson_buffer_init( bson_buffer * b );
164
+ bson_buffer * bson_ensure_space( bson_buffer * b , const int bytesNeeded );
165
+
166
+ /**
167
+ * @return the raw data. you either should free this OR call bson_destroy not both
168
+ */
169
+ char * bson_buffer_finish( bson_buffer * b );
170
+ void bson_buffer_destroy( bson_buffer * b );
171
+
172
+ bson_buffer * bson_append_oid( bson_buffer * b , const char * name , const bson_oid_t* oid );
173
+ bson_buffer * bson_append_new_oid( bson_buffer * b , const char * name );
174
+ bson_buffer * bson_append_int( bson_buffer * b , const char * name , const int i );
175
+ bson_buffer * bson_append_long( bson_buffer * b , const char * name , const int64_t i );
176
+ bson_buffer * bson_append_double( bson_buffer * b , const char * name , const double d );
177
+ bson_buffer * bson_append_string( bson_buffer * b , const char * name , const char * str );
178
+ bson_buffer * bson_append_symbol( bson_buffer * b , const char * name , const char * str );
179
+ bson_buffer * bson_append_code( bson_buffer * b , const char * name , const char * str );
180
+ bson_buffer * bson_append_code_w_scope( bson_buffer * b , const char * name , const char * code , const bson * scope);
181
+ bson_buffer * bson_append_binary( bson_buffer * b, const char * name, char type, const char * str, int len );
182
+ bson_buffer * bson_append_bool( bson_buffer * b , const char * name , const bson_bool_t v );
183
+ bson_buffer * bson_append_null( bson_buffer * b , const char * name );
184
+ bson_buffer * bson_append_undefined( bson_buffer * b , const char * name );
185
+ bson_buffer * bson_append_regex( bson_buffer * b , const char * name , const char * pattern, const char * opts );
186
+ bson_buffer * bson_append_bson( bson_buffer * b , const char * name , const bson* bson);
187
+ bson_buffer * bson_append_element( bson_buffer * b, const char * name_or_null, const bson_iterator* elem);
188
+
189
+ /* these both append a bson_date */
190
+ bson_buffer * bson_append_date(bson_buffer * b, const char * name, bson_date_t millis);
191
+ bson_buffer * bson_append_time_t(bson_buffer * b, const char * name, time_t secs);
192
+
193
+ bson_buffer * bson_append_start_object( bson_buffer * b , const char * name );
194
+ bson_buffer * bson_append_start_array( bson_buffer * b , const char * name );
195
+ bson_buffer * bson_append_finish_object( bson_buffer * b );
196
+
197
+ void bson_numstr(char* str, int i);
198
+ void bson_incnumstr(char* str);
199
+
200
+
201
+ /* ------------------------------
202
+ ERROR HANDLING - also used in mongo code
203
+ ------------------------------ */
204
+
205
+ void * bson_malloc(int size); /* checks return value */
206
+
207
+ /* bson_err_handlers shouldn't return!!! */
208
+ typedef void(*bson_err_handler)(const char* errmsg);
209
+
210
+ /* returns old handler or NULL */
211
+ /* default handler prints error then exits with failure*/
212
+ bson_err_handler set_bson_err_handler(bson_err_handler func);
213
+
214
+
215
+
216
+ /* does nothing is ok != 0 */
217
+ void bson_fatal( int ok );
218
+ int bson_fatal_msg( int ok, const char* msg );
219
+
220
+ MONGO_EXTERN_C_END
221
+ #endif
@@ -0,0 +1,91 @@
1
+ /* platform_hacks.h */
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
+ /* all platform-specific ifdefs should go here */
19
+
20
+ #ifndef _PLATFORM_HACKS_H_
21
+ #define _PLATFORM_HACKS_H_
22
+
23
+ #ifdef __GNUC__
24
+ #define MONGO_INLINE static __inline__
25
+ #else
26
+ #define MONGO_INLINE static
27
+ #endif
28
+
29
+ #ifdef __cplusplus
30
+ #define MONGO_EXTERN_C_START extern "C" {
31
+ #define MONGO_EXTERN_C_END }
32
+ #else
33
+ #define MONGO_EXTERN_C_START
34
+ #define MONGO_EXTERN_C_END
35
+ #endif
36
+
37
+
38
+ #if defined(MONGO_HAVE_STDINT) || __STDC_VERSION__ >= 199901L
39
+ #include <stdint.h>
40
+ #elif defined(MONGO_HAVE_UNISTD)
41
+ #include <unistd.h>
42
+ #elif defined(MONGO_USE__INT64)
43
+ typedef __int64 int64_t;
44
+ #elif defined(MONGO_USE_LONG_LONG_INT)
45
+ typedef long long int int64_t;
46
+ #else
47
+ #error must have a 64bit int type
48
+ #endif
49
+
50
+ /* big endian is only used for OID generation. little is used everywhere else */
51
+ #ifdef MONGO_BIG_ENDIAN
52
+ #define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
53
+ #define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
54
+ #define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
55
+ #define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
56
+ #else
57
+ #define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
58
+ #define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
59
+ #define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
60
+ #define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
61
+ #endif
62
+
63
+ MONGO_EXTERN_C_START
64
+
65
+ MONGO_INLINE void bson_swap_endian64(void* outp, const void* inp){
66
+ const char *in = (const char*)inp;
67
+ char *out = (char*)outp;
68
+
69
+ out[0] = in[7];
70
+ out[1] = in[6];
71
+ out[2] = in[5];
72
+ out[3] = in[4];
73
+ out[4] = in[3];
74
+ out[5] = in[2];
75
+ out[6] = in[1];
76
+ out[7] = in[0];
77
+
78
+ }
79
+ MONGO_INLINE void bson_swap_endian32(void* outp, const void* inp){
80
+ const char *in = (const char*)inp;
81
+ char *out = (char*)outp;
82
+
83
+ out[0] = in[3];
84
+ out[1] = in[2];
85
+ out[2] = in[1];
86
+ out[3] = in[0];
87
+ }
88
+
89
+ MONGO_EXTERN_C_END
90
+
91
+ #endif