Пользовательские функции AlaSQL с параметрами - PullRequest
0 голосов
/ 11 октября 2018

Я новичок в AlaSQL:

alasql('CREATE TABLE cnames(domain STRING, cname STRING)');
alasql('CREATE TABLE domains(domain STRING, ip_addr STRING)');

alasql('INSERT INTO domains VALUES ("fred.com.au","192.168.0.1")');
alasql('INSERT INTO cnames VALUES ("www.fred.com.au","fred.com.au")');
alasql('INSERT INTO cnames VALUES ("mail.fred.com.au","www.fred.com.au")');

alasql.fn.getCname = function(domainName) {
  console.log('domainName ', domainName);
    return alasql('SELECT cname FROM cnames WHERE domain = ?',[domainName]);

}

var res = alasql('SELECT * FROM cnames WHERE getCname("www.fred.com.au")');    
document.getElementById('res').textContent = JSON.stringify(res);

У меня есть JSFiddle из вышеперечисленного: https://jsfiddle.net/u4drqxaw/

У меня возникли следующие проблемы:

1) Я понимаю, что я делаю что-то не так, поскольку моя getCname функция вызывается дважды из-за моего SELECT * FROM cnames WHERE getCname("www.fred.com.au")

В alaSQL, как я могу просто вызвать мою функцию alasql.fn.getCname с параметром,то есть что-то вроде:

var res = alasql('getCname("www.fred.com.au")');

2) Как только у меня есть решение для моего Q1, как я могу ссылаться на параметр, переданный в функцию, чтобы я мог использовать его в запросе, то есть [domainName]?

Конечным результатом является то, что я хочу иметь возможность вызывать мою пользовательскую функцию alaSQL с параметром www.fred.com.au, которая, в свою очередь, должна просто вернуть мне одну запись из моей таблицы cnames для этого значения cnames.domain.

1 Ответ

0 голосов
/ 12 октября 2018

Мне удалось это сделать, и я обновил мой JSFiddle, чтобы отразить мое требуемое решение.

См. Здесь:

alasql('CREATE TABLE cnames(domain STRING, cname STRING)');
alasql('CREATE TABLE domains(domain STRING, ip_addr STRING)');

alasql('INSERT INTO domains VALUES ("fred.com.au","192.168.0.1")');
alasql('INSERT INTO domains VALUES ("barney.com.au","192.168.2.3")');
alasql('INSERT INTO domains VALUES ("mail1.fred.com.au","192.168.9.9")');
alasql('INSERT INTO cnames VALUES ("www.fred.com.au","fred.com.au")');
alasql('INSERT INTO cnames VALUES ("mail.fred.com.au","www.fred.com.au")');
alasql('INSERT INTO cnames VALUES ("fred.com.au","barney.com.au")');

alasql.fn.getCname = function(domainName) {
    return alasql('SELECT cname FROM cnames WHERE domain = ?',[domainName]);  
}

alasql.fn.processCname = function(cnameVal) {
    return alasql('SELECT getCname(?) [cname]',[cnameVal]);
}

alasql.fn.domainInfo = function(theDomain, theCname) {
    return alasql('SELECT domain, ip_addr, "'+theCname+'" [cname] FROM domains WHERE domain = ?',[theDomain]);  
}

let rec = alasql('SELECT getCname("mail.fred.com.au") [cname]');
let initialLength = rec[0]["cname"].length;

if (initialLength > 0) {
  let cnameValue = rec[0]["cname"][0].cname;
  let found = true;
  while (found) { 
    rec = alasql('SELECT getCname(?) [cname]',[cnameValue]);
    let recLength = rec[0]["cname"].length;
    if (recLength > 0) {
      cnameValue = rec[0]["cname"][0].cname;
    } else {
      found = false;
    }
  }

    let res = alasql('SELECT domainInfo(?,?) [result]',[cnameValue,cnameValue]);
    document.getElementById('res').textContent = JSON.stringify(res);
} else {
        let res = alasql('SELECT domainInfo("mail.fred.com.au", "") [result]');
        document.getElementById('res').textContent = JSON.stringify(res);
}

Решение JSFiddle

...