CQLSÍ - Cassandra Query Language Simple Interface (SÍ és per l'afirmació Sí, en Català).
Introduït a Catalonia Framework v.1.1.014 pot ser usat amb el Framework o amb el paquet mínim CQLSÍ
CQLSÍ és una interfície simple, un wrapper, per a treballar amb CQL des de PHP sense Thrift.
Després de molts problemes amb Thrift, fails intentant diferent solucions de codi de tercers i compilant existents incompilables drivers PDO, i Thrift essent declarat obsolet per DataStax en favor de CQL per a Cassandra 1.2 i 2.0, etc... vaig decidir crear una manera simple, sense dolor, per a comunicar-me amb CQL mentre un mecanisme millor no aparegui en escena.
Bàsicament CQLSÍ executa cqlsh des de bash, captura la sortida i proporciona les dades a la capa d'abstracció de la classe Db del Catalonia Framework, així que passar de MySqli a Cassandra implica només canviar l'arxiu de configuració per a que usi Db::TYPE_CONNECTION_CASSANDRA_CQLSI en comptes de Db::TYPE_CONNECTION_MYSQLI o Db::TYPE_CONNECTION_POSTGRE
DESCRIBE KEYSPACES;Useu enlloc d'això:
SELECT * FROM system.schema_keyspaces;
$s_cql_long_query = ''; for ($i_userid=3000;$i_userid<4000;$i_userid++) { $s_cql_long_query .= "INSERT INTO users (user_id, fname, lname, longtext) VALUES ( ".$i_userid.", 'Carles', 'X', 'whatever');"; } $o_db_cassandra->queryWrite($s_cql_long_query);Aquest codi crea 1.000 inserts, en el meu modest i ocupat portàtil comporta 2,9599 segons de processar aquests inserts. Això inclou tot el temps, o sigui el cost d'execució de cqlsh, el temps d'establir la connexió, el temps de processar el cql per part de Cassandra i fer les 1.000 inserts i el temps de tancar la connexió, parsejar el resultat i ensamblar la capa d'abstracció a l'array de dades.
CQLSÍ no requereix d'instal·lar res, simplement necessiteu tenir el client cqlsh instal·lat al sistema.
Això és fet típicament per a Ubuntu/Debian així:
Editar /etc/apt/sources.list i afegir:deb http://debian.datastax.com/community stable main
Com es descriu a http://www.datastax.com/docs/1.0/install/install_deb
Afegir la key:
curl -L http://debian.datastax.com/debian/repo_key | sudo apt-key add -
Llavors instal·lar la clau cqlsh i si voleu Cassandra (però no necessiteu que corri al webserver)
sudo apt-get update sudo apt-get install python-cql=1.0.10-1 sudo apt-get install dsc=1.0.10 cassandra=1.0.10
Mireu si hi ha actualitzacions, per si una nova versió ha estat alliberada:
sudo apt-get upgrade
Look for upgrades, just in case a new version has been releases:
sudo apt-get upgradeUbuntu a Amazon EC2 retornarà: The following packages have been kept back, indicant que cassandra no s'ha actualitzat.
sudo apt-get install cassandraSi Cassandra fallà en arrencar després d'actualitzar, probablement té un probleme amb els logs de la versió antiga.
root@ip-10-10-10-10:/var/lib/cassandra/commitlog# mkdir old_logs root@ip-10-10-10-10:/var/lib/cassandra/commitlog# mv *.log old_logs/ root@ip-10-10-10-10:/var/lib/cassandra/commitlog# service cassandra startPrengueu en consideració que la versió de cqlsh ha de la 4.1.0 com a mínim per a funcionar amb CQLSÍ.
Probablement el vostre sistema no permet a l'usuari del webserver (www-data) crear l'arxiu d'history. Això ho necessita bash, segurament haureu de fer:
sudo mkdir /var/www/.cassandra sudo chmod 777 /var/www/.cassandraO similar, de manaera que bash pugui crear l'arxiu history.
$st_other_config1['database'] = Array( 'read' => Array( 'servers' => Array(0 => Array('connection_type' => Db::TYPE_CONNECTION_CASSANDRA_CQLSI, 'connection_method' => Db::CONNECTION_METHOD_TCPIP, 'server_hostname' => '127.0.0.1', 'server_port' => Db::PORT_DEFAULT_CASSANDRA, 'username' => 'www_cassandra', 'password' => 'yourpassword', 'database' => 'mykeyspace', 'client_encoding' => 'utf8' ) ) ), 'write' => Array( 'servers' => Array(0 => Array('connection_type' => Db::TYPE_CONNECTION_CASSANDRA_CQLSI, 'connection_method' => Db::CONNECTION_METHOD_TCPIP, 'server_hostname' => '127.0.0.1', 'server_port' => Db::PORT_DEFAULT_CASSANDRA, 'username' => 'www_cassandra', 'password' => 'yourpassword', 'database' => 'mykeyspace', 'client_encoding' => 'utf8' ) ) ) ); $o_db_cassandra = new Db($st_other_config1['database']); $s_cql = "INSERT INTO users (user_id, fname, lname, longtext) VALUES ( 1714, 'Carles', 'Mateo', 'whatever...');"; $st_result = $o_db_cassandra->queryWrite( $s_cql);Podeu canviar de keyspace per a les següents consultes:
$o_db->setDatabaseOrKeyspace('cataloniasample', Db::CONNECTION_READ); $o_db->setDatabaseOrKeyspace('cataloniasample', Db::CONNECTION_WRITE);No es recomana, però es permet treballar amb un namespace diferent per a lectures i escriptures.
$i_user_id = prepareInsert($i_user_id, self::DATA_TYPE_INT, self::TYPE_CONNECTION_CASSANDRA_CQLSI); $s_fname = prepareInsert($s_fname, self::DATA_TYPE_STRING, self::TYPE_CONNECTION_CASSANDRA_CQLSI); $s_lname = prepareInsert($s_lname, self::DATA_TYPE_STRING, self::TYPE_CONNECTION_CASSANDRA_CQLSI); $s_longtext = prepareInsert($s_longtext, self::DATA_TYPE_STRING, self::TYPE_CONNECTION_CASSANDRA_CQLSI); $s_cql = "INSERT INTO users (user_id, fname, lname, longtext) VALUES ( $i_user_id, '$s_fname', '$s_lname', '$s_longtext');"; $st_result = $o_db_cassandra->queryWrite($s_cql);
$st_results = $o_db_cassandra->queryRead('SELECT * FROM users LIMIT 10;'); $i_row_num = 0; $s_first_data = ''; if ($st_results['result']['status'] == Db::QUERY_RESULT_STATUS_EXECUTED && $st_results['result']['error'] == 0) { echo '<table border="1">'; foreach($st_results['data'] as $i_row=>$st_data) { $i_row_num++; echo '<tr>'; foreach($st_data as $s_key => $s_value) { if ($i_row_num == 1) { // Write headers echo '<th>'.$s_key.'</th>'; $s_first_data .= '<td>'.$s_value.'</td>'; } else { echo '<td>'.$s_value.'</td>'; } } echo '</tr>'; if ($i_row_num == 1) { echo '<tr>'.$s_first_data.'</tr>'; } } echo '</table>'; } else { echo 'Error: '.$st_results['result']['error_description']; }Aquest codi a init/bootstrap.php produeix aquesta sortida:
$s_cql = "CREATE TABLE IF NOT EXISTS test (userid int, firstname text, lastname text, tele set<text>, emails set<text>, skills list<text>, todos map<timestamp,text>, PRIMARY KEY (userid) );"; $o_db_cassandra->setKeepCqlFiles(true); $st_result = $o_db_cassandra->queryWrite($s_cql);