Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.s3.getBucket
on getBucket (name, adrtable, flmessages=false) { <<Changes <<5/5/07; 11:10:55 AM by DW <<If the name has a /, treat everything after the first / as a "prefix" following the docs for "GET" on the Amazon website. This allows you to get a list of all the files in a sub-bucket, very handy . <<http://docs.amazonwebservices.com/AmazonS3/2006-03-01/ <<5/3/07; 5:59:40 PM by DW <<Add flmessages optional parameter. <<4/11/06; 6:31:11 PM by DW <<Created. Fill a table with information about all the objects in the bucket. local (params); new (tabletype, @params); params.["max-keys"] = 50; //1000 bundle { //5/5/07 by DW if name beginswith "/" { name = string.delete (name, 1, 1)}; if name contains "/" { local (ix = string.patternmatch ("/", name)); params.prefix = string.mid (name, ix+1, sizeof (name)-ix-1); name = string.mid (name, 1, ix-1)}}; s3.init (); new (tabletype, adrtable); local (ct=0); loop { local (response = s3.httpClient ("GET", "/" + name, @params), i, lastkey); <<scratchpad.response = response local (adrlistbucketresult = xml.getaddress (@response.xstruct, "ListBucketResult")); local (flTruncated = xml.getvalue (adrlistbucketresult, "IsTruncated")); for i = 1 to sizeof (adrlistbucketresult^) { local (adritem = @adrlistbucketresult^ [i]); if string.nthfield (nameof (adritem^), "\t", 2) == "Contents" { local (key = xml.getvalue (adritem, "Key")); local (adrsub = @adrtable^.[key]); bundle { //show message if flmessages { msg ("s3.getBucket /" + name + "/" + key + " #" + ++ct)}}; new (tabletype, adrsub); adrsub^.size = xml.getvalue (adritem, "Size"); adrsub^.modified = date.iso8601StringToDate (xml.getvalue (adritem, "LastModified")); adrsub^.etag = s3.decodeString (xml.getvalue (adritem, "ETag")); adrsub^.storageClass = xml.getvalue (adritem, "StorageClass"); local (adrowner = xml.getaddress (adritem, "Owner")); adrsub^.ownerId = xml.getvalue (adrowner, "ID"); try { adrsub^.ownerName = xml.getvalue (adrowner, "DisplayName")} else { adrsub^.ownerName = ""}; lastkey = key}}; if not flTruncated { //we're done break}; params.marker = lastkey}; if flmessages { msg ("")}; return (true)}; bundle { //test code getBucket ("/scripting/backups/", @scratchpad.scriptingBackups, true)} <<getBucket ("scriptingImages", @scratchpad.scriptingImagesBucket, true)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.