-
Notifications
You must be signed in to change notification settings - Fork 331
/
yql.js
133 lines (118 loc) · 3.97 KB
/
yql.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
YUI.add('yql', function(Y) {
//Global storage for the callbacks
if (!YUI.yql) {
YUI.yql = {};
}
/**
* This class adds a sugar class to allow access to YQL (http://developer.yahoo.com/yql/).
* @module yql
*/
/**
* This class adds a sugar class to allow access to YQL (http://developer.yahoo.com/yql/).
* @class yql
* @extends Event.Target
* @constructor
* @param {String} sql The SQL statement to execute
* @param {Function} callback The callback to execute after the query (optional).
* @param {Object} params An object literal of extra parameters to pass along (optional).
* @param {Object} opts An object literal of extra options to pass along to the Get Utility (optional).
*/
var BASE_URL = 'http:/'+'/query.yahooapis.com/v1/public/yql?',
yql = function (sql, callback, params, opts) {
yql.superclass.constructor.apply(this);
this._query(sql, callback, params, opts);
};
Y.extend(yql, Y.EventTarget, {
/**
* @private
* @property _cb
* @description The callback method
*/
_cb: null,
/**
* @private
* @property _stamp
* @description The method name on the Global YUI object we use as the callback.
*/
_stamp: null,
/**
* @private
* @method _receiver
* @description The global callback that get's called from Get.
* @param {Object} q The JSON object from YQL.
*/
_receiver: function(q) {
if (q.query) {
this.fire('query', q.query);
}
if (q.error) {
this.fire('error', q.error);
}
if (this._cb) {
this._cb(q);
}
delete YUI.yql[this._stamp];
},
/**
* @private
* @method _query
* @description Builds the query and fire the Get call.
* @param {String} sql The SQL statement to execute
* @param {Function} callback The callback to execute after the query (optional).
* @param {Object} params An object literal of extra parameters to pass along (optional).
* @param {Object} opts An object literal of extra options to pass along to the Get Utility (optional).
* @return Self
*/
_query: function(sql, callback, params, opts) {
var st = Y.stamp({}), qs = '', url;
//Must replace the dashes with underscrores
st = st.replace(/-/g, '_');
this._stamp = st;
this._cb = callback;
YUI.yql[st] = Y.bind(this._receiver, this);
if (!params) {
params = {};
}
params.q = sql;
params.format = 'json';
params.callback = "YUI.yql." + st;
if (!params.env) {
params.env = 'http:/'+'/datatables.org/alltables.env';
}
Y.each(params, function(v, k) {
qs += k + '=' + encodeURIComponent(v) + '&';
});
if (!opts) {
opts = {};
}
opts.autopurge = true;
opts.context = this;
opts.onTimeout = function(o){
this.fire('timeout', o);
if (this._cb) {
this._cb(o);
this._cb = null;
}
};
url = BASE_URL + qs;
Y.Get.script(url, opts);
return this;
}
});
/**
* @event query
* @description Fires when the Query returns.
* @type {Event.Custom}
*/
/**
* @event error
* @description Fires when an error occurs.
* @type {Event.Custom}
*/
/**
* @event timeout
* @description Fires when the request has timed-out.
* @type {Event.Custom}
*/
Y.yql = yql;
}, '@VERSION@' ,{requires:['get', 'event-custom'], supersedes:['get', 'event-custom']});