73 lines
2.0 KiB
Ruby
Executable File
73 lines
2.0 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# encoding: UTF-8
|
|
|
|
# --
|
|
# Copyright (C) 2008-2010 10gen Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ++
|
|
|
|
require 'rubygems'
|
|
require 'bson'
|
|
|
|
# We don't use YAJL because we need to specify the class
|
|
# to store the JSON object in. BSON is ordered so we need BSON::OrderedHash
|
|
#
|
|
# We use json/pure because json/ext is broken with BSON::OrderedHash
|
|
# (probably for the same reasons that we can't use YAJL).
|
|
#
|
|
# Note that, at the moment, this will not properly round-trip
|
|
# in all cases from the output generated by b2json.
|
|
begin
|
|
require 'json/pure' # broken with 'json/ext'
|
|
rescue LoadError
|
|
puts "This script requires json/pure. Please install one of the following:"
|
|
puts " gem install json_pure"
|
|
puts " gem install json"
|
|
Process.exit
|
|
end
|
|
|
|
# Convert all JSON objects in an IO into BSON.
|
|
def print_j2bson(io)
|
|
io.each_line do |line|
|
|
jsonobj = JSON.parse(line, { :object_class => BSON::OrderedHash } )
|
|
bsonobj = BSON.serialize(jsonobj)
|
|
STDOUT << bsonobj.to_s
|
|
end
|
|
end
|
|
|
|
# print usage
|
|
def usage()
|
|
STDERR << <<END_OF_USAGE
|
|
usage: j2bson [-h] [file1 [file2]]
|
|
|
|
Converts a JSON file to BSON on STDOUT.
|
|
You can pass multiple filenames.
|
|
If no filenames are passed, then STDIN is consumed.
|
|
|
|
END_OF_USAGE
|
|
exit
|
|
end
|
|
|
|
# no arg, use STDIN
|
|
# -h, print usage and exit
|
|
# otherwise loop of filenames
|
|
if ARGV.empty? then
|
|
print_j2bson(STDIN)
|
|
exit
|
|
elsif ARGV[0] == "-h" then
|
|
usage()
|
|
else
|
|
ARGV.each { |fname| print_j2bson(File.new(fname)) }
|
|
end
|