<% var hex_chr = "0123456789abcdef"; // http://localhost/gedcom/gedcom.1?obj=http%3A%2F%2Fwww.alternation.net%2Fged2foaf%2FI0147.xml%23I0147 output=[]; output2=[]; RS = Server.CreateObject("ADODB.Recordset"); obj=(Request.QueryString('obj')+'').replace(new RegExp("'","gim"),"-"); //' RSC=new ActiveXObject("ADODB.Connection"); RSC.Open("rdf"); Type="http://jibbering.com/foaf/jim.rdf#Unknown" Name="Unknown" if (obj=='undefined' || obj=='') { obj="http://www.alternation.net/ged2foaf/I0147.xml#I0147"; } sqlstr="select obj from gedcom3 where subj='"+obj+"' and pred='http://www.w3.org/1999/02/22-rdf-syntax-ns#type' limit 1"; RS.Open(sqlstr,RSC); if (!RS.EOF) { Type=RS.Fields(0).Value; } sqlstr="select obj from gedcom3 where subj='"+obj+"' and (pred='http://xmlns.com/foaf/0.1/name' or pred='http://www.w3.org/2000/01/rdf-schema#Label') limit 1"; try { RS.Close() } catch (E) {}; RS.Open(sqlstr,RSC); if (!RS.EOF) { Name=RS.Fields(0).Value; } if (Type=="http://xmlns.com/foaf/0.1/Group") { // It's a Family queryObj=obj; query2="subj"; query1="obj"; pred="member"; otherType="http://xmlns.com/foaf/0.1/Person" start=""; end=""; } else { // It's a Person queryObj=obj; query2="obj"; query1="subj"; pred="member"; start=""; otherType="http://xmlns.com/foaf/0.1/Group"; end=""; } sqlstr="select distinct "+query1+",pred from gedcom3 where "+query2+"='"+queryObj+"' and pred='http://xmlns.com/foaf/0.1/"+pred+"'"; try { RS.Close() } catch (E) {}; RS.Open(sqlstr,RSC); if (!RS.EOF) { objects=RS.getRows().toArray(); var objL=objects.length/2; for (i=0;i'); output2.push(''); objects.splice(0,2); } } sqlstr="select distinct obj,pred from gedcom3 where subj='"+queryObj+"' and pred like 'http://purl.org/vocab/relationship/%'"; try { RS.Close() } catch (E) {}; RS.Open(sqlstr,RSC); if (!RS.EOF) { objects=RS.getRows().toArray(); var objL=objects.length/2; for (i=0;i'); output2.push(''); objects.splice(0,2); } } if (Type=="http://xmlns.com/foaf/0.1/Group") { output.push('Family'); output2.push('Family'); } else { sqlstr="select obj from gedcom3 where subj='"+obj+"' and pred='http://xmlns.com/foaf/0.1/gender' limit 1"; try { RS.Close() } catch (E) {}; RS.Open(sqlstr,RSC); if (!RS.EOF) { gender=RS.Fields(0).Value.toLowerCase(); if (gender=="male") { start=""; end=""; } if (gender=="female") { start=""; end=""; } } } Response.ContentType="text/html"; out=['',start]; out2=['',start]; out.push(''+obj+''); out2.push(''+calcSHA1(obj)+''); out.push(''+Name+''); out.push(output.join('')); out.push(end); out.push(''); out2.push(''+Name+''); out2.push(output2.join('')); out2.push(end); out2.push(''); fso=Server.CreateObject("Scripting.FileSystemObject"); f=fso.createTextFile(Server.MapPath(".")+"\\cache\\"+calcSHA1(obj)); f.WriteLine(out2.join('')); f.close(); Response.Write(out.join('')); function hex(num) { var str = ""; for(var j = 7; j >= 0; j--) str += hex_chr.charAt((num >> (j * 4)) & 0x0F); return str; } /* * Convert a string to a sequence of 16-word blocks, stored as an array. * Append padding bits and the length, as described in the SHA1 standard. */ function str2blks_SHA1(str) { var nblk = ((str.length + 8) >> 6) + 1; var blks = new Array(nblk * 16); for(var i = 0; i < nblk * 16; i++) blks[i] = 0; for(var i = 0; i < str.length; i++) blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8); blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8); blks[nblk * 16 - 1] = str.length * 8; return blks; } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left */ function rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } /* * Perform the appropriate triplet combination function for the current * iteration */ function ft(t, b, c, d) { if(t < 20) return (b & c) | ((~b) & d); if(t < 40) return b ^ c ^ d; if(t < 60) return (b & c) | (b & d) | (c & d); return b ^ c ^ d; } /* * Determine the appropriate additive constant for the current iteration */ function kt(t) { return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; } /* * Take a string and return the hex representation of its SHA-1. */ function calcSHA1(str) { var x = str2blks_SHA1(str); var w = new Array(80); var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e; for(var j = 0; j < 80; j++) { if(j < 16) w[j] = x[i + j]; else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); var t = safe_add(safe_add(rol(a, 5), ft(j, b, c, d)), safe_add(safe_add(e, w[j]), kt(j))); e = d; d = c; c = rol(b, 30); b = a; a = t; } a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); e = safe_add(e, olde); } return hex(a) + hex(b) + hex(c) + hex(d) + hex(e); } %>